Fórum témák
» Több friss téma |
Megszakítást jelző flaget kézzel kell visszaállítani (kinullázni) a megszakítás kezelés legvégén, return előtt!
Úgy sejtem, hogy ebben az esetben folyamatosan észleli hogy megszakítás van (mert nincs a flag nullázva) és végtelen ciklusba kerül.
Bejött köszönöm szépen a választ. Sokat segítettél.
Tovább szeretném fejleszteni a dolgot olyanra, hogy nem külső gombbal szeretnék megszakítást kérni, hanem egy bizonyos eltelt idő után. Az igaz, hogy az interrupt-ba nem lehet késleltetést írni? Ezt úgy olvastam valahol. Ha ez igaz akkor, hogy lehetne logikusan megoldani ezt a problémát?
Már egy hete csak olvasok. amúgy gondoltam erre való a Timer0 neveztű valami, de kíváncsi voltam, hogy anélkül meg lehet-e oldani.
köszi a tippet Idézet: Így próbáltam volna én is! „Ezzel a megoldással próbálkozom” Van azonban egy apró ellentmondás: ha már szükségtelenül int típusúnak deklaráltad a függvényt, akkor miért nem (int) típuskényszerítés van visszatérésnél? De logikusabb volna a függvényt is és az mcp1adat változót is uint8-nak deklarálni! Idézet: Én évek óta... „Már egy hete csak olvasok.” Az 1 hét nagyon kevés, ne csodálkozz, hogy még nem érted ( többször is el kell olvasni és próbálgatni kell + SZIMULÁCIÓ !!! ) ! Steve
Szia!
A megszakításba azért nem tehetsz késleltetést (pl. NOP-okat ciklusban), mert a megszakításkezelő rutin futásideje nem lehet hosszabb, mint a két megszakítás közt eltelt idő (különben a megszakítás önmagára futna). Ezt sok helyen le is írták már (szerintem itt is). De azt megteheted, hogy létrehozol egy globális változót (0 kezdőértékkel), aminek a tartalmát minden megszakítás alkalmával növeled egyel és vizsgálgatod minden megszakításnál. Amikor eléri a kívánt értéket, akkor jött el a késleltetett indítás pillanata. Nem bonyolult és nem is növeli sokkal a kódot... Üdv.
Igen ez az AVAR.http://www.hestore.hu/prod_10024859.html
Most akarok PI16628 összekötni . Azért kérdem mert az ic lapján nem egyéltelmü neken nyelv miatt és nem szeretném elrontani
Létom már alaposan mellé nyuútam, Másra jó.
kőszönöm .
Bingó! szuperál a portbővítő. Nagyon köszönöm a segítséged, sokat segítettél mint mindíg!
Működik mind két megoldási javaslatod, tudom kezelni az A és B portot (bájt-ot). Azért, maradok az első javaslatodnál. Egy kis hardver probléma bonyolította tovább a helyzetet, nehéz úgy programot fejleszteni, hogy a hardver nem 100-s. Így jár aki kissé figyelmetlen. Most egy ideig elleszek a PC-s progival, de utána további portbővítést és memória beépítést tervezek az I2C buszra. Üdv.
Sziasztok!
30F6012A SPI busz nem tudom rávenni hogy slave-ként működjön. Nem okoz megszakítást az üzenet érkezése, nem áll 1-be IFS0bits.SPI1IF. Így konfigoltam, biztos hogy itt nem jó valami:
A port beállítások (irányok) jók, A/D kikapcsolva az érintett lábakon. Mit kéne még beállítani?
Itt találsz egy mintapéldát SPI master-slave kommunikációra. Nézd át a beállításokat, hátha találsz benne valami okosságot!
Szoktam olvasgattam az oldaladat, sokszor segített már, ezt is megtaláltam de lényegi eltérést nem láttam. Annyi hogy a 30F.. sorozatban más a SPI1CON1 reg. Legalábbis én nem láttam "SLAVE_ENABLE_ON | //SLAVE mód" ezt a bitet. A 24F.. adatlapját pedig nem néztem.
De közben a megszakítás sikerült elérni, most más a probléma: A master 10ms- onként 4byte -os csomagot küld az SPI -n. Ez okoz is 4 megszakítást a slave-ben, de a lenti kóddal valamiért nem megy a 4byte szétválogatása. C-vel még csak ismerkedem assembly -ben programoztam sokat, minden észrevételt szívesen fogadok.
PORTD,11 lábat nézem szkóppal azért vannak beszúrva az asm sorok. SPI1_timer-t 1ms-onként növelem 1-el.
Az interrupton kezelt változók volatile-ként vannak deklarálva?
Nem. Köszönöm a segítséget! Pedig már használtam, de most lemaradt a volatile . A tömbnél is ugyan úgy mint sima változónál?
HA lenne ott (megszakításban) lokális változó azt is volatile -ként kellene?
Ha már itt tartunk valaki el tudná mondani pár szóval mi is az a volatile?! Mire jó az?
Valami olyasmi hogy a fordítónak szól hogy a változón ne végezzen optimalizációt.. De majd a nagyok kiegészítik.
Persze még mindig nem jó valami, a slave mindig Heat_pwm_cycle változó értékét küldi vissza mind a 4 byte helyén. Mintha SPI_byte_count mindig 1 lenne. Idézet: „Ha már itt tartunk valaki el tudná mondani pár szóval mi is az a volatile?! Mire jó az?” Azzal mondod meg a forditonak, hogy ne optimalizalja ki a valtozo hasznalatat a kododbol. A fordito nem latja parhuzamos szalakat, azaz ha pl azt csinalod, hogy:
akkor a fordito azt hiszi a valtozo erteke mindig 1 es igy olyan kodot fog generalni ami nem vizsgalgatja folyamatosan a valtozo erteket... Viszont ha az volatile akkor fogja tudni, hogy ilyet nem szabad csinalnia es mindig vizsgalgatnia kell a valtozodat. Ez persze csak egy egyszeru pelda, ennel osszetettebb is lehet a dolog, de a lenyeg ez.
A napokban sikerült összehoznom az RBO/ INT-es megszakítást és most próbálkozom TMR0-ás megszakítással, hogy saját maga váltogassa a dolgot ne pedig külső gombbal kelljen csinálnom.
Ezzel kapcsolatban szeretném kérni a segítségeteket. Megírtam ezt a kódot:
Ez nekem annyit csinál, hogy az RD4-RD7 ig folyamat világít a led és nem akarja az istennek sem XOR-ozni. HI-TECH fordítót használok(legalább is próbálok használni) Vajon mi lehet a probléma? Valami regisztert nem állíthatok be vagy valami még ostobább probléma lehet ebben a dologban? (nem tudom a PS2S0- át jól írtam-e be de hibát nem dob...) Előre is köszi ha valaki tud segíteni
Számításaid szerint milyen időközönként következik be a megszakítás? Ha meg van, gondold tovább!
(A T0IF-et "O"-val írtad - legalábbis ide úgy került. Erre hibaüzenetet kellett volna kapnod!)
én úgy számoltam, hogy:
1:256-al osztom a TMR0-át. 4Mhz-es a kvarcom. leosztom 256-tal és 1/ez a szám. ez nekem 64 us-re jön így ki. elég fura de én erre tudok csak gondolni. Ha ez igaz akkor lehetséges, hogy túl gyors? A T0IF-vel kapcsolatban igazad volt. A programba 0-t írtam. Van egy sas szemed Jól számolom?
Üdv mindenkinek! Most építettem egy 44 PIN-es PIC16F887 mikrokontrollerrel működő próbapanelt a Microchip tervei alapján. Mindent úgy kötöttem be, ahogy a kapcsolási rajzban meg voltak adva. A LED-ek villogtatása megy, nyomógomb szintén működik, viszont az AD átalakítós feladatoknál már gondok akadtak. A program célja az, hogy potenciométer aktuális értékét kijelzi bináris számrendszerben. Ám ez nem történik meg. Próbáltam más potenciométerek alkalmazását, sajnos kevés sikerrel. Okozhat-e gondot az, hogy ahogy a kapcsolási rajzban fel volt tüntetve, a potenciométerrel sorba volt kötve egy 1k ellenállás és vele párhuzamosan a földre volt kötve egy 100 nF-os kondenzátor (kerámiát alkalmaztam).
Nem jól számolsz, a TMR0 léptetőjele az oszcillátor órajelének negyede. (Adatlap!)
Tehát utasításciklus (Fosc/4): 1 us, 256-os osztással 256 us. A 8 bites számláló túlcsordulása 256*256 us = 65536 us, kb. 65,5 ms. Ez is gyorsnak tűnik (Egyébként az MPLAB szimulátorában a stopperórával megmérhető...)
És, amit az előző hozzászólásomban is elfelejtettem: a main végére kellene egy végtelen ciklus, ha az eredetiben nincs ott, a megszakítás végén meg felesleges a return.
Sziasztok!
USB HID Generic demo, PIC18F14K50. Kezdek kifogyni a program memóriából, bootloadert nem akarok használni. A linker fájlban ha a bootloader szekciót kiveszem és a page alsó határát az ex bootloader szekcióra alsó határára állítom akkor az úgy menni fog szerintetek, vagy valahol máshol is bele kell nyúlni? Gondolom a vektor a átirányítást is ki lehetne szedni.
Sziasztok.
Nagyon alap kérdésem lenne, lehet volt is részletesen róla már szó. Magam is sokat keresgéltem. Watt oldalán is nézegettem. Nade a kérdés a táblázatkezelés. Hosszadalmas a programom, mert a 8bit lebontva 3 regiszterbe, hogy a 3 darab decimális jegy meglegyen. Ezek után pedig jön a szerintem kifejezetten buta és hosszú rész. Mindegyik regiszterből 0-9-ig egymás után vonogatom ki az értéket és ha megegyezik akkor veszi fel azt az értéket ami benne van és ezt 3x 0-9-ig ez nagyon hosszú és tudom hogy a táblázatkezelés lenne az okos megoldás, de nemnagyobn találok infót, és segítséget. Köszi!
Szia!
Már nem is tudom hanyadszor adom meg a linket. Ez egy gyors, rövid, bővíthető, szűkíthető rutin a bináris - BCD átalakításra. Egy követelmény van (de a program módosításával ez is feloldható), hogy az R3,R2,R1,R0 változók egymás utániaknak kell lenniük és az R3 cimének alsó 3 bitjének 0 -nak kell lennie. Nincs benne osztás, táblázatkezelés stb. Ez meg a visszafelé konverzió hasonló módon.
Az alábbi sorokkal mennie kell.
|
Bejelentkezés
Hirdetés |