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   374 / 840
(#) sikolymester válasza sgt hozzászólására (») Okt 31, 2011 /
 
Talán annyit érdemes említeni, hogy az új AVR Studio 5 tartalmaz egy ASF nevezetű dolgot, ami annyit tesz, hogy Avr Software Framework. Ez rengeteg rutint tartalmaz az xmegák kezelésére. Többek között sok példa projektet is.

Úgy kell ezt elképzelni, hogy a különböző modulokat egyszerűen használni tudod. Nincsen szükség az adatlap odavágó részeinek totál átnézésére, egy gyors áttekintés legtöbbször bőven elég.

Maga az ASF használata ugyan megkíván egy kis betanulást, mert nem teljesen triviális. De fontos megjegyezni, hogy látszólag az atmel nagyon elkötelezte magát amellett, hogy ez jól működjön, így a dokumentáltsága egyre jobb lesz. Frissítések is jönnek ki pár havonta hozzá.
(#) Reggie válasza sikolymester hozzászólására (») Okt 31, 2011 /
 
Mondjuk az ASF xmega reszet nem ismerem, de az avr32 reszben vannak trehanysagok boven. Gyors munkahoz jo, de ha biztosat akarsz, akkor celszeru megismerkedni a periferiaval es leprogramozni ami kell.
(#) sikolymester válasza Reggie hozzászólására (») Okt 31, 2011 /
 
Az igaz, de mondjuk a FreeRtos és az lwip port az AVR32-re áldás. Nem lennének azok, akkor valamelyik Cortex-szel játszanék most.

De az alacsonyabb dolgoknál, mint gpio kezelésnél vannak csakugyan érdekes dolgok. Találtam pl egy teljesen értelmetlenül bit maszkolós if feltétel vizsgálást, ami sosem teljesülhet. Egy teljesen átgondolatlan szamárhiba.

Összességében jó ez az ASF, de tény hogy nem árt résen lenni és nem megbízni benne teljes mértékben.
(#) sgt válasza sikolymester hozzászólására (») Okt 31, 2011 /
 
Eszméletlen hova fejlődik az AVR. Ez a vidi mutatja be hogy mi is ez, illetve hogyan kell használni.

Ámulok és bámulok. Ez már régen nem az, amit tanultam , hogy akkor bitenként beállítani a perifériákat .

Köszönöm az infót .
(#) Reggie válasza sikolymester hozzászólására (») Okt 31, 2011 /
 
Meg a megszakitas-kezeles is rossz, az usb stack egyenesen katasztrofa.
En elkezdtem magamnak leprogramozni minden amire szuksegem van, igy legalabb az IC-t is jobban fogom ismerni.
(#) kovacsj válasza UbiLinux hozzászólására (») Nov 1, 2011 /
 
Köszönöm szépen neked is, UbiLinux! (Én is a Linuxot szeretem, de a Debiant. ) A végtelen ciklus volt a baj, ahogyan Reggie megállapította, de az is igaz, hogy ha túl korán adom a következő parancsot, akkor a visszakapott válaszokban megszaporodnak az ERROR-ok. Tehát arra is figyelnem kell. A következő problémám majd a visszakapott válaszok helyes értelmezése lesz. Mit gondolsz, megszakítás alapon álljak neki, vagy polling alapon érdemesebb? Ez lesz az első ilyen projektem, így minden segítségért hálás vagyok. Esetleg ha lenne valami link ahonnan ezt jól meg lehetne tanulni ... Angol is lehet.
Köszönöm szépen előre is!
(#) Reggie válasza kovacsj hozzászólására (») Nov 1, 2011 /
 
Megszakitassal csinald, onnan egy FITO pufferbe pakold a bejovo adatokat es foprogrambol ertelmezd.
(#) kovacsj válasza Reggie hozzászólására (») Nov 1, 2011 /
 
Köszönöm, Reggie! És a buffer indexe volatile legyen és globális változó? Meg maga a buffer is, ugye?

Most látom, hogy nem jól olvastam. Először meg kell tanulnom, mi az a FITO.
(#) Reggie válasza kovacsj hozzászólására (») Nov 1, 2011 /
 
Igen.
(#) kovacsj válasza Reggie hozzászólására (») Nov 1, 2011 /
 
Egy helyen találtam utalást a FITO buferre. MINI TCP/IP FOR 8-BIT CONTROLLERS De semmi bővebb nincs leírva. Van erről valami irodalom valahol?
(#) kovacsj válasza kovacsj hozzászólására (») Nov 1, 2011 /
 
Ez talán a máshol is emlegetett Ring Buffer?
(#) Reggie válasza kovacsj hozzászólására (») Nov 1, 2011 /
 
Ebben a konyvben van rola leiras. De tomoren: FITO=First In Trial Out, olyan mint egy FIFO puffer(tehar Ring Buffer egy tipusa ez is), azzal a kulonbseggel, hogy eggyel tobb index valtozo tartozik hozza. Ezt az index valtozot arra lehet hasznalni, hogy probalkozashoz kiolvashatsz belole adatokat, ugy hogy meg nem uriti ki a puffert es ha nem sikerult a kiolvasott adatokat feldolgozni, akkor vissza lehet allitani a probalkozas elotti kezdeti ertekre. Ha sikerult akkor egy fuggvennyel ki is lehet uriteni a puffert amig sikerult feldolgozni.
(#) kovacsj válasza Reggie hozzászólására (») Nov 1, 2011 /
 
Egyszer még utcákat neveztetek el rólad! Nagyon szépen köszönöm!
(#) kovacsj válasza kovacsj hozzászólására (») Nov 1, 2011 /
 
Nekem egyébként a legegyszerűbb megoldás is jó lenne. Nem ipari alkalmazás lesz. De ezt mindenképpen átnézem.
Próbálkozom, olvasgatok, kérdezek. Egyszer talán csak lesz belőle valami.
(#) Reggie válasza kovacsj hozzászólására (») Nov 1, 2011 /
 
Az egyszerubb megoldas is ugyan ilyen, csak ott kozvetlenul a tombot hasznalod a tartalmanak ellenorzesehez, itt meg egy fuggvenyt hivsz meg. A kulonbseg annyi, hogy ezt egyszer leprogramozod es univerzalis lesz.
A bonyolult az lenne, ha pcre-t hasznalnal.
(#) kovacsj válasza Reggie hozzászólására (») Nov 1, 2011 /
 
Igen, én is ilyesmire gondoltam. Elég csak néhány szót ismerni, legyen a legfontosabb a +CMTI, és ezt a tömb elemeiből is ki tudom olvasni.

  1. if ( tomb[0] == '+' && tomb[1] =='C' ... )
és így tovább.

Ez így nem jó?
Egyébként tényleg nagyon köszönöm, hogy időt szakítasz rám!
(#) Reggie válasza kovacsj hozzászólására (») Nov 1, 2011 /
 
De, teljesen jo ez is. FITO-val igy nezne ki:
  1. if (  (buff_trial_get()=='+')  && (buff_trial_get()=='C') ... )


Jelen esetben szinte teljesen mindegy, hogy melyiket hasznalod, hiszen a parancs kikuldesekor te uritheted a veteli puffert es eleg azt az elejetol hasznalni, tehat perp kb. egyenerteku. Tehat nyugodtan csinalhatod igy is. Viszont amint kell egy hibaturo sorosport kezelest csinalnod mondjuk a PC fele, vagy RS485 buszra, vagy barhova, akkor mar ez a modszer nem lesz megfelelo, mert a kommunikaciot nem feltetlen te inditod, es mikozben probalod ertemezni a vett adatokat meg johetnek be tovabbi adatok, a hibatlan csomagokat fel kell ismerni, hibasakat eldobni menet kozben stb.
(#) kovacsj válasza Reggie hozzászólására (») Nov 1, 2011 /
 
Értem, és köszönöm szépen!
(#) geri12 hozzászólása Nov 1, 2011 /
 
Üdv mindenkinek!

Tudnátok nekem egy programmódosításban segíteni? Van egy wav player, ami attiny85-el van megoldva. Próbapanelon megépítve szépen működik is, és a hangmínőség is megfelelő nekem. A mellékelt kis kapcsoláson látszik hogy egy kis nyomógombal lehet számot ugrani. Evvel sincs gond. Viszont egy olyan módosításra volna szükségem, ami a 01-es wav fájl befejezésekor nem lép át a 02-esre, hanem vár amíg a gombot meg nem nyomom, és akkor folytatja. Tehát várakozik míg meg nem nyomom a gombot. Ez megoldható valahogy? Jó tudom hogy igen, de nálam sokkal okosabb emberkék ezt pikk-pakk meg tudják oldani. Ráadásul én is tanulnék belőle. A forráskód C-ben írodott. Annyit azért megértek a programból hogy a main.c-ben van a nyomógomb funkciója. És gondolom valahová ide kéne megírni hogy egy szám végetértével ne lépjen tovább míg a gombot meg nem nyomom. Ezer köszönet, ha valaki tud segíteni ebbe.
(#) Reggie válasza geri12 hozzászólására (») Nov 1, 2011 /
 
En nem latom a gomb kezeleset, es a kod szerint elvileg minden fajlt lejatszik az adott konyvtarban.
(#) geri12 válasza Reggie hozzászólására (») Nov 1, 2011 /
 
Pedig én azt hittem abban van benne. (van még mit tanulnom... Inkább egyben mellékeltem) Igen, jelenleg ami az sd-n van mindent lejátszik. De én azt szeretném hogy bekapcsoláskor, mint most is elinduljon, de az első szám végénél ne lépjen a másodikra, hanem várjon, míg a gombot meg nem nyomom, és akkor folytatná a másodikkal.

sourcewav.zip
    
(#) Reggie válasza geri12 hozzászólására (») Nov 1, 2011 / 1
 
Neharagudj, kicsit felreertettem es azt hittem, hogy az a bajod, hogy nem jatszik le egymas utan mindent. (es eltunt a vaksagom, megvan a gomb is, az zavart meg hogy nem a PB0 kifejezest hasznalta)

Szoval ahhoz amit te szeretnel a 174. es 175. sor koze ezt kell beilleszteni:
  1. if (!res) {
  2.   while(bit_is_set(PINB, 0)) wdt_reset();
  3. }
(#) geri12 válasza Reggie hozzászólására (») Nov 1, 2011 /
 
Na erről van szó. Tanultam ismét valamit. Lefordítottam, és szépen megy. Ezer köszönet!
(#) Robi98 hozzászólása Nov 3, 2011 /
 
Sziasztok!
Az utóbbi időkben készítettem egy egyszerű PWM-es kapcsolást, mivel még sosem PWM-eztem és szeretném végre kipróbálni.De valamit programírás közben nagyon eltéveszthettem, mert a LED ami fényének erősödni és gyengülni kéne, az folyamatosan világít halványan.
Itt a program, megpróbáltam felkomentezni minden utasítást, hogy érthető legyen a nem normális gondolkozásom.
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. int main(void){
  4.  
  5. PORTB|=(1<<PB1);
  6. TCCR1A=(1<<WGM10)|(1<<COM1A1);//egyszerű,gyors PWM
  7. TCCR1B|=(1<<CS11);//8-as előosztás
  8.  
  9. while(1){
  10.  
  11. OCR1A=255;//255-ös kezdőérték
  12. while(OCR1A!=0){//ha az OCR1A értéke nem 0 ....
  13. OCR1A--;//...akkor csökkentjük...
  14. };//ha eléri a 0-át akkor már nem lesz igaz a feltétel ezért kilép a ciklusból
  15. while(OCR1A!=255){//ha nem egyenlő 255-tel...
  16. OCR1A++;//akkor növeljük
  17. };
  18. _delay_ms(5);
  19. };
  20. return(0);
  21. };

Köszönöm!
(#) sikolymester válasza Robi98 hozzászólására (») Nov 3, 2011 /
 
Na mi is történik itt?

  1. while(OCR1A!=0){//ha az OCR1A értéke nem 0 ....
  2. OCR1A--;//...akkor csökkentjük...
  3. };//ha eléri a 0-át akkor már nem lesz igaz a feltétel ezért kilép a ciklusból
  4. while(OCR1A!=255){//ha nem egyenlő 255-tel...
  5. OCR1A++;//akkor növeljük
  6. };



Tegyük fel, hogy minden C utasítás sort egy órajel alatt végez el.

Ekkor ez a rész:
  1. while(OCR1A!=0){//ha az OCR1A értéke nem 0 ....
  2. OCR1A--;//...akkor csökkentjük...
  3. };//ha eléri a 0-át akkor már nem lesz igaz a feltétel ezért kilép a ciklusból

lefut ~255órajel alatt

utána
  1. while(OCR1A!=255){//ha nem egyenlő 255-tel...
  2. OCR1A++;//akkor növeljük
  3. };

ez lefut szintén ~255 órajel alatt.

Ez tehát roppant gyorsan lezajlik, majd utána vársz 5ms-et. Mondjuk, hogy az AVR-ed 1MHz-en ketyeg, tehát ez a 2*255 utasítás ~0,51ms alatt lezajlik, utána felveszi az OCR1A értéke a 255-t.


Ugyanakkor, valamelyik kolléga felhívta itt a figyelmet arra is, hogy az OCR1x regiszter csak akkor frissül talán, hogyha megvolt egy sikeres compare? Bár lehet egy másik regiszter volt, de az biztos, hogy timerrel kapcsolatos. Ezt turkáld elő az adatlapból, biztos említik az adott regiszter leírásánál, ha van ilyen feltétele neki.

Ja, és a megoldás tehát ugye az lenne, hogy az OCR1 regisztert kicsit lassabban változgasd. Pl. beteszel a while loopokba is egy-egy delayt.
Készíts egy idődiagramot, ahol látod melyik állapot mennyi ideig zajlik és akkor érteni fogod.

Amit te szerettél volna elérni, az ugye az, hogy 1-2 mp alatt leszámol 255-ről 0-ra, majd ugyanennyi idő alatt vissza. És, akkor ez látványos. Tehát tegyél be valami nagyobb delayt a whileokba, és akkor jó lesz.
(#) Reggie válasza Robi98 hozzászólására (») Nov 3, 2011 /
 
Nezzed vissza a forumot, paran mar valaszoltunk erre a kerdesedre.
(#) Robi98 válasza sikolymester hozzászólására (») Nov 3, 2011 /
 
Köszönöm a részletes választ.
Megpróbáltam már 3 másodperces késleltetéssel is, de a led fénye meg sem mozdul. :no:
  1. OCR1A=255;//255-ös kezdőérték
  2. while(OCR1A!=0){//ha az OCR1A értéke nem 0 ....
  3. OCR1A--;//...akkor csökkentjük...
  4. _delay_ms(1500);
  5. _delay_ms(1500);//várakozunk
  6. };//ha eléri a 0-át akkor már nem lesz igaz a feltétel ezért kilép a ciklusból
(#) Reggie válasza Robi98 hozzászólására (») Nov 3, 2011 /
 
Biztos. Csak akkor derul ki, hogy teljesen elalszik-e, ha 12 oran es 45 percen keresztul figyeled. (-> kicsit sok az a 3 mp)
(#) Ricsi89 válasza Robi98 hozzászólására (») Nov 3, 2011 /
 
Te ha minden lépésnél 3s-et vársz, akkor gondolkozzál már mennyi idő, amíg 255-öt lép? Rohadt sok! És mint leírták nem fog az OCR1A regiszter mindig frissülni, tehát hiába állítod be az értéket, következő vizsgálatnál még mindig régebbi értéket fog visszaadni, ha jól értelmeztem a többiek leírását. Tehát be kellene vezetni egy segédváltozót, amit vizsgálsz és léptetsz, majd az OCR1A regisztert ezzel teszed egyenlővé.
(#) sgt válasza Robi98 hozzászólására (») Nov 3, 2011 /
 
Nem szoktunk ekkora értéket adni a delay függvénynek (8 biten több helyet foglal ekkora szám), próbáld meg 100 ms-sel. Az OCR1A regisztert kitenném az inicializáláshoz.
Következő: »»   374 / 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