Fórum témák
» Több friss téma |
WinAVR / GCC alapszabályok: 1. Ha ISR-ben használsz globális változót, az legyen "volatile" 2. Soha ne érjen véget a main() függvény 3. UART/USART hibák 99,9% a rossz órajel miatt van 4. Kerüld el a -O0 optimalizációs beállítást minden áron 5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás 6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et Bővebben: AVR-libc FAQ
Nézd meg ezt is:
Bővebben: Link
Szia, tagolva volt, csak sajnos kiléptetett én meg bekopiztam a kiléptető üzenetet és az már nem volt tagolva (a code, /code ott van )
Egyébként mi a külömbség a signal és az isr között ? nekem mind a kettő ugyan azt az eredményt hozta.
Ha
Sziasztok!
C-ben van egy olyan függvény, hogy: void EEPROM_write(unsigned int uiAddress, unsigned char ucData). Ilyen függvényt szeretnék írni assemblyben. A neten találtam is egy megoldást: http://www.scienceprog.com/atmega-eeprom-memory-writing/ lefordul, de valamiért nem működik. Valaki tudna nekem segíteni, hogy mi a gond? Erről a kódról van szó: EEPROM_write: ; Wait for completion of previous write sbic EECR,EEWE rjmp EEPROM_write ; Set up address (r18:r17) in address register out EEARH, r18 out EEARL, r17 ; Write data (r16) to data register out EEDR,r16 ; Write logical one to EEMWE sbi EECR,EEMWE ; Start eeprom write by setting EEWE sbi EECR,EEWE ret A választ előre is köszi!
A nyomogombot ne tedd megszakitasra ! Hogy fogod prell mentesiteni? HW-esen tobb alkatresz es tobb sz^vas. Szoftveres prellmentesitesre ott pl a nixi ora kodja, de lehet hogy a topicban is van errol szo.
Nekem egy 10nF-os kondi tökéletes prellmentesítésnek bizonyult a nyomógombhoz.
Lehet simán perl menetsíteni interrupt rutinon belül is. Persze csak akkor járható ez az út, ha a main kódban nem fut semmi olyan ami időkritikus.
Idézet: Koszi.„Lehet simán perl menetsíteni interrupt rutinon belül is.” En nem irtam azt, hogy nem lehet. Mindent lehet. Csak az a kerdes hogy ki csinalja. En csak jo iranyba probaltam terelni, hogy "megtanulja" hogy lehet normal I/O-n nyomogomb esemenyt lekezelni.
Ezt ugy szoktak interruptban, hogy a gomb fel es lefuto elet is figyelik. Mikor a gomb megnyomodik akkor egy timer elindul. A timer a prell ido vegen ad megszakitast, de kozben ha a gombot elengedtek, akkor a timer leall, ill ujboli megnyomasakor ujra indul az idozites. Mikor a timer megszakitas megjott akkor a prell mar megtortent.
Egy valtozatban nem kell az elengedest figyelni, hiszen legfeljebb ha az idozites lejart le lehet pollozni, hogy a gomb meg mindig nyomva van-e (es tovabbra is megnyomaskor mindg nullazni kell az idozitest...). Ezek a modszerek tekinthetok a legbiztonsagosabb szoftveres prell mentesitesnek, szinte teljesen mindegy milyen kapcsolot kezelunk le a modszer mukodni fog mivel nem kell pontosan ismerni a prellezes idejet. Hatranya viszont, hogy a timer dedikaltan egy gombhoz van rendelve amivel kulonbozo modszerekkel lehet segiteni de mindenkeppen bonyodalmakat fog okozni. Ennek egy extrem valtozata mikor a timer korul forog minden, adott idokozonkent ad megszakitast amikr a gombot vizsgaljuk (pollozzuk). A timer idozitesetol fuggoen vagy egy szamlalo vagy egy flag az amit seged valtoonak hasznalunk a gomb allapotanak a jelzesere. A flag az egyszerubb, a timer megzakitas bejon, megnezzuk meg van-e nyomva a gomb es ha pedig nem a flag-et toroljuk es kilepunk. Ha meg van nyomva a gomb akkor megvizsgaljuk, hogy a flag all-e. Ha meg nem all a flag akkor beallitjuk es kilepunk, ha viszont mar all akkor a gomb megnyomottnak tekintheto. Ez azt feltetelezi, hogy a timer idozitese tulnyul a prellezes idejen es elenyeszo hibalehetoseggel kielegito megoldaskent szokott szolgalni. Ha gyorsabban ad megszakitast a timer mint a prellezes lecsengese, akkor szamlaloval kell ugyanezt eljatszani. Tehat elengedett allapotban a szamlalot nullazni kell, megnyomottban pedig novelni. Ha bizonyos erteket elertunk, akkor a gomb megnyomottnak tekintheto. Ennek elonye az is, hogy konnyu kiegesziteni az ismetles funkcioval, tehat meg azt is el lehet jatszani, hogy elso megnyomaskor X ideig meg nem ismetel, de utana Y idokozonkent elengedesig igen.
Van egy távirányítós autóm amit fel akarok tuningolni.
A nyákján találtam egy RX IC-t. Ha jól olvastam akkor ebből csak a "kimeneti" lábakat kell kioperálnom és a helyükre tenni mondjuk pár AVR lábat. Az AVR lábaira meg bemenetként rárakhatom az RX kimeneti lábait. Innentől az AVR kapja a távirányító jeleit és ő irányítja a két motort (kormány+kerék). A tápot pedig kaphatja onnan ahonnan az RX is kapja. Helyes az elgondolásom? (Az adónál szintén így csak a megfelelő lábra a megfelelőt.....) Sziasztok! Egy olyan problémám van, hogy nem akar két timer interrupt együtt működni.(timer0 és timer1). Az a baj, hogy amelyik előbb meghívódik, csak az fut utána, a másik nem jut szóhoz. De nem tudom , hogy miert. Valaki tudna segíteni??Köszi
Lehet, hogy nem jol irtad meg a programot.
köszi!! Itt a program érdemi része, ami lefut. Biztos van vmi amit elfelejtettem beállítani. #define TMR2_CTRL (1 << WGM21) | (4 << CS20) #define TMR2_MATCH (uint8_t)(125 - 1) // 125000 / 125 = 1000 Hz ==> 1 ms #define TMR2_ASSR_AS2 0 int main(void) { /* timer0 interrupt */ TCCR0=0x1; TIMSK=1; /*timer2 interrupt */ OCR2 = TMR2_MATCH; TCCR2 = TMR2_CTRL; TIMSK = (1 << OCIE2); /* enable interrupt */ sei(); while(1) { } return 0; } ISR(TIMER0_OVF_vect) { kiir(1,0x80); } ISR(TIMER2_COMP_vect) { kiir(2,0x80); } >>>>>
Milyen procira van irva ?
Most igy elsore:
A kiir fügvényedröl semmit nem mondtál. Látatlanban azt tudom mondani, hogy a kiir fügvényedben van a hiba oka. Könnyen előfordulhat, hogy túl sokáig fut a kód a megszakítás rutinon belül és ezért nem jut szóhoz a másik timer.
Az ISR-kben a kiir helyett egy -egy I/O szintet allits at, majd ellenorized le, hogy ez igy mukodik-e. Ha igen, a kiirben van a hiba.
Ez mi a akar lenni:
Ha egybe allitod is, akkor az : reserved. A COM21 bitet kell 1-be allitani, vagy a COM21-20 biteket !
Na beneztem , sietek.
Köszi a segítséget!!
A kiir függvényem egy 7segmenses kiíratás. Ha az interruptban nem csinálok semmit , akkor sem veszi el az egyik a másiktól.
Meg van a hiba!
Az volt a mi az elso tipp is volt! csak nem a timer2-re kellett volna vagy hanem a timer0 ra! TIMSK|=1; köszi a segítséget!!
Timer0-ra hogyan, ha azutan felulirod a timer2-nel?
Es ez? (#437966)
Helló szakik!
Azzal a problémával fordulok hozzátok, hogy szeretnék csinálni egy hangoló gépet, és egy metronómot...ehhez freki mérés kell, és ezt mikroprocesszorral szeretném megcsinálni.A suliban tanultunk 80c32-re egy freki mérőt, meg ezt már többé-kevésbé ismerem is, mert ebben a félévben ezzel dolgoztunk... Azt szeretném tőletek megtudakolni, hogy létezik-e hasonlóan működő avr, vagy hogy mivel a legegyszerűbb megoldani?Úgy néztem, hogy vannak hasonló avr-ek, és ezeket felprogramozni is jóval egyszerűbb... A válaszokat előre is nagyon köszönöm!!
Sziasztok
Bedöglött az JTAGICE MK II-m. 80eHUF-ért nem vennék újat. Tud valaki megoldást arra, hogy lehetne AVR32-t és XMEGA chipeket programozni JTAG-en (milyen hardver)? (JTAGICE van, de az nem kezeli ezeket)
Én anno 100USD körül vettem. Igaz, nem itthon vettem, hanem NET-en rendeltem.
Ebben a webstore -ban....
Igen, ilyet néztem én is. Clone.
De a leirásban nem írja, hogy igen tudja kezelni az AVR32-t és az XMEGA cuccokat, csak említi, hogy van ilyen és olvasd el az atmel oldalán... A tieddel használtál már AVR32-t XMEGA-t?
Az XMEGA biztosan meg vele ( ATxMega256A1) AVR32-vel még nem próbáltam. Mivel a firmware-t az AVR studió frissíti, nagy különbség nem lehet az eredetihez képest.
Az eredeti az megy vele.
Az eBay-en találtam ilyen clone-okat, de ott pár visszajelzésben írták, hogy ok megy, de AP7000 (AVR32) vagy XMEGA procikat az a clone nem kezelte. Ezért kérdeztem, hogy fizikailag tesztelted-e. THX
Hello.
Bascom problema: Config Portc = Output Config Timer0 = Timer , Prescale = 1024 On Timer0 , Vilog: Enable Timer0 Enable Interrupts Do Loop Villog: Timer0 = 100 Toggle Portc.2 Return Eddig megy (a portc.2 -ön levő ledet villogtatja), az a gond hogy nem tudom hogy hogy kell a külső megszakitásokat használni. ATmega8-at használok a portd.2 az Int0. Ha esetleg valaki tudna nekem segiteni abban hogy az Int0-t hogy kell beálitani valamint, hogy kell rá hivatkozni, mert azt akarom elérni hogy a villogást ki be kapcsoljam vele akkor azt megköszöném. Kösz a seggitséget elöre is.
Ez még nem olyan komoly feladat, hogy megszakítás kelljen hozzá.
Elég lenne a egy sima portfigyelés és ki be kapcsolás. |
Bejelentkezés
Hirdetés |