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   337 / 840
(#) Ricsi89 válasza (Felhasználó 15355) hozzászólására (») Júl 2, 2011 /
 
Már próbálkoztam, de csak egy kérdőjelet kapok végeredménynek.
(#) zombee válasza yoman917 hozzászólására (») Júl 2, 2011 /
 
Hello!

Ha ilyet akarsz...

  1. kijelez(fesz);
  2. _delay_ms(1000);
  3. kijelez(amper);
  4. _delay_ms(1000);


...akkor időzítő interruptot kell használnod, vagy az _delay_ms() helyére a kijelzőrutint kell tenned. Ez utóbbi egyszerűbb:
  1. void kijelzes(meres_szam, meres_varakozas)
  2. {
  3.   for(unsigned char i=0; i<meres_szam; i++)
  4.   {
  5.     kijelzo(analog_meres())
  6.     for(unsigned char j=0; j<meres_varakozas; j++) _delay_ms(1);
  7.   }
  8. }


Ha 7 szegmenses kijelzőt használsz, akkor a multiplexáláshoz mindenképp érdemes időzítő interruptot használni. Ekkor te csak egy (volatile) változót írogatsz át, amit az interrupt dekódol és kiküld a kijelzőre.
7 szegmenses kijelzőnél pedig - szerintem - alap a shift regiszter(pl. 74HC595) és az SPI használata. Nekem sem sikerült legelsőre(kb. 2 éve volt), de hamar összehoztam egy működő kijelzőrutin-sort.
Én az SPI átvitelhez is interruptot használok, természetesen. Ha már magyarázok, bemásolom az általam megírt és használt kijelző-rutinokat:
  1. #define byte unsigned char
  2. #define word uint16_t
  3. #define DISPLAY_TOGGLE_ST(); { PORTB |= 1<<4; PORTB &= ~(1<<4); }
  4. byte digits [4];
  5. volatile byte displaydata[4] = {16,16,16,16};   //kijelző számadatai - kezdetben sötét!
  6. volatile byte points = 0;                                               //kijelző (tizedes)pontjai - kezdetben sehol nincs
  7.  
  8. //       222
  9. //      1       0
  10. //      1       0
  11. //       333
  12. //      7       4
  13. //      7       4
  14. //       666  5
  15.  
  16. // negatív logika!!!
  17. byte numbers [24] =
  18.         {      
  19.                 0b00101000,     //0
  20.                 0b11101110,     //1
  21.                 0b00110010,     //2
  22.                 0b10100010,     //3
  23.                 0b11100100,     //4
  24.                 0b10100001,     //5
  25.                 0b00100001,     //6
  26.                 0b11101010,     //7
  27.                 0b00100000,     //8
  28.                 0b10100000,     //9
  29.                 0b01100000,     //A
  30.                 0b00100101,     //B
  31.                 0b00111001,     //C
  32.                 0b00100110,     //D
  33.                 0b00110001,     //E
  34.                 0b01110001,     //F
  35.                 0b11111111,     //ÜRES
  36.                 0b01110000,     //P
  37.                 0b11101111,     //pálcika1
  38.                 0b10111111,     //pálcika2
  39.                 0b01111111,     //pálcika3
  40.                 0b11111101,     //pálcika4
  41.                 0b11111011,     //pálcika5
  42.                 0b11111110      //pálcika6
  43.         };
  44.  
  45. byte digits [4] =
  46.         {      
  47.                 0b00001110,
  48.                 0b00001101,
  49.                 0b00001011,
  50.                 0b00000111
  51.         };
  52.  
  53.  
  54.  
  55. void display_init()
  56. {
  57.         TCCR2 =  0b00000100;    // TIMER2 előosztó: 64
  58.         TIMSK |= 0b01000000;    // TIMER2 túlcsordulás interrupt engedélyez
  59.  
  60.         //74HC595 shift regiszter kompatíbilis SPI átvitel.
  61.         //spi - SPI interrupt enable, SPI enable, MSB first, MASTER, clk polarity + phase off, SPI CLK = f(CPU)/16
  62.         SPCR = 0b11010001;
  63.         sei()//interruptok engedélyezése
  64. }
  65.  
  66.  
  67. //interruptok által használt változók:
  68. volatile byte out_2;
  69. volatile byte spi_num;
  70. volatile byte displaynum = 1;                   //kijelző aktuális számjegye
  71.  
  72. #define  point          0b11011111                      //tizedespont helye
  73.  
  74.  
  75. //2. időzítő megszakítása:
  76. ISR(TIMER2_OVF_vect)
  77. {
  78.         spi_num = 0;
  79.         out_2   = numbers[displaydata[displaynum]] & ( points&(1<<displaynum) ? point:255 );
  80.         SPDR    = digits[displaynum];
  81.                                                                         //biztos ami biztos: első bájt kijelölése
  82.         //out_2   = digits[displaynum];                         //beállítjuk a második átküldendő bájtot(számjegy pozíciókódja)
  83.         //SPI átvitel kezdete - első bájt(számjegy kódja+tizedespont):
  84.         //SPDR    = numbers[displaydata[displaynum]] & ( points&(1<<displaynum) ? point:255 );
  85.         displaynum++;
  86.         displaynum &= 0b00000011;                                       //következő számjegy
  87. }
  88.  
  89. //SPI átvitel befejezését kezelő megszakítás:
  90. ISR(SPI_STC_vect)
  91. {
  92.         if(spi_num)  //második bájt átvitle után
  93.         {
  94.                 DISPLAY_TOGGLE_ST();//mindkét bájt átvitele befejeződött: shift regiszter átkapcsolása...
  95.  
  96.                 spi_num = 0;
  97.         }
  98.         else            //első bájt átvitle után
  99.         {
  100.                 SPDR = out_2;           //SPI átvitel kezdete - második bájt(számjegy engedélyező kód)
  101.                 spi_num++;
  102.         }
  103. }
(#) Ricsi89 válasza (Felhasználó 15355) hozzászólására (») Júl 2, 2011 /
 
Itt simán lehet ugyanúgy számolni, mint egész számoknál.
Közben rájöttem, hogy mi volt a gond. A projekt beállításoknál szúrtam el egy dolgot, már jó a lebegőpontos kijelzés.
(#) atideath hozzászólása Júl 2, 2011 /
 
Sziasztok!

Tegnap edisonnal megtaláltuk a hibát. Hátha valaki ugyanebbe a helyzetbe kerül elárulom mi volt a galiba.
A Bascom belső programozója hiába írja azt hogy támogatja az USBasp-t mégsem programozta fel rendesen. Miután megpróbáltam a khazama égetővel programozni az AVR-t egyből működött. Jó sokat szívtam vele .

Újjabb kérdés. Akarok motorra csinálni egy kis kijelzőt. Az akksi figyelés megvan, a hőmérséklet mérés megvan, sebességi fokozat kijelzés megvan, már csak egy kicsike problémám van. Amikor LCD-re akarom kiíratni a sebességet és a fordulatot akkor maga a szám folyamatosan villog (holott most csak egy konstans értéket iratok ki ami nem változik). Minden más meg normálisan működik, magyarul nem villog.

Valakinek valami ötlet?

  1. Seb_kepernyo:
  2.    If Valtas = 1 Then
  3.       Cls
  4.       Valtas = 0
  5.    End If
  6.    Locate 1 , 1
  7.    Lcd "SEB:            "
  8.    Locate 1 , 11
  9.    Lcd "Km/h"
  10.    Locate 2 , 1
  11.    Lcd "                "
  12.    Locate 3 , 1
  13.    Lcd "FOR:            "
  14.    Locate 3 , 12
  15.    Lcd "RPM"
  16.    Locate 4 , 1
  17.    Lcd "                "
  18.    Locate 3 , 6
  19.    Lcd Ford
  20.    Locate 1 , 6
  21.    Lcd Seb
  22. '   Waitms 1000
  23.  
  24.   Gosub Gear_sub
  25. Return
(#) zsuscsinyo válasza Ricsi89 hozzászólására (») Júl 2, 2011 /
 
Ha WinAVR-el fordítod, akkor a Makefile-ba állítsd be a float típust a printf() menüpont alatt, és máris nem ír kérdőjelet.
(#) Reggie válasza atideath hozzászólására (») Júl 2, 2011 /
 
Termeszetesen villogni is fog, mert nem mindig ugyan azt irod ki: eloszor letorlod a teruletet, majd utana kiirod a szamokat, aztan megint letorlod, es megint kiirod a szamokat.
(#) yoman917 válasza zombee hozzászólására (») Júl 2, 2011 /
 
Hello
Én úgy ugrottam neki, hogy irtam az amper és a volt kijelzésre egy void fesz() és egy void amper() -t és a főprogramban ezt hivtam meg. Viszon így nem értem el vele a kívánt sikert, ha az Ampert írtam előre, akkor csak azt jelezte, ha az feszt, akkor azt, és nem volt semmiféle váltogatás. Olyasmit szeretnék összehozni, mint amit az első programban írtál, de sajnos nem nagyon értem. A 7 szegmensű kijelzőt nem multiplexeléssel írtam meg, hanem egy kijelző vezérlő ic vel.
(#) trudnai válasza atideath hozzászólására (») Júl 2, 2011 /
 
Nem tudom hol irod ki a szamokat, de nekem ugy tunik, hogy minden alkalommal letorlod a szamot (space-ekkel felul irod), majd elkepzelesem szerint (mert ezt a reszet nem osztottad meg velunk) valahol ujra kiirod. Namost ha kozben varakozol, akkor egy kis ideig ugye semmi fem lesz a kijelzon, majd megint lesz valami es igy tovabb, tehat villogni fog.

A legjobb modszer erre en szerintem ha nem irod felu space-ekkel a helyet, hanem kiirod a szamot es az a rutin biztositja, hogy a szam elott vagy utani resz torlodjon ahogy szukseges... C-ben printf-el eleg egyszeru megcsinalni ezt, Bascom-ban nem tudom, nem ismerem -- lehet manualisan kell kiszamolnod a kiirando szam hosszat.
(#) Andras0 hozzászólása Júl 3, 2011 /
 
Sziasztok!

Vasaroltam egy Atmega16-ot, elkeszitettem hozza a panelt es hala Istennek mukodik minden tokeletesen.

Kerdesem leene hogy miert van kuldom az Avcc es az Agnd? Kossem ra simman a vcc-re es a gnd-re?
(#) Ricsi89 válasza Andras0 hozzászólására (») Júl 3, 2011 /
 
Simán rákötheted. Azért van külön, mert az az analóg rész, az ADC tápfesze. Ezt lehetne szűrni is, hogy minél stabilabb legyen, ne ingadozzon, mert akkor ez befolyásolja az ADC mérési eredményét. Az adatlapban ha jól tudom van is példa a szűrésre.
(#) zombee válasza Ricsi89 hozzászólására (») Júl 3, 2011 /
 
Az AGND az szerintem mehet simán a GND-re még analóg mérésnél is, egyedül az AVCC-t kell szűrni.
Egyébként, ha nem végzel analóg mérést, sima portlábként használod a PORTA oldalt, akkor összekötheted az AVCC-t a VCC-vel.

Az adatlapban megadott értékek viszont hibásak, mert a szűrésnél nagyobb tekercs(minimum 47uH) és nagyobb kondi(minimum 10uF) aminél a zavarás már elhanyagolgató volt.

Ha valaki profi akar lenni, vegyen/igényeljen 12-16 bites I2C felóletű ADC konvertert(sok ilyen Microchip és Texas termék van), kösse rá egy I2C izolátorra(pl. ADUM1250) és akkor semmilyen zavar nem fog belemenni...
(#) yoman917 válasza yoman917 hozzászólására (») Júl 3, 2011 /
 
Sikerült megoldani a problémát két for ciklussal
(#) Andras0 válasza zombee hozzászólására (») Júl 3, 2011 /
 
Mennyire nagy tekercset tehetek, akar 100 uH?
Kondibol lehet 100 uF?
(#) zombee válasza Andras0 hozzászólására (») Júl 3, 2011 /
 
Ha nagyobb az nem probléma, lehet 100uH tekercs és 100µF kondi is, kondinál a polaritásra ügyelj.
(#) sikolymester válasza Andras0 hozzászólására (») Júl 3, 2011 /
 
Különböző nézőpontok vannak arra, hogy az un. analóg föld és analóg tápot hogyan kell elválasztani a digitálistól. Egy azonban biztos: Ha adott egy IC-d, amin van analóg és digitális föld is, akkor azt mindenképpen közvetlenül kell összekötni a lehető legrövidebb úton.
Ami az analóg tápot illeti (jelen esetben ugye AVCC), ott ízlések és pofonok, hogy ki hogyan jár el.
(#) kendre256 válasza sikolymester hozzászólására (») Júl 3, 2011 /
 
"Egy azonban biztos: Ha adott egy IC-d, amin van analóg és digitális föld is, akkor azt mindenképpen közvetlenül kell összekötni a lehető legrövidebb úton."
Ha ez igaz lenne, akkor nem csinálnának neki két kivezetést, hanem rögtön a tokon belül összekötné a gyártó. Az ilyen összekötésből tud kialakulni jó kis digitális zavar az analóg bemeneten.
Szerintem az analóg földet a mérendő analóg feszültség földpontjára kell kötni. Ha elég kicsi a mérendő jel, vagy nagyon pontosan kell mérni, akkor teljesen különálló vezetékkel. Hasonló az eset, mint az erősítők esetén, ahol a kisjelű és a nagyjelű földeket csillagpontosan kell összekötni, hogy a nagyjelű rész áramai ne okozzanak visszahatást, zavart a kisjelű áramkörökben. Én jártam már úgy, hogy egy áramkör digitális részének áramimpulzusaiból eredő zavart csak úgy tudtam megszüntetni a hangfrekvenciás fokozatokban, hogy több méterre "vissza" kellett vezetnem az analóg GND-t.
Olyan megoldást is használtunk, hogy egy panelen külön volt az analóg és a digitális GND vezetékelve, és egyetlen ponton voltak összekötve, a panelen lévő stabilizátorokhoz közel. Itt viszont relatíve nagy analóg jelek voltak (2V effektív).
(#) Reggie válasza kendre256 hozzászólására (») Júl 3, 2011 /
 
Azert az eros tulzas, hogy tokon belul ossze lenne kotve, mert akkor nem lennenek olyan IC-k sem, amelyeknek tobb VCC es GND laba van.
De a tobbiben igazad van, csak azzal egeszitenem ki, hogy a kulonvalasztaskor arra kell ugyelni, hogy a GND-k es AGND kozott nem lehet nagy feszultseg kulonbseg. .(Adatlap irja a maximumot, emlekeim szerint 0.5V koruli ertek.)
(#) zombee válasza Reggie hozzászólására (») Júl 3, 2011 /
 
A digitális zavarból eredő eltérések millivoltos nagyságrendűek, természetesen. De ez már be tud zavarni...

Én jártam már úgy - igaz, itt digitális bemenetekkel - hogy a belső 47kOhm felhúzó ellenállást használtam egy 3 méteres vezetéken, hogy a másik végén lévő nyomógombot érzékelje. Ez még működött volna, ha a nyomógomb mellett nincs egy LED-sor amit szintén az AVR(egy tranzisztoron keresztül) vezérelt.
Ahogy a LED kivillant, a nyomógombos vezetéken vissza is rúgott rendesen. Úgy, hogy lenyomást is érzékelt, ami az alkalmazott rendszerben nagyon nem volt kívánatos, lényegében: meghülyült!
Itt már biztosan kellett egy -2.5V-os impulzus, anélkül nem érzékelte volna.

Visszatérve: a tápforráshoz nagyon közel külön kell ágaztatni a digitális és analóg földet+tápfeszt, HA valóban analóg méréshez kell.
Egyébként egy IC-nek(mindegy hogy analóg vagy sem) azért van több föld és táp lába, mert így az IC áramfelvétele egyenletesebben oszlik el. A lábakat és a szilíciumlapkát összekötő aranyhuzal nagyon vékony...
(#) erdoszoli hozzászólása Júl 4, 2011 /
 
Sziasztok
Megerősítést szeretnék kérni. AvrStudio4 progival , avrtavir-es STK500 programozóval, atmega88 chipet használva, be szeretném állítani a kódvédelmet, magyarán h más ne tudjon kiolvasni semmi t a chipből.
A LOCKBiteknél a BLB0 és BLB1 biztosítékot LPMand SPM prohibited in ... -ra állítva még kiolvasható minden nem ? az LB -t is át kéne állítanom, akkor viszont ha frissülne a programom akkor én se férek hozzá a chiphez többet. <- Ezt jól sejtem, vagy nem ?>
(#) sikolymester válasza kendre256 hozzászólására (») Júl 4, 2011 /
 
Most így hirtelen az Analog devices oldalát tudom linkelni, ahol ők ezt javasolják: Bővebben: Link
Az ő iránymutatásaik a termékeikkel kapcsolatban rendszerint helytállóak a véleményem szerint.
Bővebb kifejtést itt lehet tőlül találni: Bővebben: Link

Illetve egy nem Analog devices oldal, de egy érdekes szemlélet, ami kellőképpen indokolva lett szerintem: Bővebben: Link
(#) sikolymester válasza erdoszoli hozzászólására (») Júl 4, 2011 /
 
A BLB0 és a BLB1 fuseok csak az SPM és LPM utasításokat tiltják meg. Amit te szeretnél az a LB állítása. Ekkor nem lehet kiolvasni a kódod. Ha ezeket beállítod, akkor az Erase Device parancs után megint tudod írni az AVR-t. Ekkor a lockbitek nullázódnak, illetve ez a parancs kitörli a programmemóriát.

Aggódni nem kell, a lockbitekkel nem tudod magad kizárni a programozásból.
(#) erdoszoli válasza sikolymester hozzászólására (») Júl 4, 2011 /
 
Köszönöm sikolymester
Megnyugodtam , attól féltem hogy kizárom magam. Még a kezdetek kezdetén volt rá példa, aztán nem akarok visszaeső chipkizáró lenni
További szép napot!
Zoli
(#) erdoszoli válasza erdoszoli hozzászólására (») Júl 4, 2011 /
 
Illetve bocsánat még egy kérdésem lenne.
Egy ATTINY26 os chipre is van egy programom , az viszont .rom kiterjesztésű, és a studio-val nem tudom felprogramozni . A flash fájlnál kell gondolom kiválasztani , alapból ugye nem is tudom , mert vagy .hex, vagy .a90 kiterjesztésű lehet, de a minden fájllal ráerőszakolom és a program gombra a folyamatjelzőnél ezt kapom :
Getting isp parameter.. SD=0x0c .. OK The specified file is not a valid Intel HEX file
Erre valami tipp valakinek? Ezt is jólenne felprogramoznom valahogy. Programozó még mindig stk500, és egyenlőre az AVR Studio van programként.
Zoli
(#) sikolymester válasza erdoszoli hozzászólására (») Júl 4, 2011 /
 
Az elvileg egy codevision fordító által generált program. Mivel más szabványt használ, mint az AVRStudio, így közvetlenül nem is fogja tudni az felprogramozni. Így hirtelen azt javaslom, hogy töltsd le a Chipblaster programot, ami a codevision különálló flashelő programja. Ez ugyan kódkorlátos, de van egy olyan érzésem, hogy az attiny26-nak a maximálisan lehetséges kódja is belül esik ezen. A program működik a járatos programozókkal, így az stk500(klónokkal) is.

Ebben mondjuk a fuse bit jelölés kicsit félreérthetően van azt hiszem, így javaslom, hogy szedd le a pipát a "Program Fuse Bit(s)" résznél. Illetve a Program/Flash parancsot add ki, miután betöltötted a .rom filet. Így tuti nem fogod átprogramozni a disable reset láb fuse-t pl. .
(#) erdoszoli válasza sikolymester hozzászólására (») Júl 4, 2011 /
 
Szia
kipróbáltam ugy hogy adtam tápot, és ugy hogy csak a programozóról kapott, ez a hibaüzenetem ami csatolva van.
Úgyfest ehhez lett kitalálva mert a project fájlom is megvan, azt betöltve, tulajdonságainál a rom és eep fájlt kiválasztva , program all fülnél a fuse biteket (elővigyázatosság miatt) kipipálva, majd a program/flash gombra kattintva jött elő ez a hiba.
A settingsnél az ATMEL stk500 lett kiválasztva COM port stimmel. Már azzal is játszottam hogy a rendszertulajdonságokban a programozó baud rate-jét átállítottam 9600ról más értékre de ugyanaz.. Valami tipp?

hiba.JPG
    
(#) erdoszoli válasza erdoszoli hozzászólására (») Júl 4, 2011 /
 
Úgyfest probléma orvosolva van , mert a chipblasterrel betöltöm, és újra elmentem a fájlokat .hex -be és így már a studioval is tudom programozni . Örülés van
Zoli
(#) atideath hozzászólása Júl 5, 2011 /
 
Egy gyors kérdés.
Van két jelem:
0...12V Amplitúdó, 164Hz frekvencia
0..5V Ampli, 1130 Hz

Meg tudom ezt mérni valahogy Atmega8-al? Ha igen akkor hogyan? Köszönöm előre is!
(#) sikolymester válasza atideath hozzászólására (») Júl 5, 2011 /
 
Természetesen az a kérdés, hogy mennyire pontosan vagy rá kíváncsi. Shannon törvény ugye 2x mintavételi frekvenciát jelent. De ha szeretnél is valamit kezdeni a mintavételezett jeleddel, akkor minél nagyobb a mintavételezés frekvenciája, annál jobb.

Jobb híján megnézed az adatlapot, hogy a nyers számok mit mondanak az ADC mintavételi sebességéről. Ha az egy nagyságrenddel meghaladja a mintavételezni kívánt jeled, akkor a válasz az az, hogy meg lehet mérni.

Azt, hogy pedig hogyan teheted ezt meg: Beállítod az ADC modult, majd meghatározott időközök között, pl egy timerra illesztett interrupt segítségével mintavételezed a jeleket egy tömbbe. És máris megmérted a jeleket.

A 12V-os feszültségű jelet természetesen egy feszültségosztóval szintilleszted.
(#) Reggie válasza zombee hozzászólására (») Júl 5, 2011 /
 
Nem igazan az aranyhuzal a szuk korlat, mert abbol legfeljebb egy nagyobb padre tobbet bondolnanak, hanem a femezesi retegeken(ami mar nem aranybol van ugye) kialakitott vezetekezesen nagy a vesztesseg. Azert is rakjak kulon oldalakra a tapkivezeteseket, hogy a femezesi retegen a bekotestol szamitott maximalis tavolsagot csokkenteni lehessen.
(#) atideath válasza sikolymester hozzászólására (») Júl 5, 2011 /
 
Konkrétan nekem nem is a frekvencia lenne a lényeges hanem az amplitúdó. Mennyire kell pontos? Ez a motoromon a sebesség és a fordulatszám. Ebből kellene meghatároznom. Végülis a Hz az mindig ugyanannyi.
Következő: »»   337 / 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