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
ASCII karakterek. Igazából az okozza a legnagyobb gondot, hogy hogyan kell összefűzni a beérkező bájtokat egy tömbbe. A beérkező adatokat megszakításban kezelem, így még az strcat sem tud szóba jönni, mert a globális változókat nem szereti
Definealsz egy globalis valtozot, amit nullaval inicializalsz. A bejovo karakter megszakitasban a szamlalo index-ertekere beirod az aktualisan bejovo karaktert es noveled a szamlalot.
Ha akarod hasznalni a standard string muveleteket, akkor a megszakitasban a kovetkezo karakternek meg be kell irni '\0'-t (kikommentelt sor). A hozzászólás módosítva: Júl 13, 2015
Köszönöm a segítséget. A problémám a fenti kódsorral, hogy én eddig így hivatkozok a létező táblázatomra: tablazat[1]=23456, itt pedig a hivatkozás egy adatbájtot ad vissza (pl uart_rx[1]='1'). Ezt a problémát hogyan lehetne leküzdeni?
Vissza kell alakitani oket binaris adatta. A megszakitasban figyeled, hogy mikor jon a vesszo es akkor befejezed a mentest es atalakitod a szamot.
Remélem működni fog, mert elég ígéretesnek tűnik, köszönöm a segítséget!
Sziasztok!
Most kezdtem kísérletezni az avr bemeneteivel és azt vettel észre, hogy az avr azt is érzékeli, ha hozzáérek a bemeneti lábhoz. A kérdésem, hogy hogyan lehetne ezt az érzékenységet csökkenteni?
Fújd be műanyag spray-el...
Ne nyúlkálj hozzá... Húzd le/fel a lábat ellenállással... stb.
Mekkora fel/le húzó ellenállást javasolsz?
Nem tudom mit kötsz rá. Lehet elég ha bekapcsolod a beépített felhúzó ellenállást (mondjuk az elég nagy, a kezed lehet becsaphatja).
De a legjobb megoldás ha a végén befújod plastik 70-el vagy hasonlóval. A hozzászólás módosítva: Júl 13, 2015
Legjobb, ha nem nyúlkálsz hozzá!
Mert műszálas göncben a statikus feltöltődésed több 100V is lehet! És meghal az AVR-ed!
Sziasztok!
Adott egy portom, legyen mondjuk PORTB. A PB0-t bemenetként használom, a többit mind kimenetként, és egy tömbben tárolom a 8 bites adatokat amiből értéket kap. Úgy szeretném a PORTB bitjeit módosítani, hogy a PB0 ne változzon. Tegyük fel a 0b01001100 bitsorozatot szeretném beletenni. Hogyan kell kimaszkolni, hogy a PB0 ne legyen nulla, hanem azt ne változtassa?
Igy megtartja a PORTB legalso bitjenek erteket. (uj_ertek-ben az also bit nulla kelle legyen!!!)
PORTB = (PORTB & 1) | uj_ertek; Ha uj_ertek also bitje lehet 1 is, akkor: PORTB = (PORTB & 1) | (uj_ertek & ~1); De ha csak azt akarod, hogy a PB0 mindig egyben legyen, akkor sokkal egyszerubb mar a tombben egybe tenni azt a bitet, es akkor nem kell semmit maszkolni. Vagy egyszeruen hozzaorolni egyet: PORTB = uj_ertek | 1;
Köszi! Akkor jól gondoltam!
Kijelző multiplexeléshez kell igazából! Maszkolgatni muszáj lesz.
Sziasztok! Mi lehet a hiba ebben a kódban?
A fordító AVR Studio 4 alatt ezt a hibaüzenetet adja és a 4.sorra hivatkozik. ../pfatfs/usi.S: Assembler messages: ../pfatfs/usi.S:49: Error: `)' required ../pfatfs/usi.S:49: Error: garbage at end of line Build failed with 1 errors and 0 warnings... A hozzászólás módosítva: Júl 16, 2015
Ha tenyleg a negyedik sorra irja ezt (es nem a 49.-re), akkor ird egybe a lo8(F_CPU/10000) reszt.
Lenne egy kérdésem.
Szóval van egy elfuserált szerkezet, ami elektromágnest kapcsolgat, kimaradt belőle a védődióda, miközben 1.5A folyik rajta. Értelemszerűen amikor kikapcsolja magát, akkor az őt kapcsoló Atmega16 bizonyos valószínűséggel kiakad. Ami számomra érdekes, hogy leválasztott tápfeszültségnél, optocsatolón keresztül is csinálja. Van 5 db IC, de kizárólag azt üti ki, amelyikkel kapcsolom. Fizikailag hogyan jön át egy nagy méretű induktív rúgás az opto-n és miért csak azt az IC-t találja el, ami őt kapcsolja?
A tápon meg a levegöböl.
Neked meg kellene szüntetned, hogy egy mechanikus kapcsolo szakitsa meg a tekercs áramát. Ez az alap.
Sziasztok!
Volt a probléma az órakvarccal, hogy gyorsabban számol alvó módban a Timer2. Köszönöm a kondezátoros tippeket, de szoftveres volt a hiba... Valószínűleg elfelejtettem Build-ot nyomni feltöltés előtt, és a hibás program ment fel mindig. Nem tudom, hogy tudott alvó módban gyorsabban túlcsordulni a Timer2, nem alvóban pedig olyan sebességgel, ahogy kell, de a lényeg, hogy most már rendesen pörögnek a másodpercek, kondenzátor nélkül. Azt hiszem, a Timer2 pontosan órakvarcra van felkészítve, vagy csak szerencsém volt. Szép napot.
A kvarc kristály megléte még nem elég. A fuse biteket beállítottad?
Ha nem, akkor RC oszcillátorról megy, ami simán gyorsulhat alvó módban.
Az AVR alapból a belső RC-ről megy, 8MHz-en, Fuse bit-ek beállítva, a Timer2 bemenetére van rakva a 32768Hz-es órakvarc.
Sziasztok,
A következő kódot szeretném módosítani úgy, hogy a timer ne 2mp-enként ébressze fel az AVR-t hanem mondjuk fél óránként vagy egy óránként. Szobanövény szérazság érzékelő Adatlapból rájöttem, hogy a következő részt kellene módosítani, úgy hogy a CS10-CS13-ig kell módosítani:
Viszont ha a CS10-et is egyesre állítom akkor a szorzó 16384 lesz, de akkor is maximum csak megduplázni tudom az ébresztőórát tehát kb 4mp-re. Mit kellene még állítanom, hogy még feljebb tornázhassam az ébresztések közti időt? A kód egy részét már módosítottam, úgy hogy a led ne villogjon, hanem csak kapcsoljon be ha száraz és kapcsoljon ki ha nedves:
Talán nem a legelegánsabb megoldás, és egy profi szemszögéből barbárnak tűnik a programozási részem, de ez az első ilyen próbálkozásom és beégetve működik. Köszönöm a segítséget
Esetleg átállhatsz a 128kHz-es RC forrásra (ezt osztod 8-al, akkor már csak 16kHz). Ekkor valamivel több, mint két percenként ébresztene, ez a maximum amit ebből a chipből külső órajel nélkül kihozható. A gond viszont a program többi részével lehet, át kell gondolni, hogy mit és hogyan kell módosítani, hogy ilyen lassú órajel mellett is működjön.
Egy másik lehetőség a low level interrupt használata. Az INT0-ás pint kell használnod erre a célra (a cikkben rossz a pin kiosztás, nézd meg az IC adatlapját). Teszel rá egy kondit (egy soros ellenállás sem árthat, ha nagyobb értékű a kondi). Kiemenetnek állítod. Feltöltöd azzal, hogy egybe írod. Átkapcsolod bemenetnek. Kikapcsolod a felhúzó ellenállást. Bekapcsolod a megszakítást. Elaltatod. Egy bizonyos idő elteltével (nem lesz nagyon akkurátus, sok mindentől függ majd) a kondi kisül és felébreszti a mikrokontrollert.
Hmm, akkor szerintem marad a "B" terv. Mégpedig az, hogy ez az áramkör marad így és megy majd az elemről ahogy a cikkben van. Az öntöző rendszer többi része pedig külön lesz megalkotva.
Köszi a segítséget.
AVR Studio 4.X IDE alatt ezeket a hibákat kapom. Próbáltam másik IDE-vel (Eclipse), azzal is hasonló hibák jelennek meg:
AVR Studio ezt írja hibaüzenetnek: ../pfatfs/usi.S:49: Error: `)' required ../pfatfs/usi.S:49: Error: garbage at end of line Eclipse ezt: ../pfatfs/usi.S:49: Error: `)' required ../pfatfs/usi.S:49: Error: garbage at end of line make: *** [src/pfatfs/usi.o] Error 1 avr_sdloggers C/C++ Problem Erre a sorra panaszkodik mindkét IDE: ldi r24, lo8(F_CPU / 100000) /* Loop counter */
Ha Eclipse alatt egy írom be a kódot: ldi r24, lo8F_CPU / 100000 /* Loop counter */ akkor csak ezt a két hibát adja: ../pfatfs/usi.S:49: Error: garbage at end of line make: *** [src/pfatfs/usi.o] Error 1 avr_sdloggers C/C++ Problem Hogyan adhatnám meg a fordítónak helyesen azt a sort?
Az a megoldas nem jo, amit mar egyszer megadtam? Nezd vissza! Ezt mar egyszer kerrdezted es valaszoltam is ra.
Honnan veszed, hogy a 4. sorban van a hiba? Az assembler azt irja ki, hogy a usi.S file 49. soraban van a hiba. A hibauzenet pedig azt jelenti, hogy valami szemet, nem odaillo dolog van a sor vegen. De nagyon egyszeru, mert ha kikommentezed a 4. sort, es elmulik a hibauzenet, akkor tenyleg abban van a hiba.
Ok, mar ertem,hogy miert nem a 4. sor... Mert a valosagban a 49. de ide csak ezt a reszt masolod be. Az F_CPU makro definialva van?
Igen, az F_CPU definiálva van a projektben, ide is beleírtam hátha, de a hiba nem hárult el. Az usi.S teljes tartalma:
|
Bejelentkezés
Hirdetés |