Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   107 / 153
(#) usane válasza watt hozzászólására (») Okt 3, 2014 /
 
Köszönöm.
Átnézem. Valami csak kisül belőle
(#) Poostmaster hozzászólása Okt 8, 2014 /
 
Sziasztok
XC8-as fordítóval dolgozom.
Hogyan lehet azt megoldani, hogy egy for ciklus változója által adott értékű bitet kapcsoljak be egy porton.
Valahogy így:

for (char a=0; a<=8; a++){
PORTC[a] = 1;
};
(#) potyo válasza Poostmaster hozzászólására (») Okt 8, 2014 /
 
Errefelé volt ilyenről szó
(#) izenahogyishivnak hozzászólása Okt 17, 2014 /
 
Már nagyon régóta programozok PIC-eket, főként a PIC18 családot, többnyire megfelelt az igényeimnek, de mostanában előfordul, hogy erősebb PIC kellene. Néhány apróságot írtam már PIC24-re és PIC32-re is, de ezek nekem még újdonságok. Tanulás szempontjából nagy különbség van a 24-es és a 32-es sorozat közt? Nem igazán tudok dönteni. C-ben szoktam kódolni, de Assemblyben is meg tudom írni a programokat. A 24-es családnál még van az adatlapokban ASM, de a 32-esnél már nincs. Nem hiányzik? Kicsit bizonytalan vagyok, melyiket könnyebb, jobb tanulni.
(#) watt válasza izenahogyishivnak hozzászólására (») Okt 17, 2014 /
 
Szia! dsPIC33-at programoztam C-ben. Nem volt vele gond. A 24-ek nagyon hasonlóak, azzal se nagyon lenne. Lehet egy pár új periféria(DMA, RTCC stb), azokat meg kell érteni, vagy nem kell használni, de más gond nem nagyon van.
A 32-ők elég sok hibával készülnek, még nem használtam őket, pedig van pár db...
A hozzászólás módosítva: Okt 17, 2014
(#) AZoli válasza izenahogyishivnak hozzászólására (») Okt 17, 2014 /
 
Szia!
16 bitesekből már én is sokat programoztam, nem volt velük komoly gond.
A 24EP 33EP családban vannak nagyon izmosak, 52K RAM 120-140MHz + rengeteg periféria. Ezeket is próbáltam, itt már voltak zavaró dolgok az errata-ban, de még nem bántam meg hogy ezt választottam. Persze ez már felületszerelt.
(#) killbill válasza izenahogyishivnak hozzászólására (») Okt 17, 2014 /
 
A pic32-es az 32 bites, es nem microchip fejlesztesu processzora van, hanem MIPS. Ha a neten utananezel a MIPS m4k core-nak, akkor megtalalsz midnent az assemblyre vonatkozolag. Ezt assemblyben programozni eleg horror dolog, nem javaslom. Egyebkent igen gyors processzor. Hamar meg lehet szokni, hogy a legtermeszetesebb int valtozo is 32 bites.
(#) icserny válasza izenahogyishivnak hozzászólására (») Okt 18, 2014 /
 
Idézet:
„Tanulás szempontjából nagy különbség van a 24-es és a 32-es sorozat közt?”

Igen, nagy.

Ezért találták ki más gyártók azt, hogy a korábban kifejlesztett ARM Cortex-M3 vagy M4 termékeik mellet újabban kisebb teljesítményű és fogyasztású Cortex-M0 mikrovezérlőket is kínálnak. Így a skálázhatóság hasonló felépítésű és utasításkészletű eszközökkel megvalósítható, ugyanabban a fejlesztői környezetben és fordítóval.

A Microchip nem az ARM fősodort követi, de nála is tapasztalható hasonló tendencia a kislábszámú és kisfogyasztású PIC24FxxKA1xx, PIC24Fxx3xx illetve a kislábszámú PIC32MX1xxx/2xxx PIC32 mikrovezérlők megjelenésével. A most kezdőknek esetleg ezekkel kellene kezdeni, s akkor könnyebb volna a "nyújtózkodás" a nagyobb teljesítményű vezérlők felé...
(#) Wudoou hozzászólása Okt 18, 2014 /
 
Sziasztok!

A problémám a következő:
Hitech C-t használok 16f886 PIC. Van a microchip oldalán egy nagyon pontos delay kód, amit implementáltam a programomba.
Szépen le is fordul, simulatorral pontos, meg amúgy is...
Viszont csak akkor fordul le a programom, ameddig nem túl nagy a forráskódom.
Miután implementáltam még jó néhány dolgot bele (modbus, lcd, lcd_menu, 1wire...) azonnal televeri fordításkor hibával, miszerint overflow van.
Megírtam úgy a programot, hogy feltételes fordításokkal "ki-be tudok kapcsolgatni" programrészeket.
Ha kiveszem pl. a modbust, lefordul és jó is.
Rájöttem, hogy egy sortól akad ki a hitech, ami a delay kódban található:
  1. asm("decfsz _delayus_variable,f");

A teljes delay programot innen lehet letölteni:Delay PIC16XX
A teljes delayUs kód így néz ki:
  1. #define DelayUs(x) { \
  2.                         delayus_variable=(unsigned char)(x/DelayDivisor); \
  3.                         WaitFor1Us; } \
  4.                         asm("decfsz _delayus_variable,f"); \
  5.                         Jumpback;

A hitech C saját delay függvényét nem szeretem, mert telerakja clrwdt-vel a kódomat (disassambly-t nézve látszik).delay cause clrwdt
Szóval csatolom a hibákat, amit a hitech generál:
  1. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\main_potyo.c; 284. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x630/0x2 -> 0x318 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 256/0x2)
  2. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\main_potyo.c; 285. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x640/0x2 -> 0x320 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 256/0x12)
  3. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\main_potyo.c; 286. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x650/0x2 -> 0x328 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 256/0x22)
  4. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\main_potyo.c; 287. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x660/0x2 -> 0x330 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 256/0x32)
  5. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\lcd_with_hd44780.c; 989. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x110C/0x2 -> 0x886 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 384/0x3E)
  6. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\lcd_with_hd44780.c; 1000. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x1126/0x2 -> 0x893 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 387/0xE)
  7. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\lcd_with_hd44780.c; 348. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x1ABC/0x2 -> 0xD5E (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 473/0x3C)
  8. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\lcd_with_hd44780.c; 197. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x1BDE/0x2 -> 0xDEF (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 483/0x14)
  9. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\vdelay.c; 41. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x1BF6/0x2 -> 0xDFB (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 483/0x2C)
  10. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 178. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3AFE/0x2 -> 0x1D7F (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 537/0x2C)
  11. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 180. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3B0E/0x2 -> 0x1D87 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 537/0x3C)
  12. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 183. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3B32/0x2 -> 0x1D99 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 539/0x22)
  13. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 189. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3B56/0x2 -> 0x1DAB (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 542/0x18)
  14. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 191. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3B66/0x2 -> 0x1DB3 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 542/0x28)
  15. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 194. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3B8A/0x2 -> 0x1DC5 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 544/0xA)
  16. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 200. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3BAE/0x2 -> 0x1DD7 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 544/0x2E)
  17. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 202. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3BBE/0x2 -> 0x1DDF (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 546/0x6)
  18. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 205. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3BE2/0x2 -> 0x1DF1 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 546/0x2A)
  19. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 109. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3E32/0x2 -> 0x1F19 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 570/0x2)
  20. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 111. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3E42/0x2 -> 0x1F21 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 570/0x12)
  21. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 114. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3E56/0x2 -> 0x1F2B (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 570/0x26)
  22. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 116. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3E66/0x2 -> 0x1F33 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 570/0x36)
  23. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 123. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3E80/0x2 -> 0x1F40 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 573/0x6)
  24. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 125. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3E90/0x2 -> 0x1F48 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 573/0x16)
  25. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 128. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3EA4/0x2 -> 0x1F52 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 573/0x2A)
  26. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 130. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3EB4/0x2 -> 0x1F5A (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 573/0x3A)
  27. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 137. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3ECE/0x2 -> 0x1F67 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 575/0x6)
  28. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 139. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3EDE/0x2 -> 0x1F6F (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 575/0x16)
  29. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 142. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3EF2/0x2 -> 0x1F79 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 575/0x2A)
  30. Error   [1356] E:\Users\Nagy Sándor\Dropbox\PIC-es\PIC16F886\CSEKO_SILO_HOMERO_PROJEKT\PROBAK\CSEKO_ds_multichannel_DIN_RTU\CSEKO_ds_multichannel_DIN_V3_RTU\CSEKO_ds_multich_v1.9.3DIN_RTU_menu\1wires.c; 144. fixup overflow referencing psect bssBANK1 (0xAC) into 1 byte at 0x3F02/0x2 -> 0x1F81 (CSEKO_ds_multich_v1.9.3DIN_RTU_menu.obj 575/0x3A)

