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   698 / 840
(#) zombee válasza Massawa hozzászólására (») Okt 11, 2015 /
 
Hát a 2313-al így nem fog menni, hacsak nem használsz portbővítőt. Zavarokra igen de késleltetésre nem érzékeny eszköznél javasolt az időzítős megoldás, ahol a bemeneti kombinációnak adott ideig stabilnak kell maradnia hogy a kimeneten változást érjen el. Ehhez kell két segédváltozó. Az egyikben tárolod az "előző" bemenet értékét, ezzel az időzítő megszakításban egyetlen művelettel megállapítod hogy a bemenet változott-e. A másik segédváltozó egy számláló amit minden változáskor lenullázol, majd növelsz minden egyes IRQ-nál ha nincs változás. Ha elér egy adott értéket, akkor átbillented a kimenetet a kívánt állapotba, és tovább nem növeled a változót.
(#) zombee válasza Kovidivi hozzászólására (») Okt 11, 2015 /
 
Akkor a végtelenített ciklusban nem PWM változót használsz hanem egy mezei számlálót, és a számláló értéke alapján kiválasztod a megfelelő kimenetet és betöltöd azokat az OCR regiszterekbe. A legvégén pedig egy hosszabb delay-t használsz, ami jól esik.
(#) Massawa válasza zombee hozzászólására (») Okt 11, 2015 /
 
A bemenetet ugy gondoltam, ahogy eddig a nyomogombokat szoktam kezelni. Az idözitett IRQ többször leolvassa az állapotot, és csak akkor kezelem, ha egymásután ugyanazt az értéket olvassa (3-5x). Ez eddig elég jól bevált. Az eredmény egy BE változo, amit ezután kiértékelnék és megkeresném a táblázatban a hozzávalo kimenetet.
( már látom, hogy a 2313-s egy kicsit kicsi...)
(#) zombee válasza zombee hozzászólására (») Okt 11, 2015 /
 
Sőt! A számláló (tehát ami az állapotot mutatja) alapján variálhatod a késleltetést is. Arra nagyon ügyelj hogy a "_delay_ms" függvényekbe SOHA ne adj meg változót, az csak konstanssal működik (mivel valójában egy makró, nem igazi függvény). Variálni for ciklus beszúrásával tudsz amiben vagy egy kis delay és semmi más.
(#) zombee válasza Massawa hozzászólására (») Okt 11, 2015 /
 
Szerintem akkor már mindent tudsz.
(#) Massawa válasza zombee hozzászólására (») Okt 11, 2015 /
 
Remélem, de mindig olyan remegö ujakkal ülök a gép mögé, pedig már egy sereg müködö berendezést megépitettem és megirtam a SW hozzá. Gyakran primitiv aproságokon nem tudok tuljutni...
( szerencsére megvannak az univerzális macroim meg a subroutinokat is univerzálisra irom, igy minden programba be tudom illeszteni, de igy azok elég áttekinthetetlenek, mert az alprogramok jelentös része felesleges)...
(#) Kovidivi válasza zombee hozzászólására (») Okt 11, 2015 /
 
Rájöttem mi a baj. A pwm csatornák között fix a különbség, így kezdőértékkel el tudom őket különíteni. Most ez a program fut:
  1. signed int tomb[4]={0,10,20,30};        // 3 2 4 1  60 30 90 0
  2.         while(!kesz)
  3.         {
  4.                 for (unsigned char k=0;k<4;k++)
  5.                 {
  6.                         tomb[k]+=irany[k];
  7.                         if (tomb[k]>40) irany[k]=-1;
  8.                         if (tomb[k]<1) irany[k]=1;
  9.                         pwm_direkt(k,tomb[k]);
  10.                 }
  11.                 _delay_ms(30);
  12.                 if (gomblenyomva()) kesz=1;
  13.         }

Most jöhet az oda-vissza, és a knight rider effekt!
(#) zombee válasza Kovidivi hozzászólására (») Okt 12, 2015 / 1
 
  1. tomb[2][4]={{0,10,20,30},{60 30 90 0}};


és így tovább...
(#) k3gy3tl3n válasza Kovidivi hozzászólására (») Okt 12, 2015 /
 
  1. uint8_t LED1pwm=255; //255=max fenyero
  2. uint8_t LED2pwm=128; //128=fel fenyero
  3. uint8_t LED3pwm=0;   //0=min fenyero
  4. uint8_t LED4pwm=128; //128=fel fenyero
  5.  
  6. //a 0-át vándoroltajuk LED3-ról LED4-re majd LED1-re stb....
  7.  
  8. //beallitjuk kiindulsanak a vandorlo sotet hullamot
  9. pwm_beallit(LED1, LED1pwm);
  10. pwm_beallit(LED2, LED2pwm);
  11. pwm_beallit(LED3, LED3pwm);
  12. pwm_beallit(LED4, LED4pwm);
  13.  
  14. while(1)
  15. {
  16.         while(LED2pwm!=255) //LED2-t felhozzuk 255-re  LED3-mat fel 128-ra LED4-et le 0-ra LED1-et le 128-ra
  17.         {
  18.                 LED2pwm++; LED3pwm++; LED4pwm--; LED1pwm--;
  19.                 pwm_beallit(LED1, LED1pwm);
  20.                 pwm_beallit(LED2, LED2pwm);
  21.                 pwm_beallit(LED3, LED3pwm);
  22.                 pwm_beallit(LED4, LED4pwm);    
  23.                 //delay valamennyi...
  24.         }
  25.        
  26.         while(LED3pwm!=255) //LED3-mat felhozzuk 255-re LED4-et 128-ra LED1-et le 0-ra LED2-t le 128-ra
  27.         {
  28.                 LED3pwm++; LED4pwm++; LED1pwm--; LED2pwm--;
  29.                 pwm_beallit(LED1, LED1pwm);
  30.                 pwm_beallit(LED2, LED2pwm);
  31.                 pwm_beallit(LED3, LED3pwm);
  32.                 pwm_beallit(LED4, LED4pwm);            
  33.                 //delay valamennyi...
  34.         }
  35.        
  36.         while(LED4pwm!=255) //LED4-et felhozzuk 255-re LED1-et 128-ra LED2-t le 0-ra LED3-mat le 128-ra
  37.         {
  38.                 LED4pwm++; LED1pwm++; LED2pwm--; LED3pwm--;
  39.                 pwm_beallit(LED1, LED1pwm);
  40.                 pwm_beallit(LED2, LED2pwm);
  41.                 pwm_beallit(LED3, LED3pwm);
  42.                 pwm_beallit(LED4, LED4pwm);    
  43.                 //delay valamennyi...          
  44.         }
  45.        
  46.         while(LED1pwm!=255) //LED1-et felhozzuk 255-re LED2-t fel 128-ra LED3-mat le 0-ra LED4-et le 128-ra
  47.         {
  48.                 LED1pwm++; LED2pwm++; LED3pwm--; LED4pwm--;
  49.                 pwm_beallit(LED1, LED1pwm);
  50.                 pwm_beallit(LED2, LED2pwm);
  51.                 pwm_beallit(LED3, LED3pwm);
  52.                 pwm_beallit(LED4, LED4pwm);    
  53.                 //delay valamennyi...
  54.         }      
  55.        
  56. }

Így?
(#) AxaGame válasza rolandgw hozzászólására (») Okt 12, 2015 /
 
Köszi!
megpróbálom
(#) Sick-Bastard hozzászólása Okt 12, 2015 /
 
Udv!

Egy kerdes, amiben nem vagyok biztos:

  1. int main(void)
  2. {
  3.         while(1)
  4.         {
  5.                 // valamilyen kod
  6.                 return(0);
  7.         }
  8. }


A return miatt a while() ciklus csak 1x fut le, vagy nincs jelentosege?

Elnezest az egyszeru kerdesert, de nem vagyok AVR kozelben, amivel 1 perc alatt letesztelhetnem, de fontos az informacio.
(#) Zsolt2 válasza Sick-Bastard hozzászólására (») Okt 12, 2015 /
 
Csak 1x fut le.
(#) Csirkefej válasza Sick-Bastard hozzászólására (») Okt 12, 2015 / 1
 
Ha a "valamilyen kod" tartalmaz (mondjuk egy if után) egy continue parancsot is, akkor nem feltétlenül egyszer.
Ha meg csak egy continue-t tartalmaz, akkor természetesen végtelenszer.

Amúgy szebb lenne egy break a return helyett és a while vége alatt lehet a return.
(#) Kovidivi válasza k3gy3tl3n hozzászólására (») Okt 12, 2015 /
 
Szia!
Szerintem ez lesz az, amire gondolok. Köszönöm.
Ezt is ki kell majd próbálni. Csak pont most szedtem le a programozó kábelt a szekrény tetejéről!
(#) k3gy3tl3n válasza Kovidivi hozzászólására (») Okt 12, 2015 /
 
Arra azért majd figyelj nehogy véletlenül 0-nál kisebb vagy 255-nél nagyobb értéket vegyen fel valamelyik változó a 4db while ciklusban de elvileg mindegyik 127-szer fog lefutni.
(#) k3gy3tl3n válasza Sick-Bastard hozzászólására (») Okt 12, 2015 /
 
Amint elér a kód a return(0);-hoz ott vége is lesz, mert az a main függvényed végét fogja jelenteni. Szóval ha a "valamilyen kód" nem egy másik while(1) ciklus vagy valami egyéb végtelen csoda akkor 1x fog lefutni. Bizonyíték a képen
A hozzászólás módosítva: Okt 12, 2015

kod.png
    
(#) Csirkefej válasza k3gy3tl3n hozzászólására (») Okt 12, 2015 /
 
Most az első cout -os sor és a return sor közé tegyél be egy continue; -t és csinálj egy screenshotot megint.
A hozzászólás módosítva: Okt 12, 2015
(#) k3gy3tl3n válasza Csirkefej hozzászólására (») Okt 12, 2015 /
 
Úgy nem jut el a returnig ofcourse...

kod.png
    
(#) Kovidivi válasza Csirkefej hozzászólására (») Okt 12, 2015 /
 
Szia, Mikor használatos a continue? Köszi.
(#) Csirkefej válasza Kovidivi hozzászólására (») Okt 12, 2015 /
 
Nem tudom a szabályos -iskolákban tanított- megfogalmazását csak saját szavaimmal írom:

A continue, while ciklusnál a ciklus elejére dob vissza - ignorálja a continue alatti és a ciklus-blokk vége közötti részt.
Gyakorlatilag olyan mintha a blokk aljára ért volna a program.

Hogy mikor használatos arra elég nehéz válaszolni.

Például itt ez a végtelen ciklus, de ha van benne egy feltétel, aminek teljesülése esetén felesleges vagy nem szabad végrehajtani a továbi részt (viszont a ciklust mondjuk nem szabad megállítani) akkor ezt teheted egy változó beállításával, amit ellenőriz a fennmaradó rész, goto-val, vagy éppen continue-val, ami viszont (számomra) sokkal áttekinthetőbb és gyorsabb, mint a többi megoldás.
A hozzászólás módosítva: Okt 12, 2015
(#) Kovidivi válasza Csirkefej hozzászólására (») Okt 12, 2015 /
 
Értem. Köszi a magyarázatot. Sok if-et és változót meg lehet vele spórolni, csak meg kell szokni.
A hozzászólás módosítva: Okt 12, 2015
(#) cimopata hozzászólása Okt 12, 2015 1 /
 
Sziasztok.

Van egy régi projektem amihez 1602A-s kijelzőt használtam, most elfogyott rendeltem újat kínából de ezzel az újonnan rendeltem csak egy értelmetlen sort ír ki. Próbáltam másokat is azzal is értelmetlenséget jelenít meg. A régi LCD ami működik szépen az 1602A v2.0 van ráírva. Ezekre pedig simán 1602A és alatta QAPASS. Van e valakinek ötlete mi lehet a baj miért nem kompatibilisek?

IMAG0274.jpg
    
(#) Csirkefej válasza Kovidivi hozzászólására (») Okt 12, 2015 /
 
Igen. Sok if-et (else if-et) és az ezzel járó végrehajtási időt, ami egy jól összerakott PC-re írt program esetén lehet, hogy nem jelentős de például pic és társainál hasznos lehet + a forrás áttekinthetőbb lehet.

Ne felejtsd a continue "párját" a break-et se használni!
A ciklus hasában elszaporodó return-ök szintén áttekinthetetlenné tehetik a programot nem beszélve arról, hogy egy esetleges program-módosításkor (pláne ha azt a programot mondjuk egy éve írtad és azóta rá sem néztél) vagy esetleges hibakeresésnél sokat segít ha minél kevesebb helyen lép feljebb (return) az adott funkció/process.
+ha visszatérés előtt muszáj pl egy file-t bezárni(vagy jelvezetéket 0-ba rakni stb.), akkor azt ne kelljen sok-sok ponton leismételni.
(#) Massawa válasza cimopata hozzászólására (») Okt 12, 2015 /
 
A QAPASS csak minöség ellenörzés. Valoszinüleg a bemenetek vannak elkeverve. 2 fajta kivitel van forgalomban, ha jol emlékszem 2 pin funkcioja különbözik. Nézz utánna.
(#) cimopata válasza Massawa hozzászólására (») Okt 12, 2015 /
 
Sajnos nem látszik hogy milyen verzió ez a mostani lcd. A régin rajta volt a v2.0 Megpróbálok kérni adatlapot az eladótól. Ha esetleg belinkelnéd ez a 2 típus áttanulmányoznám őket.

Köszi
(#) rolandgw válasza Csirkefej hozzászólására (») Okt 12, 2015 /
 
Elég fura tanokat hirdetsz!
(#) zombee válasza cimopata hozzászólására (») Okt 12, 2015 / 1
 
Szerintem az időzítésen kell állítani, pl. az "új" több időt kér a bekapcsolás és inicializálás, vagy inicializálás és az első "rendes" utasítás közt. Illetve lehet hogy hosszabb impulzus kell neki az "E" (6) vonalon, de olyannal is találkoztam ami a 4 bites módot nem tudja.
(#) cimopata válasza zombee hozzászólására (») Okt 12, 2015 /
 
köszi, utána nézek
(#) Massawa válasza cimopata hozzászólására (») Okt 12, 2015 /
 
Ha beütöd a googlebe ( németül) akkor kapsz egy sereg infot, és ott van az a kivitel is, ahol a lábak, vagy a jelalakjuk fel van cserélve ( anno én is szivtam vele, valahol megvannak a rajzok is nem elektronikus formában - az ilyesmit kinyomtatva el szoktam tenni).
De az is lehet, amit a kolléga ir, föleg a handshake nélküli kommunikácio esetén, hogy rövid az idö. ( ezért én nem is használom azt az egyszerü modot, hanem szépen megvárom amig az LCD visszajelez).
(#) killbill válasza Csirkefej hozzászólására (») Okt 12, 2015 /
 
Tegyük hozzá, hogy a for és a do-while ciklusnál is pont ugyanígy használható a continue.
A hozzászólás módosítva: Okt 12, 2015
Következő: »»   698 / 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