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   187 / 840
(#) gtk válasza vagnerjazon hozzászólására (») Feb 13, 2010 /
 
Hogy keress ra? CTRL + F writefuse.
Alapbol benne van, de nem foltetlenul. Lehet hogy mas programmal volt programozva az eszkoz es onnan allitotta be a fuse biteket.
(#) vagnerjazon válasza trudnai hozzászólására (») Feb 13, 2010 /
 
Nekem ez a Tools menü (kép) és ha rákattintok hogy programozza, nem jön semmilyen ablak, hanem rögtön elkezdi a programozást. A beállításokat is néztem, de ott se találtam.

winavr.png
    
(#) vagnerjazon válasza gtk hozzászólására (») Feb 13, 2010 /
 
Én úgy kerestem, hogy kimásoltam az egész szöveget, majd jegyzettömbben beillesztettem, és ott lehet keresni, de egy helyen van olyan szó, hogy fuse, de az sem az lehet, mert nem úgy néz ki, mintha az lenne.
(#) gtk válasza vagnerjazon hozzászólására (») Feb 13, 2010 /
 
Akkor nem tudom mi ez a windows trutyimutyi. (Bocsanat hogy beleszoltam. Nekem Linux alatt ugyanazokkal a programokkal mint amiket a WinAVR keretrendszer hasznal igy van ahogy leirtam. ) Nezd meg a help-jeben, vagy neten, hogy hogyan kezeli a fuse-okat.
(#) trudnai válasza vagnerjazon hozzászólására (») Feb 13, 2010 /
 
Mivel programozod a chipedet? En a WinAVR menujere gondoltam, de ha nem azzal akkor lehet jobb ha koveted azt a Makefile-os modositasi javaslatot (meg lehet egyekent is azt kellene tenned)
(#) vagnerjazon válasza trudnai hozzászólására (») Feb 13, 2010 /
 
Nekem nem így néz ki a WinAVR, de már mindegy is, mert letöltöttem a ponyprog-ot, és azzal be tudtam állítani a fuse biteket. Most már nem osztja 8-cal a frekvenciát.
(#) vagnerjazon hozzászólása Feb 13, 2010 /
 
Nincsen véletlenül valakinek egy olyan C program, ami csak annyit csinál, hogy az egyik kimenetre kötött hangszórót egy bizonyos hangon szólaltatja meg? Konkrétan az kéne, hogy "A" hangot (tehát 440Hz) szólaltasson meg, de ne hagyja abba, hanem amíg kap tápfeszt, szóljon. Ha netán tud valaki ilyet, az legyen szíves, írja le! Köszönöm.
(#) gtk válasza vagnerjazon hozzászólására (») Feb 13, 2010 /
 
555-el is meg lehet oldani. Amugy kell egy vegfok a hangszoro ele.

(#) vagnerjazon válasza gtk hozzászólására (») Feb 13, 2010 /
 
Tudom, hogy meg lehetne oldani 555-tel, de én abban nem bízom és direkt avr-rel szeretném. Minek kell végfok a hangszóró elé?
(#) (Felhasználó 4577) válasza vagnerjazon hozzászólására (») Feb 13, 2010 /
 
Dehogy nincs.
Pont itt van az oldalon az egyik cikkben.
Bővebben: Link
A generate_tone() függvényt keresd.
(#) (Felhasználó 4577) válasza vagnerjazon hozzászólására (») Feb 13, 2010 /
 
Azért, mert az AVR Output portja nem bír el akkora áramot.
Egy egyszerű FET-el tudsz csinálni végfokot.
(#) vagnerjazon válasza (Felhasználó 4577) hozzászólására (») Feb 13, 2010 /
 
Köszönöm a segítséget!
Sikerült átírni a programot, működik is. Végfok nem kellett, mert egy fejhallgatóból kitermelt kis hangszórót elbír önmagában is, sőt, még hangos is volt, és kellett tennem elé egy ellenállást, hogy halkabb legyen!
(#) niches hozzászólása Feb 13, 2010 /
 
Sziasztok!

Az alább leírtakhoz kérném a segítségeteket, mivel nem vagyok még járatos sem a soros kommunikációban, sem az interruptok használatában.

Tehát a szitu: adott egy atmega164p mikrovezérlő, amivel egy rs422 szabvány szerint kommunikáló abszolút szöghelyzet érzékelő jelét kell feldolgoznom, és a példaprogramban a szöghelyzetet 8 leden megjeleníteni. (Egy része itt van már a témámnak: Szöghelyzet jeladó )

Az illesztés max485 chipekkel történik. A szöghelyzet dekódernek szüksége van differenciál órajelre, erre kell az egyik chip. Cserébe a másik illesztő chipen visszajön a szöghelyzet értéke.

A kommunikációhoz az usart1-et használom, mert a nulláson már van egy max232.

Azt szeretném, ha folyamatosan frissülne az érték, azaz ahogy tekerem az érzékelőt, a ledek is fussanak.

Jelen állapotában csak resetelésre ugrálnak a ledek, de sajnos nem úgy tűnik, hogy sorban, hanem rendszertelenül.
Kérdés, hogy a folyamatos használathoz elkerülhetetlen az interrupt használata? Mi lehet a gond?
  1. int main(void)
  2. {
  3. //******************************
  4. //Regiszterek beállítása soros kommunikációhoz
  5.         UCSR1A=0x00; //Kétszerező U2X1 bit kikapcsolva
  6.         UCSR1B=0x18; //Vevő engedélyezve, küldő engedélyezve
  7.         UCSR1C=0x47; // szinkron mód, paritásképzés tiltva, 8bites adat, órajel felfutó élre érzékel
  8.         UBRR1H=0x00;
  9.         UBRR1L=0x47; //órajel Osztó 71, azaz 9600 bps
  10. //******************************
  11. //Portok irányultságának beállítása a DDRn regiszterekkel
  12. DDRA=0xFF;
  13. DDRB=0xFF;
  14. DDRC=0xFF;
  15. DDRD    =(1<<PD4) //XCK jel
  16.         |(1<<PD5) // stabil 1 jel
  17.         |(1<<PD6); // stabil 0 jel
  18.  
  19. //Változódeklarálás, sorosan fogadott szögérték lesz az U változóban
  20.  
  21. unsigned char U;
  22.  
  23. PORTD|=(1<<PD5); // konstans 1 az órajel adó chipre
  24. PORTD&=~(1<<PD6); // konstans 0 a vevőre
  25.  
  26. while(1) //Végtelen ciklus
  27.         {
  28.        
  29.         while(!(UCSR1A &(1<<RXC1))) ;
  30.        
  31.         U=UDR1; //PD2 lábra (Rx1) kötött soros konvertált érték, 8 bit
  32.        
  33.         if (U>=0 && U<=31)
  34.                         PORTA=0x01;
  35.         else if (U>=32 && U<=63)
  36.                         PORTA=0x02;
  37.         else if (U>=64 && U<=95)
  38.                         PORTA=0x04;
  39.         else if (U>=96 && U<=127)
  40.                         PORTA=0x08;
  41.         else if (U>=128 && U<=159)
  42.                         PORTA=0x10;
  43.         else if (U>=160 && U<=191)
  44.                         PORTA=0x20;
  45.         else if (U>=192 && U<=223)
  46.                         PORTA=0x40;
  47.         else if (U>=224 && U<=256)
  48.                         PORTA=0x80;
  49.         else PORTA=0x0F;
  50.        
  51.         _delay_ms(1); //1 ms várakozás
  52.        
  53.                                                                
  54.         } //Végtelen ciklus vége
  55. }
(#) (Felhasználó 4577) válasza vagnerjazon hozzászólására (») Feb 13, 2010 /
 
5V igencsak sok neki, mert egy fejhallgatónak 775mV az optimális, ezt nem túl jó ötlet túllépni.
Azt hittük, hogy piezo-t használsz, ilyen helyre azt szokás.
(#) vagnerjazon válasza (Felhasználó 4577) hozzászólására (») Feb 13, 2010 /
 
Akkor jó is, hogy tettem elé ellenállást (lehet hogy nagyobbat fogok elétenni). Először piezo-t használtam, de nem tetszett a hangja, ezért cseréltem ki.
(#) trudnai válasza vagnerjazon hozzászólására (») Feb 13, 2010 /
 
Idézet:
„Végfok nem kellett, mert egy fejhallgatóból kitermelt kis hangszórót elbír önmagában is”


Azok tipikusan 32 ohmosak, igy nyilvan 5V-os tapot feltetelezve 156mA kornyeken kell lennie az aramnak, tehat valoban el kell birnia. De ha ugyanezt 8 vagy 4 ohmos hangszoroval probalnad meg, akkor mar nem biztos sikerulne a produkcio.
(#) vagnerjazon válasza trudnai hozzászólására (») Feb 13, 2010 /
 
Kipróbáltam egy kb. 7Ω-ossal is, és az is ment simán, és a várt hangerőhöz képest egészen hangos volt.
(#) trudnai válasza vagnerjazon hozzászólására (») Feb 13, 2010 /
 
Persze, hogy megy (egy drabig), csak minel jobban terheled a kimenetet annal jobban esik a kimeno fesz (magyaran gyanitom nem 5V lesz ott neked, hanem joval kevesebb). De ettol fuggetlenul ez nem a helyes ut, ilyenkor mar meghajto fokozatot kell epiteni (akar egy BC182 es egy bazis ellenallas is megteszi egy kisebb hangszoro eseten).
(#) labi válasza vbalint hozzászólására (») Feb 13, 2010 /
 
Sziasztok, had osszak meg egy tapasztalatot.
Vásároltam egy AVRISP mk2-t, mindent terv szerint csináltam, telepítettem (Avr Studio+WinAvr) stb. Eljött a nagy pillanat, hogy csatlakozom a készülékhez és a következő hibaüzenetet kaptam: "No target was detected. Ensure that target has power." A készüléken pedig a piros led világított. Végeredmény: az AVRISP mk2 nem szolgálja ki az áramkört táppal tehát külső táp kell neki. Sőt, hogy a piros led is elaludjon és működjön a programozó a céláramkör tápfeszültségét össze kell kötni a programozo Vcc (pin2) lábával. Ugyanis ez itt bemenetként szolgál amit az Avr Studio-val mérhetünk is.
(#) poznamokus hozzászólása Feb 14, 2010 /
 
Sziasztok!
Vettem egy eposz-os AVR JTAG ICE USB 2-t az MSC-nél. Az AVR studio nem is meri fel (no target device detected). Mit lehet csinálni? Feltelepítettem a gépre az FT232 chip driverét, de semmi. 5let?
(#) (Felhasználó 4577) válasza poznamokus hozzászólására (») Feb 14, 2010 /
 
A nem felismerés és a "no target device detected" közt azért van egy kis különbség.
Az AVR programozáshoz Angol tudás mindenképpen kell, anélkül nem is érdemes elkezdeni, mert minden angol nyelvű hozzá.
Azt jelenti, hogy nem kötöttél rá AVR-t.
(#) (Felhasználó 4577) válasza labi hozzászólására (») Feb 14, 2010 /
 
Igen, ez természetesen így van.
Kellemetlen ha van egy 3.3V-os áramköröd, rádugot a programozót és elszáll pár dolog az 5V miatt. Az ISP nem fogja tudni, hogy Te most hány V-os áramkörrel dolgozol, egy gyári programozó se ad tápot a céláramkörre.
(#) poznamokus válasza (Felhasználó 4577) hozzászólására (») Feb 14, 2010 /
 
Auu, reggel volt. Szóval - no supported board found hibát ír ki. Ilyenkor az USB-s kommunikációval van a gond? Mert amikor a soros portos JTAG ICE-omat kötöttem be USB-RS232 átalakító kábellel, akkor is ezt írta. FTDI chipet kéne felprogolni?
(#) tukko hozzászólása Feb 15, 2010 /
 
Sziasztok! Full nem értek az avr programozáshoz és nem szeretnék nagyon belemélyedni, mert nincs időm! Ezt építem éppen és már csak az Attiny13 avr programozása van hátra! Elvileg egy hex fájlt kéne beletenni (IR_ATX_power4.hex)! Van egy STK200 programozóm amit összekötötem az Attiny13-mal! Aztán itt elakadtam nem tudom hogyan tovább sosem csináltam még ilyet! Ha valaki segíten nekem (esetleg távoli asztal segitségével) azt megköszönném!
Még valami ilyen infrát vettem hozzá! Ezzel is működhet mert a kapcsolási rajzon más volt csak olyat nem találtam!
(#) (Felhasználó 4577) válasza tukko hozzászólására (») Feb 15, 2010 /
 
A fuse biteket is be kell állítanod: Int. RC Osc. 4.8MHz startup time: 14 CK + 64ms

A hardver résznél csak annyi a dolgot, hogy összekötöd a megfelelő lábakat és adsz 5V tápfeszültséget a mikrokontrollerre.

Fel kell telepítened a Bascom-ot, mert az AVR Studio nem kezeli az STK200-at: http://avr.tavir.hu/modules.php?name=Content&pa=showpage&pid=6
(#) ixel hozzászólása Feb 15, 2010 /
 
Sziasztok!

Próbálom megépíteni a NIXIR csöves órámat ezt cBővebben: Link a megoldást akarom átalakítani úgy, hogy nekem már a négy cső és a négy driver IC rá van építve egy panelra. Tehát nem multiplex kijelzésre gondoltam, hanem külön külön portokkal. A kódrészletem a következő lenne:
  1. //BCD kod kimenet perc egyesek B melyik Pinjére vannak kötve
  2. [code=c]#define BCD_P_A (1<<PINB0)
  3. #define BCD_P_B (1<<PINB1)
  4. #define BCD_P_C (1<<PINB2)
  5. #define BCD_P_D (1<<PINB3)
  6.  
  7. //BCD kod kimenet perc tizesek B melyik Pinjére vannak kötve
  8. #define BCD_TP_A (1<<PINB4)
  9. #define BCD_TP_B (1<<PINB5)
  10. #define BCD_TP_C (1<<PINB6)
  11.  
  12. //BCD kod kimenet óra egyesek D melyik Pinjére vannak kötve
  13. #define BCD_O_A (1<<PIND0)
  14. #define BCD_O_B (1<<PIND1)
  15. #define BCD_O_C (1<<PIND2)
  16. #define BCD_O_D (1<<PIND3)
  17.  
  18. //BCD kod kimenet óra tizesek D melyik Pinjére vannak kötve
  19. #define BCD_TO_A (1<<PIND4)
  20. #define BCD_TO_B (1<<PIND5)
  21.  
  22.  
  23. //A BCD kód perceknel kell bekapcsolni, hogy megjelenjenek a számok
  24.  
  25. #define LED_P_0 PORTB= ~(1<<PINB0)&~(1<<PINB1)&~(1<<PINB2)&~(1<<PINB3)
  26. #define LED_P_1 BCD_P_A
  27. #define LED_P_2 BCD_P_B
  28. #define LED_P_3 BCD_P_A| BCD_P_B
  29. #define LED_P_4 BCD_P_C
  30. #define LED_P_5 BCD_P_A | BCD_P_C
  31. #define LED_P_6 BCD_P_B | BCD_P_C
  32. #define LED_P_7 BCD_P_A | BCD_P_B | BCD_P_C
  33. #define LED_P_8 BCD_P_D
  34. #define LED_P_9 BCD_P_A | BCD_P_D
  35.  
  36.  
  37. //A BCD kód percek tizesnél kell bekapcsolni, hogy megjelenjenek a számok
  38.  
  39. #define LED_TP_0 PORTB= ~(1<<PINB4)&~(1<<PINB5)&~(1<<PINB6)
  40. #define LED_TP_1 BCD_TP_A
  41. #define LED_TP_2 BCD_TP_B
  42. #define LED_TP_3 BCD_TP_A| BCD_TP_B
  43. #define LED_TP_4 BCD_TP_C
  44. #define LED_TP_5 BCD_TP_A | BCD_TP_C
  45. // Gombok Port B-n 4,7K-val sorosan a Föld felé zárnak
  46. // Port B Pinek ahol a Gombok vannak
  47. #define GOMB_H  7       //Órák      
  48. #define GOMB_M  6       //Percek
  49. #define GOMB_SA 5       //Set Alarm
  50. #define GOMB_ST 4       //Set Time
  51.  
  52.  
  53. #define GOMBCIKLUS 60   //Gombok késleltetésére. Minél nagyobb a szám annál lasabban működnek a gombok
  54.  
  55. //A Csipogó melyik Pinre van kötve a PORT D -n
  56. #define BUZZER 0
  57.  
  58. #define ALARM_SEC 59  //max. hány másodpercig ébresszen az óra. A minimum 1 a maximum 59!
  59.  
  60. #define NORMAL 0
  61. #define ALARMSET 1
  62. #define OFF 0
  63. #define ON 1
  64.  
  65. // ----- Globális változók -------
  66. volatile uint8_t hour = 12;
  67. volatile uint8_t min  = 0;
  68. volatile uint8_t sec  = 0;
  69.  
  70. // -------------------------------
  71.  
  72.  
  73.  
  74.  
  75.  
  76. // -------- Késleltetés ---------
  77. void delay(uint8_t wait)
  78. {
  79.  while(wait>0)
  80.  {
  81.   wait--;
  82.  }
  83. }
  84. void kijelzes(uint8_t h,uint8_t m)
  85. {
  86.  
  87.  
  88. uint8_t kijelzo_P[10]={LED_P_0,LED_P_1,LED_P_2,LED_P_3,LED_P_4,LED_P_5,LED_P_6,LED_P_7,LED_P_8,LED_P_9};
  89.   PORTB = kijelzo_P[m%10] ;//Perc alsó helyiérték
  90.          
  91. uint8_t kijelzo_TP[6]={LED_TP_0,LED_TP_1,LED_TP_2,LED_TP_3,LED_TP_4,LED_TP_5};
  92.  
  93. PORTB = kijelzo_TP[m/10] ;int main()
  94. {
  95.  
  96.    
  97.  
  98.    
  99.  // Init port pins
  100.         DDRB = (1<<DDB0)|(1<<DDB1)|(1<<DDB2)|(1<<DDB3)|(1<<DDB4)|(1<<DDB5)|(1<<DDB6); // B port 0,1,2,3,4,5,6 -es PIN output
  101.         DDRD = (1<<DDD0)|(1<<DDD1)|(1<<DDD2)|(1<<DDD3)|(1<<DDD4)|(1<<DDD5)|(1<<DDD6); // D port 0,1,2,3,4,5,6 -os PIN output
  102.  
  103.  
  104.  
  105.        
  106.        
  107.         // Setup timer1 16bites
  108.     TCCR1B |= (1<<WGM12)|(1<<CS11)|(1<<CS10);  // CTC mode,  preselect ratio : 64      
  109.  
  110.         TCNT1 = 0;            // timer1 szamlaloja legyen 0
  111.     OCR1A = 15624;        // timer1 Compare A (15625) 1Hz ! 0...15624 az pont 15625
  112.        
  113.         TIMSK |= (1<<OCIE1A); // timer1 Compare Match A megszakitas bekapcsolas
  114.        
  115.         sei();    //megszakítás bekapcsolás  
  116.  
  117.     while(1)
  118.     {
  119.  
  120.  
  121. kijelzes(min,sec);
  122.  
  123.          
  124.          
  125.          
  126.  
  127.         }
  128. }
  129.  
  130.  
  131. // ----------------------- Megszakítás Timer0 Comp A -------------------------
  132. ISR(TIMER1_COMPA_vect)   //2000000Hz/64/31250 = 1Hz -es megszakítás
  133.  
  134.  
  135. {
  136.  sec++;
  137.  if(sec>59)
  138.  {
  139.   sec = 0;
  140.   min++;
  141.   if(min>59)
  142.   {
  143.    min = 0;
  144.    hour++;
  145.    if(hour>23)
  146.    {
  147.     hour = 0;
  148.    }


Az a gondom, hogy amikor tovább lép a kijelzo_TP[6]-on a PORTB-t PB0-tól PB3-ig átállítja egyre és így a kijelzés nem jól működik.
Nem tudom mennyire voltam érthető, az lenne a cél, hogy a NIXIE driver IC-ket külön portokról akarom meghajtani.
(#) ATtiny válasza ixel hozzászólására (») Feb 15, 2010 /
 
Inkább csatold a kódot, mert így lemaradt a fele...
(#) ixel válasza ATtiny hozzászólására (») Feb 16, 2010 /
 
Még csak itt tartok, a gombkezelésekkel még nem foglalkoztam, a 88.-tól a 91-ig vizsgálom a debugot és próbaként a B0-3-ig portra egy-egy LED-et tettem és próbaként a másodpercet próbálom kijeleztetni, csak azt tapasztalom, hogy amikor beszúrom a 91. sort , akkor mind a négy led el kezd világítani egy bizonyos fénnyel és a mellékletben is látszik, hogy a négy kimenet egybe megy át.
(#) ATtiny válasza ixel hozzászólására (») Feb 16, 2010 /
 
Több problémát is látok a kódodban. Először is nem jól törlöd egy port megfelelő bitjeit

Ezeket:
  1. PORTB= ~(1<<PINB0)&~(1<<PINB1)&~(1<<PINB2)&~(1<<PINB3)


Át kéne írni erre:
  1. PORTB &= ~((1<<PINB0)|(1<<PINB1)|(1<<PINB2)|(1<<PINB3))


Nyilván a biteket állítsd be ahogy neked kell.
(#) ixel válasza ATtiny hozzászólására (») Feb 16, 2010 /
 
Köszönöm szépen, valóban ez egy hiba volt, hiába a gyakorlat teszi a mestert. Mégegyszer köszönöm, lehet, hogy még jövök egy pár kérdéssel.
Következő: »»   187 / 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