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   140 / 840
(#) patexati hozzászólása Aug 9, 2009 /
 
Sajna nem indul be az usb égetőm azt szeretném megkérdezni ,hogy az ATmega8-16 AVR-t milyen kapcsolással tudnám ellenőrizni,hogy jó e? A programot bele tudom írni egy LPT égetővel csak egy kis kapcsolás kéne mi ellenőrizné jó e az AVR A kapcsolásban 8MHZ-es kvarc van meg az lpt égetőben is szerintetek jó az ajánlott 12MHz helyett? Elindulni el kéne vele nem?
(#) mammut válasza patexati hozzászólására (») Aug 9, 2009 /
 
Ja! Szerintem ez egy szoftveres USB (LibUSB) kommunikáció, amin kommunikál az égető ATMega8-a. A szoftverben a meghatározó időzítések és megszakítások miatt szerintem csak az erdetileg előírt órajelen lesz képes ezt a kommunikációt működtetni az IC az USB-vel.
Ha itt laknál közelben intéznék feléd egy 12MHz-es OSC-t, mert teli vagyok vele, ilyen EM600-as mérőmodulokban vannak ilyenek...
(#) gallz hozzászólása Aug 9, 2009 /
 
Sziasztok!

Most ismerkedek a mikrovezérlők világával és úgy látom, hogy a nyolc lábú sorozat számomra nagyon jó kiindulási alap! Nagyon tetszik a dolog, eddig csak sikerélményeim vannak!
Elkezdtem építeni egy miniPOV-ot. Amit egy bicikli kerékre szereltem.
Mivel 5 LED-em van, gondoltam a hatodik porton egy reed-relével lehetne a kerék fordulatszámát figyelni és így pontosabban lehetne a LED villanásokat szabályozni. Egy kilométer óra reed-relét használok, de nem tudom, hogy kössem be az áramkörbe, hogy működjön.
Elég, ha a bemeneti portra rákötöm az +5V feszültséget és a relé kapcsolgatná a lábat? Vagy ez nem ilyen egyszerű?

(#) 5cmarzo hozzászólása Aug 9, 2009 /
 
Hello!

A kezdeti sikereken túl vagyok, és most elhatároztam, hogy egy 1 digites számlálót csinálok. A problémáim a következők:
- A TIMER0-t hogyan kell használni időzítésre?
- Azt meglehet oldani, hogy az egyes értékek (1, 2, 3 ... stb.) táblába legyen rendezve, mint a PIC-nél?
- És ha igen, akkor hogy olvasom ki, mert nem találtam ehhez hasonló parancsot RETLW.

Valakinek van ilyen példaprogramja? (a google-t már keresztül kasul átböngésztem, és nem találtam olyat, ami assembler nyelven van)
(#) vegyészmérnök válasza 5cmarzo hozzászólására (») Aug 9, 2009 /
 
Szia! Itt egy asm programrészlet 7-szegmenses kijelző kótáblázattal. A "digit2" nevű regiszter tartalmazza a a digit értékét (0...9) és az R18-as regiszterbe olvassa be a táblázatból a hozzá tratozó kóot. A TIMER-t megszakításos módon érdemes használni, az órajelnek és az időzítésnek megfelelő előosztást alkalmazva...

7segment.txt
    
(#) vegyészmérnök válasza gallz hozzászólására (») Aug 9, 2009 / 1
 
Szia! A legegyszerűbb az, ha a láb és a föld közé kötöd be a Reed-relét, a lábon pedig bekapcsolod a felhúzó ellenállást. Ha a relé bekapcsol, akkor 0, egyébként pedig 1 szint lesz a bemeneten. Ha szükséges, akkor a prellmentesítést szoftveresen (késleltetéssel) meg lehet oldani.
(#) gallz válasza vegyészmérnök hozzászólására (») Aug 9, 2009 /
 
Kösz a gyors választ! Igy már működik, (relé kapcsol, villogás, stop-start) viszont valami nem tökéletes, mert ha a kódba beteszek egy ELSE ágat, akkor azt nem hajtja végre.

  1. int main (void) {
  2.   DDRB = 0b00011111;
  3.  
  4.   while(1){
  5.      if(!(PINB & (1<PINB5))){
  6.          PORTB = 0b00011111;
  7.      }
  8.      else PORTB = 0b00010001;
  9.   }
  10. }


Lehet, hogy a felhúzóellenállással van a gond.
A relé a PB5 lábon van ami RESET is egyben. Úgy olvastam, hogy ezen a lábon már van egy beépít ellenállás. Próbáltam egy 100K és egy 4.7K -t is, de nem változott a helyzet. Végül is nem gond, mert nem akarok az ELSE ágon semmit, csak bosszant egy kicsit
(#) 5cmarzo válasza vegyészmérnök hozzászólására (») Aug 9, 2009 /
 
Köszi a segítséget!
Nagy lendületet adtál nekem! Mégegyszer köszi!
(#) vegyészmérnök válasza gallz hozzászólására (») Aug 9, 2009 /
 
Nem lehet, hogy azért nem hajtja végre az else ágat, mert az utólag akartad bele írni, és ha egyszer már a reset lábat ki/bemenetnek állítottad, akkor utána már nem tudod programozni?
(#) ddr válasza gallz hozzászólására (») Aug 9, 2009 /
 
Szerintem az if végét lehagytad innen!
Ha az egész forráskódot becsatolnád, biztos meglenne a hiba.
(#) vzoole válasza gallz hozzászólására (») Aug 9, 2009 / 1
 
C kódot így szurj be:

(code=c)kód(/code)

persze szögletes zárójelekkel.
(#) janyjozsef válasza patexati hozzászólására (») Aug 9, 2009 /
 
Így van! Csak a 12MHZ-es quartz-al fog menni. A szoftveres USB megy nagyobbal is, de azt a program fordításánál meg kell adni, mivel az USB különböző szabványai (1.0 2.0 stb) az adat továbbítására kötött bit időzítéseket használnak. Ezt a program adott quartz-hoz számolja. Nézd meg, hogy a program milyennel van lefordítva és olyat használj. Egy quartz ára kb 70HUF. Fontos, hogy ne cseréld fel a D+ és D- lábakat. Ja és az USB-kódba nem szabad megszakítást használni!
(#) patexati válasza janyjozsef hozzászólására (») Aug 10, 2009 /
 
Köszi mindkettőtöknek! Majd beszerzek egyet sajna itt nem olyan egyszerű mert messze kell menni rendelni meg most rendeltem azt a hónapra elfogyott a keret . Nekiállok guberálni hátha találok valamiben egyet
(#) gallz válasza ddr hozzászólására (») Aug 10, 2009 /
 
Akkor beszúrom a teljes kódot, vzoole ajánlása szerint.
Mikrovezérlő: ATtiny45

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. #define DELAY 13
  5.  
  6. void display(int v) {
  7.     PORTB = v;
  8.     _delay_ms(DELAY);
  9. }
  10.  
  11. int main (void) {
  12.   DDRB = (1<<PINB0)|(1<<PINB1)|(1<<PINB2)|(1<<PINB3)|(1<<PINB4)|(0<<PINB5);
  13.  
  14.   while(1){
  15.         if(!(PINB & (1<<PINB5))){
  16.                 display(0x1f); //H
  17.                 display(0x04);
  18.                 display(0x1f);
  19.        
  20.                 display(0x00);
  21.  
  22.                 display(0x1f); //E
  23.                 display(0x15);
  24.                 display(0x11);
  25.        
  26.                 display(0x00);
  27.        
  28.                 display(0x1f); //L
  29.                 display(0x10);
  30.                 display(0x10);
  31.        
  32.                 display(0x00);
  33.  
  34.                 display(0x1f); //L
  35.                 display(0x10);
  36.                 display(0x10);
  37.        
  38.                 display(0x00);
  39.        
  40.                 display(0x0e); //O
  41.                 display(0x11);
  42.                 display(0x0e);
  43.        
  44.                 display(0x00);
  45.         }
  46.         else display(0x01); // ez csak azért, hogy lássam mi történik különben.
  47.   }
  48.  
  49.   return 0;
  50. }
(#) ddr hozzászólása Aug 10, 2009 /
 
Hm. Szóval nem fut le az else ág?

Próbáld meg így is :

if (!bit_is_set(PINB, 5)) { ... }
else { ... }
(#) ddr hozzászólása Aug 10, 2009 /
 
Én is kérdeznék, PWM-nél hogy lehet megadni, hogy melyik lábon jelenjen meg a kimenet?
(#) ddr válasza ddr hozzászólására (») Aug 10, 2009 /
 
Közben rájöttem, az OC0A lábon lesz a timer0 esetén.
(#) gallz válasza ddr hozzászólására (») Aug 10, 2009 /
 
Átállítottam a bemenetet egy másik lábra és felhúzóellenállásal lefut az else ág. De így csak 4 LED-em marad. Lehet, hogy rossz a mikrovezérlőm!?
(#) janyjozsef válasza ddr hozzászólására (») Aug 10, 2009 /
 

  1. if(!(PINB & (1 << PINB5))){
  2.  
  3. Helyette
  4.  
  5.  
  6. if( (PINB & (1 << PINB5)) != 0)
  7. {
  8. }else
  9. {
  10. }
  11.  
  12. Néha a fordító nem csípi a ! operátort.
  13.  
  14. Vagy a PIND5 helyett PD5
[/OFF]
(#) janyjozsef válasza gallz hozzászólására (») Aug 10, 2009 /
 
Ja és a PORTB 5-öt tedd 1 be;
PORTB = 0x20;
(#) MaSTeRFoXX hozzászólása Aug 10, 2009 /
 
Sziasztok!

Érdekes dologba botlottam bele, winavr-el fejlesztek.

Írtam egy függvényt, ami összehasonlít 2darab stringet (fájl kiterjesztést), és ha egyezés van akkor 1-el tér vissza különben 0-val, eddig nem nagy cucc, ez a része működik.

  1. uint8_t compare_ext(const char* str)
  2. {
  3.         uint8_t *ptr;
  4.         ptr=&fi.extension;
  5.         while (pgm_read_byte(str) != 0x00)
  6.         {
  7.                
  8.                 if(*ptr!=pgm_read_byte(str)) return 0; //nincs egyezés
  9.                 ptr++;
  10.                 str++;
  11.         }
  12.         return 1; //sikeres volt
  13. }


Na most a mainben egyszer csak valahol meghívom

  1. if(compare_ext(PSTR("MP3\0")))
  2. {                                              
  3.                                comstr("Ez MP3\0");
  4. }
  5.  
  6.  
  7. //vagy
  8. if(compare_ext(PSTR("BMP\0")))
  9. {                                              
  10.                                comstr("Ez BMP\0");
  11. }


Mind a kettő lefut, pedig ha csak úgy kiíratom a függvények eredményét akkor helyesen az egyik 0 a másik 1-el tér vissza

Most akkor találtam egy bug-ot vagy mit rontok el? Olyan egyszerű lenne, de már vagy két órája ezzel szenvedek.
(#) MaSTeRFoXX válasza MaSTeRFoXX hozzászólására (») Aug 10, 2009 /
 
Megoldódott, hozzá kellett rakni egy ==1-et, bár elvileg enélkül is működnie kellett volna, pedig ez előtt ez se segített
  1. if(compare_ext(PSTR("MP3\0"))==1)
(#) janyjozsef válasza MaSTeRFoXX hozzászólására (») Aug 10, 2009 /
 
Néha a fordító az if feltételben nem ismeri fel a ! jelet vagy csak simán a benne található értéket. Valószínűleg csak bool típust tud felismerni (így is kellene működnie).

Tehát mindenkinek mondom WIN AWR esetén mindig!!! írja az if feltételbe, hogy a benne található érték mivel kellene, hogy egyenlő legyen. különben szívhat, mint itt már sokan.
(#) vzoole válasza janyjozsef hozzászólására (») Aug 10, 2009 /
 
Ezt már én is tapasztaltam... téptem is a hajam, hogy mit csesztem el.
(#) gtk válasza janyjozsef hozzászólására (») Aug 11, 2009 /
 
Ez erdekes..
Rengeteg kod van pedig igy irva a halon gcc-re.
A sajat kodjaim 100%ban igy vannak irva, es soha nem tapasztaltam semmi problemat. Lehetseges hogy nem mindegyik verzional van ez a hiba.
(#) Topi válasza gtk hozzászólására (») Aug 11, 2009 /
 
Tényleg érdekes. Valószínű valami optimalizációs dolog lehet. Masterfoxx! Küldj nekünk a kérdéses részről LSS-t!
Hadd tanuljunk a dologból. Én kipróbáltam most, és nekem teljesen jól megy a konkrét feltétel nélkül is.

Sokat segítene, ha küldenél egy LSS-t mindkét fordított kódból a kérdéses részről és hogy milyen optimalizáció mellett keletkezett ez a kód.

Én nagyon gyanítom, hogy optimalizáció lesz a bűnös. Én szinte kivétel nélkül Os és O1-el dolgozom. De optimalizáció nagyon problémás tud lenni. C kódjaimban ezért elég sűrűn található "asm volatile", naked isr, inline függvények. Borzalom miket művel az optimalizáció ha az ember vakon csak C-ben fordít mikrovezérlőre.
(#) janyjozsef hozzászólása Aug 11, 2009 /
 
Valaki tudja a választ?


A következő problémám van AVR studiót használok WIN AVR fordítóval. Ha egy PL T0-ába egy változó értékét növelem (m_Wait++) és volatile WORD m_Wait; ,akkor a kódom kb 2k-val nagyobb mint akkor, ha elhagyom a volatile kulcsszót. Az m_Wait egy függvényben van felhasználva mint késleltető, ahol egy while nézi az értékét. Mi lehet az oka a horrorisztikus kódméret növekedésnek?
Optimalizációtól független a növekedés. Ha viszont csak nyúlfarknyi a program, akkor volatile-val vagy anélkül sincs kódméret váltoizás.

Ja és, ha nem volatile a T0-ban legalább 1db változó, akkor szimulátorban meny, de a valóságban nem megy a T0.

Előre is köszönöm a válaszokat.
(#) Topi válasza janyjozsef hozzászólására (») Aug 11, 2009 /
 
ha a _delay_ms-nek nem konstans paramétert adsz, akkor befordítja a float library-t. Emiatt növekszik meg a kódméret.

Nem szégyen az LSS fájl olvasása, abból sok turpisság kiderül.
(#) janyjozsef válasza Topi hozzászólására (») Aug 11, 2009 /
 
Konstans paramétert használok a Wait(WORD wait) függvény bemeneti paraméterének, így nincs befordítva a float rész.
Nem a _delay_ms -fg-t hívogatom, hanem sajátot.
(#) roleeka hozzászólása Aug 12, 2009 /
 
Sziasztok!

Szeretnék AVR-ekkel foglalkozni, de teljesen kezdő vagyok. Mit ajánlotok hol kezdjem az ismerkedést?

Szeretnék először egyszerű kapcsolásokon keresztül megismerkedni a programozással.
Ha van valakinek valami magyar nyelvű doksija erről a témáról azt szívesen venném.

Előre is köszi a segítségeteket.
Következő: »»   140 / 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