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   478 / 840
(#) Reggie válasza blackdog hozzászólására (») Szept 8, 2012 /
 
Ezt csak akkor kell, ha 8 bitnel nagyobb meretu a valtozo. Tehat ha csak uint8_t,int8_t,char tipusu valtozot hasznalsz, akkor nem kell.
Az egesznek az a magyarazata, hogy peldaul egy 16 bites valtozot ket lepesben lehet a memoriaba irni. Eloszor beirja az elso 8 bitet, majd a masodik 8 bitet. Viszont ha beiras kozben tortenik egy megszakitas, akkor balszerencses esetben az also 8 bit mar at van irva, de a felso 8 nem, igy hibas lesz a valtozo erteke. Raadasul, ha visszater a megszakitas, akkor utolag lesz az also 8 bit atirva, igy mar a foprogram szamara is hibas lesz az erteke.
(#) blackdog válasza kurosaki hozzászólására (») Szept 8, 2012 /
 
http://www.hobbielektronika.hu/cikkek/will-i_the_end_robotika_es_av...l?pg=2
Alapvető infókat itt olvashatsz a megszakításokról. A többi Google.
(#) blackdog válasza Reggie hozzászólására (») Szept 8, 2012 /
 
Így már értem. Akkor azért kerülte ez el a figyelmem mert alapvetően arra törekszem, hogy 8bit-nél nagyobb válozók ne legyenek a megszakításokban.
(#) kurosaki válasza blackdog hozzászólására (») Szept 8, 2012 /
 
köszönöm valszeg így mar tudom a 2 IC és megoldást használni meg szakítással Fő IC lesz az ugymond gomb ami egy gombnyomást ad le es a másodlagos IC beveszi a jelet és elinditja az időzítőt köszönöm.
Szerinted ez életképes megoldás?
(#) Reggie válasza kurosaki hozzászólására (») Szept 8, 2012 /
 
A portb1-et mashol kell megadni. A kijelzo frissitesi folyamat igy tortenik:
1. meghatarozod melyik kijelzot akarod frissiteni
2. a kijelzo vezerlo labakat beallitod
3. kivalasztod az adatot
4. kikuldod az adatot.

Egy konkret peldaval:
  1. kijelzo=1; //most ezt a kijelzoreszt frissitjuk
  2. kijelzo_kivalasztas(kijelzo); //itt allitod be a pb1/pb0 labakat
  3. kiirando_adat=adatkivalaszt(kijelzo,adat); //itt hatarozzuk meg mit kell kiirni
  4. PORTD=atalakit(kiirando_adat);  //itt meghatarozza, hogy a szamjegyhez melyik szegmenseket kell meghajtani es kikuldi a portra


Az atalakitashoz van egy tablazat: http://en.wikipedia.org/wiki/Seven-segment_display#Displaying_letters
A hozzászólás módosítva: Szept 8, 2012
(#) kurosaki válasza Reggie hozzászólására (») Szept 8, 2012 /
 
Ha jól értem
  1. uint8_t adatkivalaszt(uint8_t kijelzo, uint8_t adat) {
  2.       uint8_t eltolas;
  3.       uint8_t tmp;
  4.       eltolas=(kijelzo-1)*4; //itt szamoljuk ki, hogy hany bittel kell eltolni
  5.       tmp=adat>>eltolas; //itt eltoljuk az adat tartalmat es egy ideiglenes valtozoba helyezzuk
  6.       tmp=tmp&0xF; //a kapott adatbol csak az also 4 bitet tartjuk meg
  7.       return tmp; //a fuggveny visszateresi erteke a kiirando szam lesz
  8.     }
  9.  
  10.   kijelzo=1; //most ezt a kijelzoreszt frissitjuk
  11.     kijelzo_kivalasztas(PB0); //itt allitod be a pb1/pb0 labakat
  12.     kiirando_adat=adatkivalaszt(00000011); //itt hatarozzuk meg mit kell kiirni
  13.     PORTD=atalakit(kiirando_adat);  //itt meghatarozza, hogy a szamjegyhez melyik szegmenseket kell meghajtani es kikuldi a portra
az utolsóhoz mit kellene írni?. Vagy rosszul értelmeztem?
(#) Reggie válasza kurosaki hozzászólására (») Szept 8, 2012 /
 
Nem teljesen. A kijelzo_kivalasztas is egy fuggveny:
  1. void kijelzo_kivalasztas(kijelzo){
  2.   if (kijelzo==1)  PORTB=(PORTB & 0xFC) | 0x02; //azaz PB1=1 es PB0=0 (alacsony aktiv!!!)
  3.   if (kijelzo==2)  PORTB=(PORTB & 0xFC) | 0x01; //azaz PB1=0 es PB0=1
  4. }


Az adatkivalaszt pedig egy valtozobol valasztja ki a kiirando reszt. Tehat a adatkivalaszt(kijelzo,_VALTOZO) modon kell meghivni.

Az atalakit pedig a linkelt tablazat alapjan csinalja a kivalasztast, amit a bekotesednek megfeleloen kell atirni. Azaz ha a kijelzore 1-et szeretnel kiirni, akkor csak a B es C szegmenst kell bekapcsolni. Tehat az atalakit(1) fuggveny visszateresi erteke lesz 0b00000011.


De a kerdeseidbol ugy erzem, hogy eloszor a C programozasi nyelvet kene gyakorolnod. Ehhez a Petho" A'da'm - abC cimu konyvet javaslom.
A hozzászólás módosítva: Szept 8, 2012
(#) kurosaki válasza Reggie hozzászólására (») Szept 8, 2012 /
 
Hát igen alapon tudom a C ét és ez a multiplex megizzaszt. Lehet meg nézek egy examplét a neten még ha bonyolult is meg próbálom lecsupaszítani.

Előbb linkeltek egy megszakításról kis infót. Azt értem hogy külső láb de egy adott folyamaton belül ez hogy kivitelezhető mert én csak C++ os leírást találtam. Akár mit csinálok belép 100 nál a kijelző és az összes folyamat leáll és végtelen ciklusban a time > 100 ba lépbe és a kijelző kezd el egyre gyorsabban változni.
(#) blackdog válasza kurosaki hozzászólására (») Szept 8, 2012 /
 
Rosszul értelmezel. A megszakítást nem csak "külső láb" válthatja ki. Olvass még egy picit.
Az én esetemben az időzítés nem külső eseménytől függ. És ez csak 1 lehetőség.
Nem értem neked most mire kell a megszakítás.
(#) kurosaki válasza blackdog hozzászólására (») Szept 8, 2012 /
 
Van egy fő folyamatom:
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. //Configurations
  5.  
  6. //**************
  7. // Change constant here to change port used by 7-segment
  8.  
  9. #define PORT_7_SEGMENT PORTB
  10. #define DDR_7_SEGMENT DDRB
  11.  
  12.  #define C4_ON()    PORTD |=  (1<<PIND0)
  13.  #define C4_OFF()    PORTD &= ~(1<<PIND0)
  14.  
  15.  //-------------------------------------
  16.  void m_delay_10ms(unsigned long val) {
  17.          //-------------------------------------
  18.          while(val--) _delay_ms(10);
  19.  }
  20.  
  21.  //-------------------------------------
  22.  void do_delay(uint16_t ms_delay, uint16_t num_ms, uint16_t us_delay, uint16_t num_us)  {
  23.          //-------------------------------------
  24.          uint16_t i;
  25.          
  26.          for(i=0;i<num_ms;i++) _delay_ms(250);
  27.          for(i=0;i<ms_delay;i++) _delay_ms(1);
  28.          for(i=0;i<num_us;i++) _delay_us(250);
  29.          for(i=0;i<us_delay;i++) _delay_us(1);
  30.  }
  31.  
  32.  
  33.  //-------------------------------------
  34.  void generate_tone(uint16_t frequency, uint16_t duration)
  35.  //-------------------------------------
  36.  {
  37.          uint32_t total_delay_time;
  38.          uint16_t total_ms_delay_time, total_us_delay_time;
  39.          uint16_t num_us_delays, num_ms_delays, ms_delay_time, us_delay_time;
  40.          uint16_t num_periods;
  41.          
  42.          total_delay_time = (1000000/frequency)/2-10;
  43.          
  44.          total_ms_delay_time = total_delay_time/1000;
  45.          num_ms_delays = total_ms_delay_time/250;
  46.          ms_delay_time = total_ms_delay_time%250;
  47.          
  48.          total_us_delay_time = total_delay_time%1000;
  49.          num_us_delays = total_us_delay_time/250;
  50.          us_delay_time = total_us_delay_time%250;
  51.          
  52.          num_periods = ((uint32_t)duration*1000)/(1000000/frequency);
  53.          
  54.          while((num_periods--) != 0)
  55.          {
  56.                  do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
  57.                  PORTD |=  (1<<PIND1);
  58.                  do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
  59.                  PORTD &= ~(1<<PIND1);
  60.          }
  61.          
  62.          return;
  63.  }
  64.  
  65. int main()
  66. {
  67.         //Setup
  68.         DDR_7_SEGMENT=0xFF;    //All output
  69.     PORT_7_SEGMENT=00000000;   //All segments off
  70.  
  71.          DDRD = (1<<PIND1);
  72.          
  73.          int time=450;
  74.          int time2=5;
  75.          
  76.          int csipogas=0;
  77.        
  78.  
  79.         while(1)  //loop forever
  80.         {
  81.                
  82.                
  83.                 if (time > 10)
  84.                
  85.                 {
  86.                                 C4_ON();
  87.                         m_delay_10ms(time); //450*10ms = 45s
  88.                         C4_ON();
  89.                         generate_tone(28000,20);
  90.                         m_delay_10ms(1);
  91.                         C4_OFF();
  92.                         time=time-10;
  93.                        
  94.                         // desc=desc+1;
  95.                        
  96.                 }
  97.  
  98.                 else {
  99.  
  100.                         m_delay_10ms(time2); //450*10ms = 45s
  101.                         C4_ON();
  102.                         generate_tone(28000,20);
  103.                         m_delay_10ms(1);
  104.                         C4_OFF();
  105.                         csipogas=csipogas+1;
  106.                        
  107.                         if (csipogas > 20)
  108.                         {
  109.                                 return 0;
  110.                         }
  111.                        
  112.                        
  113.                
  114.                 }
  115.                        
  116.                         }      
  117.        
  118.        
  119. }
Amint látod egy LED és egy Piezo egyszerre működik(bar a led most valamiert nem villog ha meg beleírom hogy nyissa meg a PIND0 as portot világit egyfolytában a led) szóval ide kéne most perpil betenni,hogy a 7 Szegmentes 9Másodperctöl számoljon vissza (mivel nincs még meg a tranzisztor) es ha IF el oldom meg hogy time = 90 akkor ide lép át és nem lép ki ebből a folyamatból.
(#) luluzulu hozzászólása Szept 8, 2012 /
 
Sziasztok!

Szeretnék neki állni meg tanulni micro controrelt programozni. Azt mondták nekem hogy az AVR-ek olcsóbbak, modernebbek, könyebb őket programozni a PIC-ekhez viszonyítva, így hát az AVR mellet döntöttem . Ezért abban kérem a segítségeteket hogy állítsa már valaki össze hardver részét(procesor, égető, meg mi egymás ami kell). Teljesen 0-ról kezdem, egyedül a C nyelv ismerete van meg. Előre is köszönöm a segítséget.

(#) kurosaki válasza luluzulu hozzászólására (») Szept 9, 2012 /
 
Elektronikában mennyire vagy otthon? ha semennyire akkor Ebay röl elég olcson vannak égetők.
(#) kurosaki válasza (Felhasználó 15355) hozzászólására (») Szept 9, 2012 /
 
Énse reklám miatt adtam azt csak ha számít az ár akkor ott olcsóbb és ugyan olyan minőségé mintha itt venné ez csak javaslat volt.
(#) luluzulu válasza kurosaki hozzászólására (») Szept 9, 2012 /
 
Ha van egy kapcsolási rajz meg tudom csinálni. Kb annyira. A tervezés szempontjábol egyszűrű áram körök...
(#) zsolti002 hozzászólása Szept 9, 2012 /
 
Sziasztok. Szeretnék fölprogramozni egy atmega48-at és abban szeretném a segítségeteket kérni hogy hogyan kössem rá a számítógépre soros vagy párhuzamos portra mert eddig lpt porton próbálkoztam Ponyprog2000-el de nem történt semmi. Ha valaki tudna föltenni ide egy rajzot hogy hogyan kössem rá a portra azt megköszönném.
(#) sikolymester válasza luluzulu hozzászólására (») Szept 9, 2012 /
 
Kell neked égető:
Ebből két féle van. Az egyik ami csak felprogramozza az AVR-ed és a program fut rajta. Az hogy mi történik éppen azt nem tudod megmondani csak az alapján amit látsz. Ezt hívják programmernek/égetőnek
Ott a másik fajta, ami a programozás után figyelemmel kíséri a futást. Meg tudod állítani a PC-n az AVR-en futó programot, bele tudsz nyúlni az értékekbe. Ezt hívják debuggernek.

Az előbbi pár ezer Ft, az utóbbi ~13.000 nettótól indul. Az útóbbi neve az AVR Dragon, ez minden menő AVR-t tud programozni, illetve debuggolni is.

Tegyük fel, hogy akarod élvezni a debuggolás előnyeit olcsón, akkor vegyél egy un. Jtag Ice 1 klónt. Ez 3-4 ezer ft körül van, viszont csak néhány AVR-t lehet vele programozni.
Ezeket támogatja: ATmega16(L), ATmega162(L), ATmega169(L or V), ATmega32(L), ATmega323(L), ATmega64(L), ATmega128(L).


Tegyük fel, hogy nem igényled a "debuggolás" előnyeit. Akkor vegyél egy Stk500 klónt, vagy egy AVR ISP mk2 klónt.
Azért mondom a klónokat, mert sokkot kapnál az eredeti STK500 árától.

Az AVR választásnál vegyél egy olyat, aminek sok lába van. Atmega48PA pl.


Persze csinálhatsz olyat is, hogy eleve egy fejlesztő NYÁKot veszel, ami önmagát tudja programozni, pl: https://www.pjrc.com/teensy/
Utóbbi előnye az, hogy nem kell hozzá égető, hanem USB-vel a gépre kötöd és egy programból töltöd rá a kódot.


Ha szeretnéd, hogy valami értelmes történjen is a programoddal, akkor persze nem árt egy próbapanel, illetve különféle dolgok: LED, nyomógomb stb.

Mennyi pénzt szánsz az egészre?
Mondj egy plafont és valaki segít konkrét eszközökkel .
A hozzászólás módosítva: Szept 9, 2012
(#) kurosaki válasza zsolti002 hozzászólására (») Szept 9, 2012 /
 
Programozod van hozzá? Azaz égetőd?
A hozzászólás módosítva: Szept 9, 2012
(#) sikolymester válasza zsolti002 hozzászólására (») Szept 9, 2012 /
 
A legegyszerűbb programozó amit építhetsz az a un. stk200. Itt a fórumon már többször is linkeltek biztosan működő változatot. Minden esetben LPT portról működik. Keress rá.
A hozzászólás módosítva: Szept 9, 2012
(#) zombee válasza zsolti002 hozzászólására (») Szept 9, 2012 /
 
Csatolok egy képet, így kell bekötni. Az 5V-os tápfeszt ne feledd!
Ha gyakran égetsz(és mellé programot is írsz), akkor egy égető beszerzése sem ártana.
(#) kurosaki hozzászólása Szept 9, 2012 /
 
Sziasztok.Lenne egy kérdésem.Az én USBASP émen mirt MOSO van? nincs rajta MOSI vagy a MISO hiányzik.Lehet ez miatt nem tudom a CLock ot állitani?Error setting USBasp ISP Clock ezt kapom.
(#) vilmosd válasza luluzulu hozzászólására (») Szept 9, 2012 /
 
Idézet:
„Azt mondták nekem hogy az AVR-ek olcsóbbak, modernebbek, könyebb őket programozni a PIC-ekhez viszonyítva”
Ki mondta ezt a "!@#$*&^" ? PIC kaphato mar 110 forinttol, egy PIC24FJ256GA106 64 labas joszag 1310 forint. Amikor C-ben programozol, szinte mindegy milyen vas van a fordito utan. Viszont egy PicKit3 tudja programozni az osszes PIC tipust tizezer forintert. Bocs de serti a fulem az ilyen beszolas. Majd mikor kizartad magad egy ket uC-bol kiderul mi az olcso.
(#) kurosaki válasza vilmosd hozzászólására (») Szept 9, 2012 /
 
Miért kell szegényt így lehordani? nem értesz vele egyet ok de ne így írd le szegény megrémül.Énis ezt olvastam de én PIC és AVR programozót is vettem de AVR el kezdtem el foglalkozni.
(#) vilmosd válasza kurosaki hozzászólására (») Szept 9, 2012 /
 
En nem lehordtam, csak megalapitottam hogy ez olyan kijelentes ami nem allja meg a helyet. Ilyet lehet sajnos sokat olvasni itt a forumon( nem csak uC-kkel kapcsolatban) Pistike (12 es 1/2 eves) kijelenti hogy ez a jo, es Jozsika igy mar tudja is a frankot, es nagy hangon o is kijelenti ugyanazt. En a '80-as evek eleje ota foglalkozom mikroprocesszorokkal, de nem tudom kijelenteni egyertelmuen melyik a jobb. Mindnek van elonye, es hatranya.
(#) kurosaki válasza vilmosd hozzászólására (») Szept 9, 2012 /
 
jo igaz de énse tudtam dönteni. Egy IC képes párhuzamosan 2 dolgot végezni??? mert nekem külön kéne ,hogy Számoljon és Külön kéne működtetni 2 Lábat.
(#) vilmosd válasza kurosaki hozzászólására (») Szept 9, 2012 /
 
Akar sokkal tobb dolgot is lehet egy uC-vel "egyszerre" csinaltatni. Persze nem egyszerre, de szepen egymasutan. Viszont gyorsan dolgoznak, tehat egy kulso szemlelo ugy latja, hogy azonos ideju a vegrehajtas. Egyszeru pelda egy hofokszabalyzo: a uC beolvassa a hoerzekelot, kiszamolja a homersekletet, kiirja a LCD-re a szoveget, kiszamolja a szabalyzast, vezerli a futest egy kimeneten, kezeli a gombokat. Persze hogy nem egyszerre, szepen egymas utan. Ez a programiro feladata, hogy minden funkciot egyenkent megirjon, majd ezeket a funkciokat egy rendszerbe fogva beprogramozza a uC-nek.
(#) luluzulu válasza vilmosd hozzászólására (») Szept 9, 2012 /
 
Nekem így mondták. Én egyikről sem tudok semmit sem a PIC-et sem az AVR-t nem ismerem. Meg akarom tanulni őket programozni. Nekem most így tudatlanként mindegy hogy melyiket kezdem el. Ha azt mondod hogy PIC-et kezdjek akkor azt kezdem... Ismétlem nem értek hozzájuk.


Egy fejlesztői környezetet tudtok mondani amit meg tudok építeni?
(#) vilmosd válasza luluzulu hozzászólására (») Szept 9, 2012 /
 
En Atmel-re nem tudok igy hirtelen. Csinaltam egy par demo panel tervet, a PIC-es temakban fellelheto a doksi. Persze ez PIC-re. Kis atalakitassal meg lehet oket csinalni Atmelre is. Egyszeru nyomogomb, LED, AD bemenet, LCD csatlakozo.
(#) zsolti002 válasza zombee hozzászólására (») Szept 9, 2012 /
 
Köszönöm a segítséget mindenkinek, sikerült fölprogramozni. Csak simán rákötöttem az lpt-re és jó lett.
(#) luluzulu válasza vilmosd hozzászólására (») Szept 9, 2012 /
 
Lehet hogy meg változtatom a döntésem PIC re mert eszembe jutott hogy van egy tanárom aki foglakozik PIC-el. Az AVRt majd később...
(#) Csépe Zoltán hozzászólása Szept 9, 2012 /
 
Mitől lehet, hogy az alábbi hiba üzenetet kapom:


> "make.exe" program
avrdude -p attiny45 -P com2 -c stk500v2 -U flash:w:main.hex

avrdude: stk500v2_command(): command failed
avrdude: stk500v2_command(): command failed
avrdude: stk500v2_program_enable(): cannot get connection status
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.


avrdude done. Thank you.

make.exe: *** [program] Error 1

> Process Exit Code: 2
> Time Taken: 00:01
Következő: »»   478 / 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