Hogyan tudnám ezt kiküszöbölni anélkül, hogy PIC-et cserélnék?
Nem lehet valahogy a hitech-et rávenni, hogy pl. ne a bank1-et rakja tele?
Már próbáltam ilyeneket:
  1. bank1 signed int atlag[ MAX_DEVICES ];

Ahol atlag egy hőmérés eredményét tároló tömb, hátha felszabadul a bank0 valamennyire, de nem.
Pedig jó néhány változót megbirizgáltam. Valaki tud segíteni?
(#) watt válasza Wudoou hozzászólására (») Okt 18, 2014 /
 
Ha egyszer várakozni akarsz, nem hót mindegy, mit csinál közben a program?
Az asm betétek C környezetben gondokat okozhatnak, ha nincs rendesen beintegrálva.
(#) Hp41C válasza Wudoou hozzászólására (») Okt 18, 2014 /
 
Próbáld meg globális változóval.
(#) Wudoou válasza Hp41C hozzászólására (») Okt 18, 2014 /
 
Elvileg a delayus_variable az globális változó.
(#) Wudoou válasza watt hozzászólására (») Okt 18, 2014 /
 
Rendesen be van, nem az a baja.
Ha kiveszem a modbus-t, vagy akátmit, akkor jó.
Az előző hozzászólásomban csatolt linkben olvasható:
Idézet:
„If _delayus_variable is not in bank 0, then the address of this symbol becomes too large for the instruction. The address needs to be masked and the bank selected in another instruction, but I assume for timing reasons, this object was always allocated to bank 0 or the common memory. As you add more code and move things around, this variable may move in or out of bank 0 triggering the issue intermittently.
(#) Wudoou válasza Wudoou hozzászólására (») Okt 18, 2014 /
 
Esetleg valami alternatíva nagyon pontos delay-re?
(#) Wudoou válasza Wudoou hozzászólására (») Okt 18, 2014 /
 
Megoldottam. Módosítottam a sort:
  1. asm("decfsz (_delayus_variable)&0ffh,f");

És gyönyörűen lefordul.
Azért köszönöm a hozzászólásokat.
(#) nagzso hozzászólása Okt 20, 2014 /
 
Sziasztok!
Lenne egy kis problémám pointer és EEPROM területén. Az EEPROM-ba írt érték 1, a kiolvasott érték is 1, de amikor kiíratom LCD-re a megjelenített érték 5. Mit ronthattam el?
  1. void main(void) {
  2. unsigned char itoa_buffer[];
  3. unsigned int device_values[];
  4. unsigned int *temp_device_values = device_values;
  5. lcd_data devices[];
  6. lcd_data *temp_devices = devices;
  7.  
  8. read_EEPROM(devices[0].address, temp_device_values, devices[0].length);
  9. itoa(itoa_buffer, device_values[1], 10);
  10. lcd_write_string(itoa_buffer);
  11.  
  12. while(1){}
  13. }
  14.  
  15. void read_EEPROM(address_16bit address, void *buffer, unsigned int length) {
  16.     unsigned char i;
  17.     unsigned char *temp = buffer;
  18.  
  19.     wait_EEPROM();
  20.     LATAbits.LATA0 = 0;
  21.     SPI_io(EEPROM_R);
  22.     SPI_io(address.high_byte);
  23.     SPI_io(address.low_byte);
  24.     for (i = 0; i < length; i++) {
  25.         *temp++ = SPI_io(DUMMY_VALUE);
  26.     }
  27.  
  28.     LATAbits.LATA0 = 1;
  29. }

Proteus ISIS-szel szimulálom, ott látom a beírt és kiolvasott értékeket, amik jók.
  1. *temp++ = SPI_io(DUMMY_VALUE); // ezt átírom erre: *temp++ = 1; //akkor 1-et olvasok ki, helyesen

Szóval nem tudom, hol keletkezik az a 0b0100 többletem.
(#) killbill válasza nagzso hozzászólására (») Okt 20, 2014 /
 
Ha egy tombnek nem adod meg a meretet, akkor az nulla hosszu lesz, hacsak nem inicializalod is. Szoval az osszes tombod 0 hosszu.
(#) nagzso válasza killbill hozzászólására (») Okt 20, 2014 /
 
Szuper köszi szépen, így működik. De most már akkor nem értem, hogy a többi tömbnél miért megy normálisan, annak ellenére, h nem adtam meg méretet. Én úgy tudtam, hogyha nem adok meg méretet, akkor ő intézi a méretet a bevitt adattól függően.
(#) killbill válasza nagzso hozzászólására (») Okt 20, 2014 /
 
Azert mukodik, mert szerencsed van. A tomboknek a memoriaban fixen foglalt helyuk van a bss vagy data szegmensben, es a tomb merete forditaskor dol el, kesobb az nem valtozik. A nulla hosszu tombok irasakod olyan memoriateruletet irsz at, ahol mas valtozo vagy esetleg a stack is lehet. Kiszamithatatlan, hogy mi tortenik ilyenkor. Ez akkor is igy van, ha csinalsz egy 0-tol kulonbozo meretu tombot es tulindexeled. A C nyelv futas kozben nem ellenorzi a tomb indexeket. Ha tulcimzed, akkor felulirod a memoria mas teruleteit. A te esetedben a tombok fuggvenyen beluli lokalis valtozok, amik a legtobb esetben a stack-en tarolodnak a fuggveny futasanak idejere. Igy te a stack-et irtad felul.
A hozzászólás módosítva: Okt 20, 2014
(#) nagzso válasza killbill hozzászólására (») Okt 20, 2014 /
 
Köszi szépen a választ, így teljesen érthető már.
(#) Wudoou hozzászólása Okt 23, 2014 /
 
Sziasztok!

Valaki írt már olyan programot, ahol figyelembe lett véve PIC indulásakor a resetet kiváltó esemény?
Pl.: soft reset esetén hogyan inicializáljunk, vagy hard reset esetén?
Pl:
  1. if(STATUSbits.nTO == 0)
  2.         {
  3. //valami
  4. }

Gondolok itt arra, hogy egy wdt miatti újrainduláskor nem kell mindent alaphelyzetbe állítani (pl.: egy kimenet állapotát).
Milyen eljárást ajánlotok erre?
(#) Hp41C válasza Wudoou hozzászólására (») Okt 23, 2014 /
 
Idézet az XC8 fordító leírásából:
Idézet:
„5.10.1.4 STATUS REGISTER PRESERVATION
The resetbits suboption of the --RUNTIME option (see 4.8.51 “--RUNTIME: Specify Runtime Environment”) preserves some of the bits in the STATUS register before being clobbered by the remainder of the runtime startup code. The state of these bits can be examined after recovering from a Reset condition to determine the cause of the Reset.
The entire STATUS register is saved to an assembly variable ___resetbits. This variable can be accessed from C code using the declaration: extern unsigned char __resetbits;
The compiler defines the assembly symbols ___powerdown and ___timeout to represent
the bit address of the Power-down and Time-out bits within the STATUS register
and can be used if required. These can be accessed from C code using the
declarations: extern bit __powerdown; extern bit __timeout;
In the above symbols, note that the C variables use two leading underscore characters,
and the assembly equivalent symbols use three. See Section 5.12.3.1 “Equivalent
Assembly Symbols” for more details of the mapping.”
(#) Wudoou válasza Hp41C hozzászólására (») Okt 23, 2014 /
 
Bár hitech-et használok, de annál is ugyanaz. Szóval ha deklarálom pl: __timeout bitet, akkor reset-kor meg tudom vizsgálni az állapotát és az eredményétől függően inicializálom a PIC-et, illetve a RAM-ot?
A hozzászólás módosítva: Okt 23, 2014
(#) Hp41C válasza Wudoou hozzászólására (») Okt 23, 2014 /
 
Nem... Ha --RUNTIME opcióval fordítasz, akkor a bevezető kód a __resetbits változóba menti a STATUS regiszter értékét a reset után. Ennek a változótnak a bitjeit kell tesztelni.
(#) killbill válasza Wudoou hozzászólására (») Okt 24, 2014 /
 
Idézet:
„Gondolok itt arra, hogy egy wdt miatti újrainduláskor nem kell mindent alaphelyzetbe állítani (pl.: egy kimenet állapotát)”
Te ebben biztos vagy? Mert szerintem a WD reset pont ugyanugy reset-eli az egesz mikrokontrollert, mint barmelyik masik reset. Legalabbis ez a vilag osszes uC-jenel igy van, felteszem, a PIC-nel is.
(#) Hp41C válasza killbill hozzászólására (») Okt 24, 2014 /
 
A PIC kontrollerek adatlapjában olvasgasd a Reset fejezetet, különös tekintettel a PCON regiszter PO, BOR illetve a STATUS regiszter TO és PD állapotbitjeire. Ezek pontosan azt szolgálják, hogy programból meg lehessen tudni a reset okát. Hogy mit miként állít be a különböző típusú reset, megtalálható ebben a fejezetben.
A hozzászólás módosítva: Okt 24, 2014
(#) killbill válasza Hp41C hozzászólására (») Okt 24, 2014 /
 
Koszonom, hogy biztattal az olvasasra (el nem hiszed, hogy mennyit kellett ezeket olvasgatnom), mert elolvastam talalomra egy PIC adatlapot (24FJ128), es igy legalabb 100% biztos vagyok benne, hogy a WD reset is pont ugyanugy reset-eli az I/O regisztereket, mint barmelyik masik reset. Mert ugyanis en kizarolag erre utaltam a post-omban, ha elolvasod figyelmesen. Es ebben nem is tevedtem. Viszont, az igaz, hogy felreertettem az eredeti kerdest, mert az arrol szolt, hogy pl. egy WD reset utan ne kelljen mindent alaphelyzetbe allitani. En ezt ugy ertettem, hogy szerinte azert nem kell, mert a WD reset nem reseteli a port regisztereket. De rajottem, hogy a kerdezo pont arra gondolt, hogy WD reset utan a program maskepp kell beallitsa a dolgokat.
(#) Wudoou válasza killbill hozzászólására (») Okt 29, 2014 /
 
így van. Az adatlapon látszik, hogy az egyes reset események miként "hatnak" a regiszterekre.
Például a PORT regiszterek minden reset eseménykor 0-ák, de más regiszterek már nem meghatározott értéket vehetnek fel, vagyis másat egy wdt resetkor és másat egy po resetkor.
Ez lett volna a kérdés.
Vagy a változók inicializálásai...
(#) killbill válasza Wudoou hozzászólására (») Okt 30, 2014 /
 
Pontosan milyen tipusu PIC-rol van szo? Mert szerintem minden reset pontosan ugyanugy hat minden regiszterre, es ezalol az egyetlen kivetel az a specialis regiszter, ami a reset okat tartalmazza. Az adatlap meg annyit ir, hogy egyes regiszterek erteke nem valtozik resetkor, es ezert bekapcsolaskor az ertekuk barmi is lehet. Magyaran, ezeket a regisztereket semmiyen reset nem allitja sehova.
(#) watt válasza killbill hozzászólására (») Okt 30, 2014 /
 
Szerintem jól látod. De pontosan elég annyit tudni, hogy a reset mitől következett be, hogy a reset okától függően eltérő módon induljon a program.
Következő: »»   107 / 153
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem