Fórum témák
- • Audiofil, High End Audio
- • Erősítő mindig és mindig
- • Vicces - mókás történetek
- • Mosogatógép hiba
- • Biciklilámpa / bringalámpa
- • Vegyes barkácsfogások
- • Számítógép hiba, de mi a probléma?
- • Hűtőgép probléma
- • Mobiltelefon 50 évig
- • LED-es világítás
- • Frekvenciaváltó
- • Arduino
- • Műhelyünk felszerelése, szerszámai
- • Erősítő építése elejétől a végéig
- • Érdekességek
- • Eredményjelző
- • Sütő javítás
- • PC hűtés fordulatszám szabályzott ventilátorral
- • LCD TV probléma
- • RC távirányítás modellekhez
- • Sárga Kazettás Piaci Nintendo (8bit)
- • Inverteres hegesztőtrafó
- • Elektromos kerékpár akkumulátorának helyettesítése
- • Analóg oszcilloszkóp javítása
- • Házilag építhető fémkereső
- • Fejhallgató erősítő
- • Ultrahangos párásító
- • Elektronikai témájú könyvek újságok
- • Akkumulátoros fúró
- • Vásárlás, hol kapható?
- • Retro számítógépek
- • Tranzisztor teszter
- • Tranzisztorok helyettesítése
- • BEKO Mosó/Szárító gép
- • Vezeték nélküli hangátvitel
- • Muzeális készülékek-alkatrészek restaurálása
- • Mobiltelefon hiba
- • Li-Ion saját akkucsomag készítése
- • FOK-GYEM TR9178 tápegység
- • Háromfázisú aggregátor
- • Autós erősítős kérdések, problémák
- • Távirányító javítás
- • VF3 - 6 végerősítő
- • Lemezjátszó beállítása, javítása
- • Padlófűtés vezérlés
- • Számítógépes áramkörszimuláló programok
- • Videoton EA-7386-s erösítő
- • Kombikazán működési hiba
- • Felajánlás, azaz ingyen elvihető
- • Suzuki Swift elektronika
- • Páraérzékelő szenzor
- • VIDEOTON RT (RA) 6380S
- • Nextion érintőképernyős HMI, UART kommunikációval
- • Hangsugárzó építés, javítás - miértek, hogyanok
- • Alternativ HE találkozó(k)
» Több friss téma
|
Fórum » PIC programozása C nyelven, C-Compiler
Köszönöm.
Átnézem. Valami csak kisül belőle
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;
};
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.
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
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.
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.
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é...
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ó:
asm("decfsz _delayus_variable,f");
A teljes delay programot innen lehet letölteni: Delay PIC16XX
A teljes delayUs kód így néz ki:
#define DelayUs(x) { \
delayus_variable=(unsigned char)(x/DelayDivisor); \
WaitFor1Us; } \
asm("decfsz _delayus_variable,f"); \
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:
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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:
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?
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.
Próbáld meg globális változóval.
Elvileg a delayus_variable az globális változó.
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. ”
Esetleg valami alternatíva nagyon pontos delay-re?
Megoldottam. Módosítottam a sort:
asm("decfsz (_delayus_variable)&0ffh,f");
És gyönyörűen lefordul.
Azért köszönöm a hozzászólásokat.
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?
void main(void) {
unsigned char itoa_buffer[];
unsigned int device_values[];
unsigned int *temp_device_values = device_values;
lcd_data devices[];
lcd_data *temp_devices = devices;
read_EEPROM(devices[0].address, temp_device_values, devices[0].length);
itoa(itoa_buffer, device_values[1], 10);
lcd_write_string(itoa_buffer);
while(1){}
}
void read_EEPROM(address_16bit address, void *buffer, unsigned int length) {
unsigned char i;
unsigned char *temp = buffer;
wait_EEPROM();
LATAbits.LATA0 = 0;
SPI_io(EEPROM_R);
SPI_io(address.high_byte);
SPI_io(address.low_byte);
for (i = 0; i < length; i++) {
*temp++ = SPI_io(DUMMY_VALUE);
}
LATAbits.LATA0 = 1;
}
Proteus ISIS-szel szimulálom, ott látom a beírt és kiolvasott értékeket, amik jók.
*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.
Ha egy tombnek nem adod meg a meretet, akkor az nulla hosszu lesz, hacsak nem inicializalod is. Szoval az osszes tombod 0 hosszu.
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.
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
Köszi szépen a választ, így teljesen érthető már.
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: if(STATUSbits.nTO == 0)
{
//valami
}
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?
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.”
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
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.
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.
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
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.
í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...
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.
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.
|
|