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   103 / 840
(#) Topi válasza Grebi hozzászólására (») Feb 15, 2009 /
 
Ne a fuse bitek között keresgélj, mert ott maximum lassítani lehet a CLKDIV8-al.
Lapozz vissza a cikkben és nézd meg hogy van beállítja a projekt / options. Ott kell CPU sebességet beállítani és ott kell processzor, plusz optimalizációt állítani.
Helytelen fordító optimalizáció miatt gyorsabb.
(#) vzoole válasza ZLED hozzászólására (») Feb 15, 2009 /
 
Bővebben: Link

^^
Ezt nézd meg... csinálsz 1 másodperces megszakítást.

A megszakításban növeld a változó (sec) értékét

A main programba meg mehet a kijelzés, stb...
(#) gtk válasza ZLED hozzászólására (») Feb 15, 2009 /
 
Pontos egy masodperc: 8 bites timer kulso 32.768KHz orakvarccal es 128 -as eloosztoval.

Nem szoktak a megszakitasba "tul sok" kodot rakni, csak flag-eket . A flag-ekkel jelzel a foprogram fele hogy mikor mi fusson.
(idezett kodnal persze nem a futasido miatt nem lehet sok kod a megszakitasban,..)


Pl:
  1. SIGNAL(SIG_OVERFLOW0) {
  2.  
  3. sec1_flag = 1;
  4. }
  5.  
  6. //.......................
  7. main(){
  8. while(1){
  9.  if (sec1_flag){
  10.     sec1_flag = 0;
  11.     //....................
  12.  }
  13. }
  14. }

Miert hasznalsz 16 bites valtozokat?
0-255 decimalis ertekig mehet 8 bites valtozo.
Torekedj 8 bites valtozok hasznalatara.
(#) Topi válasza gtk hozzászólására (») Feb 15, 2009 /
 
Ha nem két kristályt használsz csak egyet, és az nem kettő hatványa, akkor a következőt célszerű csinálni:

Egy define-ba még a fordítóval kiszámoltadod, mi a timer MAX - 1mp.
Tehát ha egy timer 16bites, proci órajele 4MHz, és az előosztás 256, akkor a következőképpen megy a dolog:

F_timer = 4 000 000 / 256 = 15 625.

Tehát, 15625-et számol a timer másodpercenként. Ezután semmi más teendő nincs, define-ba kiszámolni, hogy:
  1. #define TIMER_VAL (65535-15625) //= 49 910

Ezekután:
  1. SIGNAL(SIG_OVERFLOW0) {
  2.   TCNT0 = TIMER_VAL;
  3.   sec1_flag = 1;
  4. }


Lényegében annyi a trükk, hogy minden interruptban annyit állítunk csak be, hogy hol kell állnia a timer counternek ahhoz, hogy az overflow pont 1 mp múlva következzen be.
Nincs kerekítés, nincs nagy pontatlanság. Maximum napi pár ms csúszás az utasítás végrehajtás miatt.
(#) Grebi válasza Topi hozzászólására (») Feb 15, 2009 /
 
Az abaj hogy akkor meg ezt a hibaüzenetet adja ki nekem, és még annyira sem fut a program mint ahogyan eddig :no:

error2.JPG
    
(#) Topi válasza Grebi hozzászólására (») Feb 15, 2009 /
 
Ne a programozóba állítsd órajelet. Senki nem mondta. Én a project / options-ről beszéltem, ahol a Frequency-t kell állítani.

Ha segítséget szeretnél kapni, vedd a fáradtságot és olvasd el rendesen azt, amit mások írnak Neked, hogy segítsenek.
(#) Topi válasza (») Feb 15, 2009 /
 
Hjajj.
Optionsba tedd vissza a 8 000 000-t. Ez fontos, ez van a cikkben is. Ne maceráld, ha nem tudod mit macerálsz.

Processzor típus, megfelelően legyen kiválasztva. Majd fordíts!

Nyisd meg a programozót, állítsd ott a programozás órajelét az "ISP xxxx"-nél 110KHz környékére. Menj a fuses oldalra, ott hajtsd végre azokat amiket a cikk is leír.
Majd vissza a programozó fülre és égesd be a programot.

Bővebben: Videó

Szerk: Hozzászólást törölte Grebi.
(#) Grebi válasza Topi hozzászólására (») Feb 15, 2009 /
 
Akkor én valamit nagyon elnéztem....
Projet/ confugariton optionsban állítottam átt az órajelet 8000000-ról 1000000-ra és így megfelelően megy az időzités, de a hibaüzenet akkor is megmarad... Ismét elnéztem valamit?
(#) gtk válasza Topi hozzászólására (») Feb 15, 2009 /
 
A delayekkel kapcsolatosan:

A _delay_us, -ms () _delay_loop_1() es _delay_loop_2() fuggvenyeket hasznalja.
Ezek igy neznek ki:

  1. _delay_loop_1(uint8_t __count)
  2. {
  3.  __asm__ volatile (
  4.   "1: dec %0" "\n\t"
  5.   "brne 1b"
  6.   : "=r" (__count)
  7.   : "0" (__count)
  8.  );
  9. }
  10.  
  11. //-----------------------------------------------
  12. void
  13. _delay_loop_2(uint16_t __count)
  14. {
  15.  __asm__ volatile (
  16.   "1: sbiw %0,1" "\n\t"
  17.   "brne 1b"
  18.   : "=w" (__count)
  19.   : "0" (__count)
  20.  );
  21. }


Lathato hogy mindketto volatile, ezert nem szabadna az OPT level-tol fuggjon a delayek pontossaga.
(#) Topi válasza gtk hozzászólására (») Feb 15, 2009 /
 
Idézet:
„Lathato hogy mindketto volatile, ezert nem szabadna az OPT level-tol fuggjon a delayek pontossaga.”


Kapcsold ki az optimalizációt és meglátod mi a valóság
(#) vzoole hozzászólása Feb 15, 2009 /
 
Segítség kéne... nem értem mi a gond ezzel a kódrészlettel:

  1. uint8_t tomb[10] = {NO_0,NO_1,NO_2,NO_3,NO_4,NO_5,NO_6,NO_7,NO_8,NO_9};


Ezt a hibaüzenetet kapom:
../main.c:68: error: expected '}' before ';' token

Ha kiveszem, kikommentezem akkor nincs hibaüzenet.

Ezt szeretném vele kiváltani:


  1. switch(s1000es) {
  2.         case 0: NO_0; break;
  3.         case 1: NO_1; break;
  4.         case 2: NO_2; break;
  5.         case 3: NO_3; break;
  6.         case 4: NO_4; break;
  7.         case 5: NO_5; break;
  8.         case 6: NO_6; break;
  9.         case 7: NO_7; break;
  10.         case 8: NO_8; break;
  11.         case 9: NO_9; break;
  12. } //switch
(#) vzoole válasza vzoole hozzászólására (») Feb 15, 2009 /
 
Megvan a hiba oka... (csak 5300 másodpercbe telt, azóta megy a számláló )

A gond az volt, hogy itt minden sor végére tettem pontosvesszőt:

  1. //Szegmensek                  Pgfedcba
  2. #define NO_0            PORTD = 0b00111111
  3. #define NO_1            PORTD = 0b00000110
  4. #define NO_2            PORTD = 0b01011011
  5. #define NO_3            PORTD = 0b01001111
  6. #define NO_4            PORTD = 0b01100110
  7. #define NO_5            PORTD = 0b01101101
  8. #define NO_6            PORTD = 0b01111101
  9. #define NO_7            PORTD = 0b00000111
  10. #define NO_8            PORTD = 0b01111111
  11. #define NO_9            PORTD = 0b01101111
(#) ATtiny válasza vzoole hozzászólására (») Feb 15, 2009 /
 
Ez így nem hinném, hogy jó lesz. Egy uint8_t tömbben bytokat tudsz eltárolni. Te viszont ilyesmiket akarsz benne eltárolni, hogy PORTD = 0b00111111. Ez pedig egy komplett értékadó utasítás.
(#) Sir-Nyeteg hozzászólása Feb 15, 2009 /
 
Pörög a fórum, így én is kérdezek :
Hogyan lehet/érdemes eepromba beírni helymegtakarítás végett a define-okat? Mint pl az előttem levő hozzászólásában is szereplőket.
Vagy szoktak ilyesmit csinálni?
Elvileg ez teszi ki a programom kb 30-40%-át.
Egy define tartalmazza a 16 segmenses kijelzőhöz szükséges kimenetek állapotát: Port A-B-C-t is.
Illetve ennek az eepromba való beírása fizikailag hogyan történik?
(#) vzoole válasza ATtiny hozzászólására (») Feb 15, 2009 /
 
Pedig működik és jól.

MOD:

#define NO_0 PORTD = 0b00111111

ebből csak ezt hagytam meg:

#define NO_0 0b00111111

De mindkét féle megoldás működik.

(#) gtk válasza Sir-Nyeteg hozzászólására (») Feb 15, 2009 /
 
A
  1. #define
egyszeru behelyettesites. A compiler a hivashoz behelyettesiti a define tartalmat ,majd leforditja asm-re utanna .hex-re (roviden). Ezt hogy akarod eepromba rakni?
eepromba tarolhatsz konstans ertekeket, peldadnal maradva a kijelzore kiirando ertekeket.
1. lassubb mint ha flashbol dolgozna
2. egy rakas plusz muvelet es kod
Pl. szovegnel erdemes eepromot hasznalni, vagy mikor kulso esemeny hatasara szeretnel elmenteni valamit.


(#) gtk válasza gtk hozzászólására (») Feb 15, 2009 /
 
Amugy meg kell adni a section -t ahhoz hogy eepromba keruljon.
eeprom-nal ugy emlekszem hasonlo:

  1. unsigned char buf EEPROM  [64]= {"Na ez eepromba kerul, talan ; - )"};
(#) ATtiny válasza vzoole hozzászólására (») Feb 15, 2009 /
 
A második eset működik, az nem is kérdéses. Az első esetben pedig ezek kerülnének a tömbödbe
  1. uint8_t tomb[10] ={PORTD = 0b00111111,PORTD = 0b00000110,PORTD = 0b01011011,stb...};

Ha ez lefordul, és véletlenül jó is akkor ez csak a compiler jóindulatán múlik.
(#) gtk válasza ATtiny hozzászólására (») Feb 15, 2009 /
 
Ez tenyleg kemeny
De hol hasznalja a "tomb[elem]" -et?
Mert az hogy switch-elt a makrok kozott, az ok, de ennek mi koze e "tomb[]"-hoz?
(#) Sir-Nyeteg válasza gtk hozzászólására (») Feb 15, 2009 /
 
Értem, egyszerű konstanst már írtam eepromba, ill olvastam onnan ki következő bekapcsoláskor.
Csak a célom pl az lett volna, hogy pl egy kijelzéshez a számokat ne a flashbe írjam be minden alkalommal, hiszen ez lényegében konstans, amit úgyis csak meghívok, de nem írom felül soha.
Eepromba be lehet írni pl azt hogy 0xFF? És akkor ezt hívom meg: PORTB= ezzel...
Ekkor egyszerűsödne talán, hisz define-ok helyett eeprom címek szerepelnének a flashben.
Tudom, hogy nem egyszerű és lassú is lenne a kiolvasás, de ezzel lehet hogy nem is spórolnék helyet talán a flashban...
Nah jó, ezt hagyjuk...

Új kérdés:
Ha előre be szeretnék írni az eepromba, az hogy oldható meg? Én erre gondoltam: flashben írok egy progit, hogy írjon a megfelelő helyre értéket, ezt lefuttatnám, majd törlés nélkül beleírnám a programot a flashbe. Ezt nem lehetne kiváltani valamivel?
Hogyan lehet eepromba írni egyből?
(#) ATtiny válasza gtk hozzászólására (») Feb 15, 2009 /
 
Szerintem vzoole az én 7szegmenes ébresztó óra kódomat próbálja átdolgozni Mert abban van így megoldva a kijelzés. Bővebben: Link
(#) gtk válasza Sir-Nyeteg hozzászólására (») Feb 15, 2009 /
 
Erre is valaszoltam az elozo oldalon: #375658

(#) gtk válasza ATtiny hozzászólására (») Feb 15, 2009 /
 
Jo , ez igy mas!
Valami hasonlo megoldas van az en elso homero kodomban is:
Bővebben: Link
(#) vzoole válasza ATtiny hozzászólására (») Feb 15, 2009 /
 
Valóban az órád kódját tanulmányozom, átírom, tesztelem, mi hogy és miért működik.

Miután a tömb működött, mentem tovább... és akkor már láttam hogy értelmetlen a "PORTD = 0b00111111" kifelyezés a tömbben, ezért lett belőle "0b00111111". De mégis működött, talán kedvel a fordító

Köszi mégegyszer a forrást... mióta topi cikkjei letették az alapot bennem, ebből tanultam a legtöbbet.
(#) ATtiny válasza vzoole hozzászólására (») Feb 16, 2009 /
 
Örülök, hogy valaki hasznosnak találja a publikált projektjeimet. Lenne még bőven mit közkincsé tenni, de azért elég sok idő egy olyan anyag összeállítása amit ki tudok rakni a netre. Azért a következő cikk már egész jól áll. Shift regiszteres többszinü LED mátrix vezérlés lesz. Illetve már készül az ezt a mátrixot felhasználó spektrumanalizátor is, bár ez utobbi még odébb van.
(#) hypercube hozzászólása Feb 16, 2009 /
 
Hellósztok.
Szeretnék egy tapasztalt segítőkész embert keresni aki napkollektorom ventillátorjához programot írna. Sajnos anyagiakkal 2000 forinton belül tudok szolgálni egy ilyen munkáért. Nagy segítség lenne ha valamilyen csevegőn keresztül segítene.
Egy Atmega88-as nanoboardom van. A részletekért keress fel légyszíves.
Előre is köszönöm a segítségeteket!
(#) Moderátor hozzászólása hypercube hozzászólására (») Feb 16, 2009
 
1., Jól láthatjuk, vagy csak elírtad? 2000, azaz kettő-ezer Ft?

2., Hirdetés-feladáshoz van egy külön felülete az oldalnak.

3., Elektronikai témakörök csevegőcsatornán való megbeszélését szigorúan elítéljük itt az oldalon, kollektíven.
(#) Barbár hozzászólása Feb 16, 2009 /
 
Hali!

Lenne egy kérdésem...

A "Nyolc láb" cikksorozat alapján próbálok AVR-t programozgatni...

A következő lenne a problémám:

Írok egy C forráskódot, de hogyan tudom .hex -re fordítani, mert végigolvastam a leírt instrukciókat, meg a videót is többször átnéztem, stb... de nekem nem sikerül hexre forditani, és a C kódból, ha jólértelmeztem a leírtakat akkor egyből nem lehet AVR Studio 4 -el Ckódból az AVR-be programozni...


Légyszi segítsetek!

Üdv!

Barbár
(#) ATtiny válasza Barbár hozzászólására (») Feb 16, 2009 /
 
AVR Studio4 az csak IDE. Azaz egy felület, ami megkönyíti a fejlesztést. Ahoz, hogy tudjál C-böl fordítani, kell egy fordító, ami képes AVR -re kódot fordítani. Javaslom a teljesen ingyenes WinAVR -t. Ami be is épül az AVR Studio4 alá. Azaz tudsz olyan projektet csinálni az AVR Studio 4 alá, ami C forrás fájlt használ. Ha bevan állítva az AVR Studio 4-nek, hogy az aktuális projekt C compilert használjon, akkor simán lehet fordítani hex-et az AVR Studio4 alol is. Meg debuggolni is lehet, sőt egyből lehet programozni is az IC-t. Persze csak ha van olyan programozód, amit támogat az AVR Studio.
(#) Barbár válasza ATtiny hozzászólására (») Feb 16, 2009 /
 
Igen, valami ilyesmire gondoltam én is az olvasottak alapján, de nem jöttem, rá h hogyan kell ezt beállítani...

Jelenleg úgy állok h kész hex fájlt bele tudtam írni az IC-be az AVR Studio 4 -el, de igazából saját fájl szeretnék.

(Már feltettem az Win Avr-t, de azzal sem jutottam igazából sokra)

Az említett beállításokban tudnál esetleg segíteni?

Előre is köszi!

Üdv!

Barbár
Következő: »»   103 / 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