Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
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
Lapozás: OK   534 / 840
(#) Hooligan01 válasza karika200 hozzászólására (») Máj 4, 2013 /
 
Akkor most lássuk, hogy állítottad be a portot, és hogy kezeled a megszakítást. Hátha.
(#) karika200 válasza Hooligan01 hozzászólására (») Máj 4, 2013 /
 
  1. int main() {
  2. ...
  3.                 DDRD = (1<<PD2) | (1<<PD3);             //Beállítom először a két INT lábat bemenetnek
  4.                 PORTD = (1<<PD2) | (1<<PD3);      //Mindegyik lábra rakok egy egyest
  5.  
  6.                 MCUCR = (1<<ISC01) | (1<<ISC00) | (0<<ISC11) | (1<<ISC10); //Az INT0 rising edgen fut le, az INT1 pedig bármilyen logikai változásnál
  7.  
  8.                 GICR |= (1<<INT0) | (1<<INT1);          // Engedélyezem a két használni kívánt megszakítást
  9.  
  10.                 sei();
  11. ...
  12. }
  13.  
  14.         ISR(INT1_vect) {
  15.           //Itt lesz amit szeretnék
  16.         }


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.
(#) Hooligan01 válasza karika200 hozzászólására (») Máj 4, 2013 /
 
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
(#) karika200 válasza Hooligan01 hozzászólására (») Máj 4, 2013 /
 
Ó 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
(#) zombee válasza skimen hozzászólására (») Máj 5, 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:
  1. void copy(char *hova, char *honnan, uint8_t length)
  2. {
  3.   uint8_t i=0;
  4.   for(i=0; i<length; i++)
  5.   {
  6.     if(!honnan[i]) break;
  7.     hova[i] = honnan[i];
  8.   }
  9.   hova[i] = 0;
  10. }


Az "m" paraméterre nem lesz szükség, mert a pointerrel lehet játszani:
  1. void copy(hova+16, honnan, 16)


É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
(#) skimen válasza zombee hozzászólására (») 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:
  1. unsigned char kiiratas[]= "                                ";


Ez így 32 karakter hosszú, ilyenkor mi van a lezáró karakterrel?
Az hozzáadódik?

Üdv!
(#) sikolymester válasza skimen hozzászólására (») Máj 5, 2013 /
 
Igen.
(#) mzozo95 hozzászólása Máj 5, 2013 /
 
Sziasztok!
ATmega8al szeretnél működésre barni egy i2c-s mcp23017 es IO-t
  1. #define mcp_address  0b0101110// a 3 adress lábat +5V ra kötöttem
  2. #define GPIOA 0x12
  3. #define GPIOB 0x13
  4.  
  5.      i2c_init();                            
  6.          
  7.      i2c_start_wait(mcp_address);    //ha írásra állítom a címet(utolsó bit=0), akkor nem jut tovább a program,  mert azt érzékeli, hogy foglalt az eszköz, ha olvasásra akkor igen( ezt egy leddel vizsgálom) akkor tovább megy, de nem tudok "bele" írni...
  8. PORTB=255;
  9.      i2c_write(0x00);                        
  10.      i2c_write(0x00);        
  11.          i2c_stop();                            
  12.  
  13.         i2c_start_wait(mcp_address);
  14.         i2c_write(GPIOA);
  15.         i2c_write(0b11111111);
  16.         i2c_stop();


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
(#) zombee válasza skimen hozzászólására (») Máj 5, 2013 / 1
 
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ó:
  1. unsigned char kiiratas[40]="";
A hozzászólás módosítva: Máj 5, 2013
(#) karika200 hozzászólása 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!
(#) csabeszq válasza skimen hozzászólására (») Máj 6, 2013 /
 
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
(#) zombee válasza karika200 hozzászólására (») Máj 6, 2013 /
 
A tömb értékadásnál komoly problémák vannak.
  1. char *cw_chars[] = {
  2.  
  3.                   ['A'] = ".-",
  4.  
  5.                   ['B'] = "-...",


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".
  1. char cw_chars[36][6] = {".-","-...","-.-.",...}  //A,B,C,...

Viszont a feldolgozóba kell egy elágazás, hogy rendesen vissza tudja adni a sorozatot:
  1. char* morze(char Ch)
  2. {
  3.   if(Ch>='A' && Ch<='Z') return cw_chars[Ch-65];  //az "A" kódja 65, a tömbben a 0. helyen áll.
  4.   if(Ch>='0' && Ch<='9') return cw_chars[Ch-21]; //a "0" kódja 48, a tömbben a 27. helyen áll
  5.   return NULL;  //biztonsági rész: érvénytelen karakter esetén(pl. szóköz) nincs elküldendő adat!
  6. }


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:
  1. #include<avr/pgmspace.h>
  2. const char cw_chars[36][6] PROGMEM = {".-","-...","-.-.",...}  //A,B,C,...


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:
  1. unsigned char cw_chars[36] = {0b01000001,0b10000111,0b10001010,}  //A,B,C,...

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:
  1. unsigned char cw_chars[36] = {0b0000101,0b00010111,0b00011010,}  //A,B,C,...
A hozzászólás módosítva: Máj 6, 2013
(#) zombee hozzászólása 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:
  1. char morze(char Ch)
  2. {
  3.   if(Ch>='A' && Ch<='Z') return cw_chars[Ch-65];  //az "A" kódja 65, a tömbben a 0. helyen áll.
  4.   if(Ch>='0' && Ch<='9') return cw_chars[Ch-21]; //a "0" kódja 48, a tömbben a 27. helyen áll
  5.   return 0;  //biztonsági rész: érvénytelen karakter esetén(pl. szóköz) nincs elküldendő adat!
  6.  
  7. void morze_kuldes(char* adat)
  8. {
  9.   while(adat[0])
  10.   {
  11.     unsigned char utemek = morze(adat[0]);
  12.     if(utemek)  //csak érvényes karaktert küld el
  13.     {
  14.       uint8_t volt_startbit = 0;
  15.       for(uint8_t i=0; i<8; i++)
  16.       {
  17.         if(utemek & 0b10000000 && !volt_startbit) volt_startbit=1;
  18.         else if(volt_startbit) switch(utemek & 0b10000000)
  19.         {
  20.           case 0:
  21.             sound(rovid);
  22.             break;
  23.           default:
  24.             sound(hosszu);
  25.         }
  26.         utemek<<=1;
  27.       }
  28.     }
  29.     adat++;  //pointer növelése 1 bájttal
  30.     _delay_ms(250); //minden karakter között várakozik, hogy a vevő el tudja különíteni őket!
  31.   }
  32. }
(#) inci88 hozzászólása Máj 8, 2013 /
 
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!
(#) kapu48 válasza inci88 hozzászólására (») Máj 8, 2013 /
 
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!
(#) inci88 válasza kapu48 hozzászólására (») Máj 8, 2013 /
 
"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.
(#) kapu48 válasza inci88 hozzászólására (») Máj 8, 2013 /
 
Hát!
Próba Cseresznye?

Vajon meddig fogja bírni a 2db. elemről?
(#) Ricsi89 válasza inci88 hozzászólására (») Máj 8, 2013 /
 
Igen az Atmega8L megy 2,7V-tól. A sima mega8 nem megy.
(#) pluto válasza inci88 hozzászólására (») Máj 8, 2013 /
 
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.
(#) zombee válasza inci88 hozzászólására (») Máj 8, 2013 /
 
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
(#) szel.balazs hozzászólása Máj 9, 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.!
(#) rigo_mate válasza szel.balazs hozzászólására (») Máj 9, 2013 /
 
Milyen nyelv lenne jó ?
Angol, német, vagy csak magyar?
(#) szel.balazs válasza rigo_mate hozzászólására (») Máj 9, 2013 /
 
Háát igazából a magyar nagyon jó lenne, de ha nagyon nincs más akkor angol is megteszi.! Köszi.!
(#) rigo_mate válasza szel.balazs hozzászólására (») Máj 9, 2013 /
 
Itt van egy egész jó cikksorozat AVR 8 lábbal néven, kezdd talán azzal.
(#) karika200 válasza zombee hozzászólására (») Máj 9, 2013 /
 
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!
(#) szel.balazs válasza rigo_mate hozzászólására (») Máj 9, 2013 /
 
Rendben elkezdem szépen àtnézni őket. köszönöm.
(#) Robi98 hozzászólása Máj 9, 2013 /
 
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?
(#) TavIR-AVR válasza szel.balazs hozzászólására (») Máj 9, 2013 /
 
60 nap alatt arduino alapozásnak? Bővebben: Link
Esetleg a honlapon a Bascom alapozás: Bővebben: Link
(#) DJ Szabcsa hozzászólása Máj 9, 2013 /
 
Üdv. Van valakinek egy egyszerű alapkapcsolása ATMEGA 328P IC-hez?
(#) TavIR-AVR válasza DJ Szabcsa hozzászólására (») Máj 9, 2013 /
 
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?
Következő: »»   534 / 840
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem