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
Akkor most lássuk, hogy állítottad be a portot, és hogy kezeled a megszakítást. Hátha.
A mókás az egészben, hogy ha kézzel letestelem az INT1 lábat, akkor lefut a rutin ahogy kell. Csak az ISD IC-vel nem tudom összehozni. Valamiért csak 3,8V-ig hajlandó lemenni a feszültségben.
Már bocsánat, de te a PD2, PD3 lábat kimenetnek állítod, nem bemenetnek...
A mókás az egészben, hogy a kimenetnek állított lábakat erőszakolod testre Van baj
Ó b.... és valóban... Ezt benéztem, bocs..
szerk.: "Érdekes", meg is javult.. ;] Ugyan akkor a másik megszakítás pedig ment rendesen, ezért nem is gyanakodtam.. Köszönöm! A hozzászólás módosítva: Máj 4, 2013
Látom neked senki nem válaszolt még.
Kezdem ezzel: a "kiiratas" nálad egy KÉT BÁJTOS, az "sz_kuldes" pedig 17 bájtos tömb lesz. Magyarázat: nem adtál meg nekik fix méretet, így az értékadásnál dől el a belé rakott sztringgel. A sztringet lezáró "nulla karakter" is hozzáadódik. Ha úgy másolsz ahogy a függvényben, akkor a sztring végi "nulla karakter" is másolható. Emiatt nem biztonságos, könnyen kiléphet a tartományból! Inkább nézd meg a beépített függvényeket(string.h), lesz olyan ami neked kell! Ja, és ha csak sima karakterműveleteket végzel, nem kell unsigned. Vagy próbáld ki ezt:
Az "m" paraméterre nem lesz szükség, mert a pointerrel lehet játszani:
És használd a "Kód" mezőt ha programkódot szúrsz be, hasznos... A hozzászólás módosítva: Máj 5, 2013
Sziasztok!
Először is köszönöm a hozzászólást! Bocsi, hogy nem használtam a "Kód" mezőt, ezért is szedte ki a hozzászólásból az üres karaktereket. Szóval az eredeti deklaráció így nézett ki:
Ez így 32 karakter hosszú, ilyenkor mi van a lezáró karakterrel? Az hozzáadódik? Üdv!
Igen.
Sziasztok!
ATmega8al szeretnél működésre barni egy i2c-s mcp23017 es IO-t
az i2c_start_wait()függvénynél ha írásra állítom a címet(utolsó bit=0), akkor nem jut tovább a program, ha olvasásra akkor igen( ezt egy leddel vizsgálom) Az i2c kommunikációs része a programnak biztosan jó, Peter Fleury libary-ét használom, és teszteltem egy EPROM-mal... Mintha nem is venné észre, hogy kiküldtem a címet... Kipróbáltam másik mcp23017el is, azzal sem működött... Valaki tudna segíteni? Miért nem tudom elérni az eszközt? A hozzászólás módosítva: Máj 5, 2013
Ha sztringként adod meg, mindig hozzáadódik, így valóban 33 hosszú lesz, és legfeljebb
32 bájt szöveget belerakhatsz. De így nem biztos hogy jó lesz, mert ha módosítás nélkül beadod valami kezelőnek(pl. LCD kijelző) akkor kiíratja az egészet. Okosabb dolog a méretét előre megadni, így nem lesz baj az sem ha üres sztring lesz. Még jobb ha nagyobbra veszed, max. a memóriát foglalja, de legalább biztonságosabban használható:
A hozzászólás módosítva: Máj 5, 2013
Üdv!
Felmerült ismét egy kérdés, még mindig ATmega8-al kapcsolatban. Egy morse kód generáló függvényt csináltam, aminek odaadom, hogy "Ezt csipogd el" és ő nekiáll lecsipogni a stringet szépen. A függvény ami karaktert kér be és lecsipogja, az itt látható. Érdekes az egészben, hogy x86-on kipróbáltam és működik. Az ATmegába feltöltve viszont nem megy az istenért sem. Egyáltalán nem csinál semmit. Ha kiveszem az if-et, ami azt dönti el, hogy ti vagy tá hangot játszon-e és egy feltétel nélküli csippanást rakok a while-ba, akkor csippan bármilyen karakternél kettőt és kész. Úgy tűnik, hogy a letter pointer értéke eleve hibás. Ennek a problémának a megoldásában kérném a segítségeteket. Természetesen a kapott inputot, tehát a "ch" argumentum értékét ellenőríztem és az helyes!
A memcpy függvényt miért írod újra?
memcpy( (short *)innen + eltolás, ennyit * sizeof(short), ide ); A hozzászólás módosítva: Máj 6, 2013
A tömb értékadásnál komoly problémák vannak.
Hát ez fenomenális! Én azon csodálkozom hogy egyáltalán megeszi ezt az avr gcc fordító! Az a baj, hogy AVR-nél tömböt nem adhatsz meg így! Gondolj arra hogy a memória már eleve korlátozottan áll rendelkezésre, ezért ilyen pazarló szerkezetű tömböt nem kéne használni! Elmondom hogy mit csinál neked erre egy PC-s (pl. Pascal) fordító: létrehoz egy 91 elemű pointer tömböt, azért 91, mert a legnagyobb "index" a "Z" lesz, melynek kódja 90, tehát 0..91. Pointerenként 2 bájtot foglal, és még nincs hasznos adatod, az csak ez után jön. Minden hasznos(tehát 0-9 és A-Z) karakterre a TI és TÁ mellett kap egy sztring végi "0 karaktert". A "hasznos" adat 168 bájt(bocs, kiszámoltam!), a lezáró karakterek 36 bájt, a pointerek 182 bájt. A többi karakterre a pointer nem mutat adatra(jó esetben pedig "NULL"). Összesen tehát 386 bájt, ami egy ATMega8 memóriájának több mint 1/3-a. Ez kegyetlen pazarlás! Ha a 36 karakterre egy ilyen tömböt hozol létre, már csak 216 bájtot foglal és ugyanúgy működik. Azért 6 bájtosak, mert a leghosszabb sorozat 5 karakterből áll, és kell a lezáró "nulla karakter".
Viszont a feldolgozóba kell egy elágazás, hogy rendesen vissza tudja adni a sorozatot:
Ha ismered a PROGMEM direktívát és tudod használni a pgmspace.h-t, akkor mindezt a programmemóriában tárolhatod, különben az SRAM-ot (is) foglalja:
De ennél még van egy sokkal kevesebb memóriaigényű szerkezet. Vedd észre, mekkora pazarlás minden ütemre egy 8 bites karaktert("." vagy "-") lefoglalni, mikor minden ütem egybites információt hordoz. Tehát effektíve 8-adannyi adat lenne szükséges. A legegyszerűbb, ha az ütemek tárolására karakterenként 1 bájtot foglalsz le, ami 8 bit. Mivel a morse kódban a karakterek ütemeinek száma 1-5 között változik, ezt is meg kell adni. Semmi gond, a legegyszerűbb bitműveletekkel még így is működni fog a dolog! Karakterenként a felső 3 bitben lekódolod az ütemek számát(1-5), az alsó 5 bit pedig hordozza a hasznos információt. Egy példa - ez már csak 36 bájtot foglal:
Kis magyarázat ehhez a szerkezethez: Tehát az első 3 bit megmondja hogy hány ütemünk van, ez lesz X. A bájtokban az utolsó X bit hordozza az információt. A "0" jelentése "rövid", az "1" jelentése "hosszú". A maradék bitek "0"-k maradnak, de nem hordoznak semmilyen információt. Csinálhatod úgy is, hogy a 8 bites bájthosszon belül egy "startbit" jelzi a hasznos adat kezdetét. Lehet hogy kezdő programozónak ez sokkal egyszerűbb mint a hosszt megadni a felső 3 bitben. A "legfelső 1-es" után kezdődik a hasznos adat, azonos kódolással(0=rövid, 1=hosszú). Értelemszerűen a startbit nem kerül elküldésre:
A hozzászólás módosítva: Máj 6, 2013
Ez utóbbira adok neked egy morze kódoló függvénypárt amivel dolgozhatsz.
Szinte megírtam neked az egész programot, de ezt most találtam ki, nem lett kipróbálva. A megemésztése lehet hogy tovább tart mint az illesztése a meglévő progidhoz, de többet nem segíthetek. A "sound" már a te cuccosod lesz, amit a hangszóróra írtál, nekem improvizálnom kellett. Íme:
Sziasztok!
Még kezdő vagyok az AVR-ek területén (bár használtam már többször is Arduino-t.), és most szeretnék egy saját projektet átültetni a tervekről a valóságra. Eddig még nem használtam mikrovezérlőt elemről, a mostani tervben az szerepel, hogy 2db ceruzaelemről szeretném az atmega8-at és a rádiós modult (nrf24L01, 2,4Ghz) megtáplálni. Csatolok egy kapcsolást, az volna a kérdés tárgya, hogy van-e hiba a kapcsolásban? Előre is köszönöm!
A 2db. Cerka ellem Max 3V-ot tud!
Az AVR-nek MIN 3.3V Szükséges! Így a biztonságos működési feltétel nincsen biztosítva!
"Operating Voltages
– 2.7V - 5.5V (ATmega8L)" Ez szerepel a dokumentációban. Ha megy 3,3V-ról is, akkor gondolom nem csacskaságot írnak a dokumentációjába.
Hát!
Próba Cseresznye? Vajon meddig fogja bírni a 2db. elemről?
Igen az Atmega8L megy 2,7V-tól. A sima mega8 nem megy.
Szia!
Csak annyit, hogy a RESET pull-up ellenállás tipikusan 10k és 4,7nF kondival hidegítjük. Már ha be akarjuk tartani az ATMEL ajánlást. Lásd itt. A 15. oldalon találod.
használj lítium akksit, azzal addig megy míg van szussz az akksiban.
Újra is töltheted, a max. töltőfesz(4.2V) sem fogja károsítani. Ügyelj a programozó feszültség illesztésére. Ha nem gyári, akkor különösképp! A hozzászólás módosítva: Máj 8, 2013
Sziasztok! Abban szeretnék segítséget kérni, hogy tudna esetleg valaki valami linket vagy könyvet vagy valamilyen forrást ajánlani amiből egy kezdő számára világossá válik, hogy mi is az az AVR.? Elkezdtem itt a fórumot is olvasgatni, de sajnos nincs rá kapacitás, hogy 536 oldalt végig nézzek.!!
Köszi előre is.! Üdv.!
Milyen nyelv lenne jó ?
Angol, német, vagy csak magyar?
Háát igazából a magyar nagyon jó lenne, de ha nagyon nincs más akkor angol is megteszi.! Köszi.!
Itt van egy egész jó cikksorozat AVR 8 lábbal néven, kezdd talán azzal.
Szia!
Nagyon köszönöm a részletes, mindenre kitérő válaszodat! A tanácsodat megfogadom, valóban egyszerűbb így, illetve gazdaságosabb. Köszönöm!
Rendben elkezdem szépen àtnézni őket. köszönöm.
A régi számítógépemet lecseréltem egy újra és most az a probléma adódott,hogy a winAvr nem ismeri fel a programozót. A számítógép tökéletesen felismeri, a drivereket feltelepítettem, a giveio.instalt lefuttattam, a libus-drivert is feltelepítettem. Amikor rákattintok, hogy make program, kiirja hogy can't open device. HID módban is kipróbáltam, de úgy sem sikerült. Lehet, hogy a libus win32 nem támogat valamit? A gépen windows 7 van eddig xp volt, valamint mos 64 bites a processzor.
Szerintetek mi lehet a probléma?
60 nap alatt arduino alapozásnak? Bővebben: Link
Esetleg a honlapon a Bascom alapozás: Bővebben: Link
Üdv. Van valakinek egy egyszerű alapkapcsolása ATMEGA 328P IC-hez?
Mire?
A chip önmagában, Vcc, VccA, GND és GNDA beköt 5V ill GND-re. Belső 1 MHz és megy is..... Vagy mire gondoltál? |
Bejelentkezés
Hirdetés |