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   546 / 840
(#) bocios hozzászólása Júl 2, 2013 /
 
Sziasztok!

Látott valaki esetleg, valamelyik webáruházban ATtiny20 12U-1 chip -et?
Erre a típusra lenne szükségem, ez 1.4mm x 1.5mm méretű.
Illetve még kérdés, hogy ezt mely programozókkal tudom Winavr -ből programozni?
Olyan is érdekelne ami otthon építhető, de ha van webáruház az is érdekelne.

Köszi!
(#) elektros90 hozzászólása Júl 2, 2013 /
 
Sziasztok.
Végre sikerült működésre bírni egy 2x16 karakteres LCDt.
Mindent szépen mutat amit kiiratok vele addig, amíg rá van csatlakoztatva a programozó (AVR Doper). Amint kihúzom a gépből, vagy a lecsatlakoztatom a kábeljeit, a szöveg helyére teli négyzetek futnak fel szépen sorban. Programozó nélkül, reset után pedig az első sorban csak teli négyzetek vannak, a 2. sor pedig üres. Miután bedugom a dopert, megjelenik a szöveg. Próbapanelen van összedrótozva.
Mi okozhatja?
A hozzászólás módosítva: Júl 2, 2013
(#) Srajmund válasza Massawa hozzászólására (») Júl 2, 2013 /
 
Szia! Én az ebay-en rendeltem.
(#) zsozsoX hozzászólása Júl 2, 2013 /
 
Sziasztok
Olyat akarok csinálni, hogy 8 változót egy bájtba írni.
pl. változó1=1, változő3=1 az 0b00000101 vagy változó6=1, változő5=1 változó2=1 az 0b00110010
Segítséget előre i köszönöm.
(#) Szabi1 válasza zsozsoX hozzászólására (») Júl 2, 2013 /
 
Szia én még AVR/microchipet soha nem programoztam, de PC programoknál így helyes c++ba
: a deklarációs résznél:
  1. void main ()
  2. {
  3. unsigned char data = 0; // ha más függvényekbe használod akkor ne ide írd hanem az include-ok utáni deklarációs részbe
  4. }

És akkor:

  1. data &= ~0b00000001; // D0=be
  2.  data |= 0b00000001;    // D0=ki
  3.  data &= ~0b00001000; // D3=be
  4.  data |= 0b00001000;    // D3=ki
(#) zsozsoX válasza Szabi1 hozzászólására (») Júl 2, 2013 /
 
Köszönöm a segítséget, ugytünik ez kell nekem.
(#) elektros90 hozzászólása Júl 2, 2013 /
 
Sziasztok. Előrébb jutottam. Egyszerű V & A mérőt programoztam mega8 al.
Igy iratom ki a displayre:

  1. sprintf(text, "%.4fV", voltage);
  2. lcd_puts(text);


A voltage változó double, mert a következő hibát kapom ha float.

"Warning 1 format '%f' expects argument of type 'double', but argument 3 has type 'float' [-Wformat]

Hogyan tudnám ezt orvosolni? Továbbá azt, hogy ha pl. 2,01V a fesz, akkor is 2,010V ot írjon ki. Most ugrál a tizedeshely és fixnek szeretném, mert elég zavaró.
Előre is köszönöm, ha segít valaki egy kezdő AVRezőnek.
(#) vzoole válasza elektros90 hozzászólására (») Júl 3, 2013 /
 
Szia!

Nézd át a sprintf függvény paraméterezését.
Így én se tudom, mindig akkor szedem elő ha kell éppen.

Bővebben: Link
Bővebben: Link
(#) macsaba hozzászólása Júl 3, 2013 /
 
Sziasztok!

Nekifogtam az avr programozásnak, de hamar elakadtam. Megépítettem az ebben a cikkben található, soros porti avr programozót. Építettem továbbá egy kicsit bonyolultabb eszközt ami majd egy PC tápot fog vezérelni labortápként egy ATmega8-al. Sajnos becsúszott egy kis hiba, mégpedig hogy a nyák tükrözve lett. Ez csak az AVR esetén jelentett kisebb problémát de annyival megoldottam hogy a lábait áthajtottam a másik irányba. Ezzel csak az a baj, hogy nagyon apró repedések keletkeztek a lábakon ezért gondoltam nem szedem ki a foglalatból hanem beforrasztok a foglalat lábaihoz egy pár kábelt a programozáshoz. Szépen bekötöttem mindent, majd, hogy ne egyből a mély vízbe ugorjak bele akartam égetni egy egyszerű programot ami csak az AVR D-portjára kötött led kijelző 2 ledjét villogtatja. Ponyproggal csináltam mindent úgy ahol a cikkben van hibaüzenetet sehol sem kaptam, mikor kiolvastam a memóriát ugyanazt kaptam, mint amit beleégettem. Majd amikor ráadom az AVR-re a tápot semmi. Multiméterrel is megnéztem, semmi. A programozó lábak egy-egy gombra vannak kötve tehát ez nem zavarhat be. Ezt a kódot égettem bele, amit Topi egyik cikkéből szedtem, annyi átalakítással hogy PORT-B 3 és 4 helyett PORT-D 0 és 1 lett. A hex file-t AVR studio + win avr-el csináltam, az AVR studioban csak anyit adtam meg hogy 1 Mhz órajel és ATmega8. A fuse biteket nem állítottam át, bár arra nem sikerült rájönnöm mire jók a BOOTSZ0 és 1 bitek, valamint mi az a start up time (SUT0 és 1), szóval valaki légy szíves magyarázza el.

  1. #include <avr/io.h>
  2.     #include <util/delay.h>
  3.  
  4.     //-------------------------------------
  5.     void m_delay_10ms(unsigned char val) {
  6.     //-------------------------------------
  7.     //a _delay_ms max 65.535 ms-et képes sleepelni,
  8.     // tehát nagyobb idõzítést többõl lehet "összerakni"
  9.         unsigned char i;
  10.         for(i=0;i<val;i++) {
  11.             _delay_ms(10);
  12.         }
  13.     }
  14.  
  15.     //-------------------------------------
  16.     int main(void) {
  17.     //-------------------------------------
  18.         DDRD = (1<<PIND0)|(1<<PIND1); //csak a PD0 és a PD1 kimenet
  19.         PORTD = (1<<PIND0);    //egyiket bekapcsol
  20.         while(1) {
  21.             if(PORTD & (1<<PIND0)) PORTD &= ~(1<<PIND0);
  22.                               else PORTD |=  (1<<PIND0);
  23.             if(PORTD & (1<<PIND1)) PORTD &= ~(1<<PIND1);
  24.                               else PORTD |=  (1<<PIND1);
  25.             m_delay_10ms(100); //100*10ms = 1s
  26.         }
  27.         return 0;
  28.     }

A fő kérdés az, hogy lehet e hiba az égetésben, ha kiolvasva visszakopom az eredeti kódot, és ha ott nem akkor hol? A segítséget előre is köszönöm.
Üdv,
Csaba
(#) killbill válasza elektros90 hozzászólására (») Júl 3, 2013 /
 
A Warning-gal nem tudsz mit kezdeni, mert a sprintf double parametert var a %f-hez. Vagy double valtozot hasznasz, vagy cast-olod double-re:
  1. float voltage;
  2.  
  3.  sprintf(text, "%6.3fV", (double)voltage);

Ja, es ez mindjart valasz a masik kerdesedre is. A %6.3f azt jelenti, hogy a teljes szam legalabb 6 karakter hosszu lesz, belertve a tizedespontot is. Es a pont utan 3 szamjegy lesz.
(#) elektros90 válasza killbill hozzászólására (») Júl 3, 2013 /
 
Köszi.
Tehát akkor ez a teljes kód:
  1. #define F_CPU 8000000UL
  2.  
  3. #include <avr/io.h>
  4. #include <util/delay.h>
  5. #include <stdio.h>  
  6. #include "lcd.h"
  7.  
  8. void InitADC()
  9. {
  10.         ADMUX = (0 << REFS0)|(0 << REFS1);
  11.         ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
  12. }
  13.  
  14. uint16_t ReadADC(uint8_t ch)
  15. {
  16.         ch = ch & 0b00000111;
  17.         ADMUX|= ch;
  18.         ADCSRA|=(1<<ADSC);
  19.         while(!(ADCSRA & (1<<ADIF)));
  20.         ADCSRA|=(1<<ADIF);
  21.         return(ADC);
  22. }
  23.  
  24. int main(void)
  25. {      
  26.         char text[6];
  27.         double voltage, current;
  28.         int adc;
  29.         while(1)
  30.         {
  31.                 lcd_init(LCD_DISP_ON);
  32.                 lcd_clrscr();
  33.                 lcd_gotoxy(0,0);
  34.                 lcd_puts("Fesz.");
  35.                 lcd_gotoxy(8,0);
  36.                 lcd_puts("Aram");
  37.                 lcd_gotoxy(0,1);
  38.                 InitADC();
  39.                 adc = ReadADC(0);
  40.                 voltage = adc * 4/1024;
  41.                 sprintf(text, "%6.3fV", (double)voltage);
  42.                 lcd_puts(text);
  43.                 InitADC();
  44.                 adc = ReadADC(1);
  45.                 current = adc * 4/1024;
  46.                 lcd_gotoxy(8,1);
  47.                 sprintf(text, "%6.3fV", (double)current);
  48.                 lcd_puts(text);
  49.                 _delay_ms(50);
  50.         }
  51. }


A referencia 4V TL431 el előállítva. A maximum amit jelez 3.000V.
Miben lehet a hiba?
(#) elektros90 válasza elektros90 hozzászólására (») Júl 3, 2013 /
 
Rájöttem! Az adc * 4/1024; nél 4.0 kell.
(#) killbill válasza elektros90 hozzászólására (») Júl 3, 2013 /
 
Ket hiba van. Egyreszt sosem lesz 4.0V az eredmeny, mert 1023-nal nagyobb erteket nem ad az ADC. Ez sima matek. De ez a kisebbik problema.

Az igazi hiba az, hogy a maximum adc ertek, ugye 1023. Az 1023*4=4092, amit ha elosztasz 1024-gyel, akkor az eredmeny 3. Mert a szamitas vegig int szamokkal tortenik. Csak a vegeredmenyt, ami 3 konvertalja at float-ta, ami 3.000 lesz.

Ha azt irnad, hogy: voltage = adc * (4.0 / 1024), akkor jo lenne az eredmeny. Az 1 es az 1.0 teljesen mast jelent. Az egyik int, a masik lebegopontos. Javaslom, hogy olvasd el a 'C' nyelv idevonatkozo szabalyait, kulonos tekintettel az automatikus tipuskonverziokra.
(#) elektros90 válasza killbill hozzászólására (») Júl 3, 2013 /
 
Igen, aztán már rájöttem. Ismerős dolgok ezek nekem, csak már látszik, hogy este van... Idáig ezzel verekedtem, elsem hiszem. Aztán észrevettem mikor úgy 100x ra elolvastam a kódot.
Most már ugyanazt mutatja, mint a multiméter.
Köszönöm!

Viszont egy jó programozó jól jönne. Ezzel a Doper klónnal elég lassan megy és még hibát is dob, az időtúllépés miatt. Esetleg tudsz ajánlani valami tutit?
A hozzászólás módosítva: Júl 3, 2013
(#) killbill válasza elektros90 hozzászólására (») Júl 4, 2013 /
 
Nem tudok jo programozot ajanlani. Sajat tervezesu, USB-s programozom van, de az alapvetoen Linux-os cucc.
(#) killbill válasza elektros90 hozzászólására (») Júl 4, 2013 /
 
Tegnap nem vettem eszre, de van itt meg egy-ket aprosag. Az egyik, hogy az LCD es ADC init benne van a ciklusban, de gondolom, ez csak veletlen.

Aztan a text[6] kicsi lesz. 6 karakter a szam, 1 a 'V', vagy az 'A' az aramnal es meg ott van a lezaro nulla. Amugy, ha csak 3.996 a maximum ertek, akkor egesz nyugodtan lehet %5.3f is a format string.

Azon felul, ha a voltage es current double, akkor nem kell a (double) a sprintf hivasba, de ez nem hiba, mert semmilyen hatasa nincs ebben az esetben, csak felesleges.
(#) elektros90 válasza killbill hozzászólására (») Júl 4, 2013 /
 
Az 1. és a 3. dolgot észrevettem, a 2.at pedig kijavítottam.
Van pár gyengesége ennek a kapcsolásnak, merthogy tegnap rákötöttem a tápforrás megfelelő kimeneteire, és 3,.. V ig nem is mutatott semmit, csak nullát. Utána voltak különbségek a multis méréshez képest. A bemeneti osztó 1:1000, ezért a SW ban, még szoroztam 1000el.
A villogást, hogyan lehet kiküszöbölni? Ma nemnagyon haladtam előre, nem jutott idő erre. Viszont ha statikus jelet mérek, akkor ugyan azt mutatja, mint a multi. A dinamikusan változó jelre, eléggé lassacskán reagál.Lehet kisebb előosztást kellene használni.
(#) zolibon hozzászólása Júl 4, 2013 /
 
Valaki meg tudja mondani, hogy avr studio 4.19-el egy forráskódot, hogy kell hexxé fordítani egy saját szájízre átírt make-fájllal? Köszi
(#) mullergabor hozzászólása Júl 5, 2013 /
 
Sziasztok!

Nagyon kezdő vagyok az avr-ben. egy atmega128at szeretnék majd használni. Letöltöttem az adatlapját,viszont az műszaki angoltudás hiánya miatt és mint alapjába véve a mikrokontrollerhez való hozzá nem értésem miatt a portok használatát illetően (is) gondok merültek fel. Nem nagyon értem h melyik port mire való,és hogy melyik protra mit lehet kötni. Lenne valaki olyan rendes h leírja érthetően port-ról portra h melyik port mire szolgál? Annyira jöttem rá h a PORTF az az ADC bemente, a port B az az SPI kommunikációhoz kell, a PORTC vel pl LCD-t lehet vezérelni. De a többi az nem tiszta. Pl ha van egy Hall érzékelőm,aminek kimenete digitális jel, melyik lábára csatlakoztassam.Vagy alapjába véve egy digitális jelet melyik protra csatlakoztassak!!! Lehetőleg ne offoljatok a tudatlanságom miatt,mert szeretném megérteni. Köszönöm előre is !!!
(#) kapu48 válasza mullergabor hozzászólására (») Júl 5, 2013 /
 
Pl.: van a

Kovács Tamás tanárur leírása:


ATMEL ATMEGA128
OLIMEX AVR-MT-128 FEJLESZTŐ PANEL
Ebből sokat elleshetsz!
Bővebben: Link.pdf
(#) mullergabor válasza kapu48 hozzászólására (») Júl 5, 2013 /
 
Köszönöm a segítséget, bár ezt már én is megtaláltam korábban (ebből jöttem rá pl az lcd vezérlésére). viszont a lényegében nem sokat segít nekem az a pdf. De ismételten köszönöm a segítséget!!!!
(#) johny999 válasza mullergabor hozzászólására (») Júl 5, 2013 / 1
 
Nézd meg ezt. Hátha találsz valami hasznosat.
(#) elektros90 válasza mullergabor hozzászólására (») Júl 5, 2013 / 1
 
Szervusz!
Nekem ez az oldal jött be.
(#) Zsolt2 válasza mullergabor hozzászólására (») Júl 5, 2013 / 2
 
PortA: külső memória adat illetve címzéshez használható.
PortB: PB0-PB3 – SPI interfész(szolga vagy mester), PB4-nullás időzitő PWM és komparáló kimenet, PB5 és PB6-1-es időzitő PWM kimenete és komparáló kimenete(A illetve B kimenete), PB7-kettes időzitő PWM és komparáló kimenet illetve az egyes időzitő C kimenete.
PortC: Atmega103 kompatibilis módban csak kimenet ként lehet használni (alapértelmezetten ez van beállítva egy új mikrokontrolleren). Még használható külső memória cím illetve adat sinként.
PortD: PD0-PD3-külső megszakíŧás, ezenekívűl PD2-PD3 használható soros (UART) portnak. PD0-PD1 használahtó meg 2-vezetékes interfésznek is. PD4-PD7-külömböző időzitők külső órajel bemente.
PortE: PE0-PE1:másik soros port ki és bemenete (UART0) illetve programozó lábak. PE4-PE7 külső megszakítások.
PortF:ADC csatornák. PF4-PF7-JTAG programzó csatlakozó

Ezen kívűk minden PORT használható digitális ki\be menetnek, mindegyik lábon külön felhuzó ellenállással.
A programozásnál oda kell figyelni, mert nem a megszokott MOSI, MISO lábakra kell csatlakoztatni a programozót, hanem PE0 és PE1 lábakra.
A karakteres LCD bármelyik portra lehet kötni.
A hozzászólás módosítva: Júl 5, 2013
(#) ThompsoN hozzászólása Júl 5, 2013 /
 
Sziasztok.

Építettem egy fordulatszám vezérlő áramkört, PC ventilátorokhoz. Az IC egy ATMega48, erre kapcsolódik két forgókapcsoló, amivel két PWM csatorna kitöltését állítom. Illetve még 8 LED, ami visszajelzi a kapcsoló állapotát. A PWM csatornákra 1-1 IRF840 MOSFET van kötve, azok kapcsolják ki-be a ventilátorokat. Az egyikre 4, a másikra 2 ventit lehet csatlakoztatni. Az AVR RESET lábát szabadon hagytam, sehova nincs bekötve.

A gond az, hogy véletlenszerűen hiba jön elő. Teljesen rendszertelenül, nem tudom kétszer ugyan úgy előidézni. Az egyik hiba, hogy valamikor az AVR spontán resetel. Egyfolytában. Gonodl egyet, és utána folyamatosan újraindul.
A másik, hogy valamikor 3 ventilátorral nem hajlandó elindulni a teljes áramkör.

A tápellátást a számítógépem végzi (tehát betonstabil 12V), az AVR pedig egy 7805-re van kapcsolva a LED-ekkel együtt. Szerintetek mi lehet a probléma oka?
(#) fifadani hozzászólása Júl 5, 2013 /
 
Sziasztok!
Most ismerekedem a C-vel.
Van a delay_ms, ez 65 ms-t képes várni.
1 sec-es időzítést, hogy tudok létrehozni?
(#) johny999 válasza fifadani hozzászólására (») Júl 5, 2013 /
 
Hello,

_delay_ms(1000);
(#) elektros90 válasza johny999 hozzászólására (») Júl 5, 2013 /
 
Nem vagyok nagy AVRes de ez nem működik, úgy tudom. Több _delay_ms -t összeraksz. Vagy használhatod az egyik timert ami interruptot idéz elő kb, 1s nél.
(#) johny999 válasza elektros90 hozzászólására (») Júl 5, 2013 /
 
Érdekes :/
Akkor egy for loopba tesz 10msec-es delayt, vagy marad a timer.
A hozzászólás módosítva: Júl 5, 2013
(#) dokidoki válasza ThompsoN hozzászólására (») Júl 5, 2013 /
 
Szia, ne haragudj érte, én nem vagyok nagy szakértője a témának.
De ha szabadon, illetve lebegve hagyod a reset lábat, akkor mégis mit vársz mi történjen?
Húzd fel a kontroller tápfeszültségére egy 1-10KOhm közötti ellenállással. Ahogy illik.
Következő: »»   546 / 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