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   696 / 840
(#) Vacok hozzászólása Szept 27, 2015 /
 
Sziasztok!

Atmega328P mikrokontrollerre beállítottam a fuse biteket Low Frequency Crystal-ra, a mikrokonroller elindul, viszont ISP-n keresztül nem férek hozzá. Hogyan tudom a fuse biteket átállítani, vagy törölni az egész programot?
(#) Sick-Bastard válasza Vacok hozzászólására (») Szept 27, 2015 /
 
Nekem USBASP-n a Slow CLK jumpert kellett felhelyeznem, amikor elfelejtettem, hogy a felprogramozni kívánt AVR 1Mhz-es órajelent ment.

Milyen programozód van, milyen a 328-as kristálya?
(#) Sick-Bastard válasza roland8811 hozzászólására (») Szept 27, 2015 /
 
Ha az AVR-t 5V-tal táplálod akkor az UART is 5Von üzemel.
A Málnától még gond nélkül tudja fogadni az adatokat, de a Málnának már sok lesz az 5V-os jel.
Az AVR TXD lábára kell valamilyen megoldás amivel a feszültséget leviszed 3,3V-ra.

A hőérzékelő milyen típusú? Mi a programja? Kapcsolás?
(#) Vacok válasza Sick-Bastard hozzászólására (») Szept 27, 2015 /
 
STK200 a programozó. A mikrokontrollernek kapcsolás szerint 16MHz-es kristálya van. Jelenleg egy órakvarc van beforrasztva.
(#) roland8811 válasza Sick-Bastard hozzászólására (») Szept 27, 2015 /
 
LM 35 DZ , úgy néz ki hogy 5 volton minden renben, de így 3.3v on már vagy 10 Celsius fokkal többet mér , rászámolnák anyit , de pontosan nem tudom.
(#) PIC hozzászólása Szept 27, 2015 /
 
Köszönöm szépen mindenkinek a segítséget a sleep móddal kapcsolatban!
Ahogy ígértem mellékeltem, a végleges működő kódot. Remélem más is hasznát veszi, még ha nem is a legprofibb legrövidebb módon van megírva. Építő kritikát egyébként elfogadok. Abból lehet igazán tanulni Rengeteget gondolkoztam ma pl., hogy hogyan tudnám meghosszabbítani a sleep időt. Egyszer csak kipattant a fejemből.. hát leírom alá még egyszer vagy többször a sleep parancsot , hogy amikor felkel azonnal aludjon vissza. Ez nagyon rövid idő alatt lezajlik, tehát nem nagy veszteség...

  1. #define F_CPU 1000000UL
  2. #include <util/delay.h>
  3. #include <avr/io.h>
  4. #include <avr/sleep.h>
  5. #include <avr/power.h>
  6. #include <avr/interrupt.h>
  7. void Timer_config                                               (void);
  8.  
  9. unsigned int aludni_kell = 0;
  10. unsigned int szamlalo = 0;
  11.  
  12. ISR(TIMER1_COMPA_vect)
  13. {
  14.        
  15. }
  16.  
  17. ISR(TIMER2_OVF_vect)
  18. {
  19.        
  20. }
  21.  
  22. int main(void)
  23. {
  24.         DDRD |= (1<<PD0);       //Teszt LED
  25.         PORTD &= ~(1<<PD0);
  26.        
  27.         Timer_config();
  28.        
  29.         while(1)
  30.         {
  31.                 while(aludni_kell)
  32.                 {
  33.                         while(TCNT2==0); {;}            //Megvárjuk amíg elhalad a változó a 0-ról
  34.                         for (uint16_t s=0;s<=3;s++)     //valamennyiszer 6sec alvás
  35.                         {
  36.                                 sleep_mode();                   //Azonnal sleep mód 6 másodpercig
  37.                                
  38.                         }
  39.                         aludni_kell=0;
  40.                 }
  41.                         //Ébredés után lefutó kód:
  42.                         PORTD ^= (1<<PD0);
  43.                         _delay_ms(4000);
  44.                         PORTD ^= (1<<PD0);
  45.                         aludni_kell=1;
  46.                 }                                      
  47. }
  48.  
  49. void Timer_config                                               (void)
  50. {
  51.         //Timer1 beállítás:
  52.         TCCR1B |= (1<<CS10) | (1<<CS12);        //1024
  53.         TCCR1B |=  1<<WGM12;                            //Clear Timer on Compare (CTC)
  54.         OCR1A   = 100;                                          //Komparálási érték
  55.         TCNT1   = 0;                                            //Számláló kinullázása
  56.         TIMSK  |= 1<<OCIE1A;                            //ha a számláló elérte a komp. szintet -> megszakítás
  57.        
  58.         //Timer2 beállítás:
  59.         ASSR|=(1<<AS2);                                         //Asszinkron mód
  60.         OCR2=0;
  61.         TCNT2=0;
  62.         TCCR2=0;
  63.         TCCR2|=(1<<CS22)|(1<<CS21)|(1<<CS20);//1024-es osztás
  64.         TIMSK|=(1<<TOIE2);
  65.         sei();
  66.         while(!TCNT2==0);
  67.         set_sleep_mode(SLEEP_MODE_PWR_SAVE);//Sleep mód kiválasztása
  68. }
(#) Vacok válasza Vacok hozzászólására (») Szept 27, 2015 /
 
Sikerült ismét programoznom az IC-t, 555-tel építette egy astabil multit, kb. 900kHz-es frekvenciára állítottam be, rákötöttem a 328 OSC2 lábára és így sikerült átállítani a fuse biteket.
Abban kérek még segítséget, hogy eredetileg a program 16MHz-ről futott, most fuse bit be van állítva a 8MHz belső órajelre. Mit kell a programban módosítanom, hogy a program ugyanúgy fusson mint 16MHz-ről? ITT található a program.
A timer1 és a timer2 jelenleg fel van cseréve. Timer1-ről megy a kijelző multiplex üzemmódban, timer2 aszinkron módban egy órakvarcról hajtja az órát.
(#) Sick-Bastard válasza Vacok hozzászólására (») Szept 27, 2015 /
 
avrdudeban: -U lfuse:w:0xff:m -U hfuse:w:0xd9:m -U efuse:w:0xff:m
ekkor 8Mhz<= kristályra van beállítva és SPIEN

A fenti beállítással mennie kell a 16Mhzes kristállyal, de akkor a Timer2-t asszinkron üzemre nem lehet használni órakvarccal. Vagy egyik vagy másik, a kettő együtt nem megy.
(#) Sick-Bastard válasza roland8811 hozzászólására (») Szept 27, 2015 /
 
Az LM 35 DZ 4V és 30V között üzemel. A 3,3V kevés neki, nem működik megfelelően.
Adjál neki 5V-ot és az outputot mondjuk oszt el precíz ellenállásokkal.
Hogy mekkora kell azt sajnos nem tudom, itt másra bíznám a választ. (Talán 2db 100ohm vagy 1kohm???)
(#) roland8811 válasza Sick-Bastard hozzászólására (») Szept 28, 2015 /
 
Jó ötlet. Köszi
(#) Vacok válasza Sick-Bastard hozzászólására (») Szept 28, 2015 /
 
Ezt értem, nekem az a gondom, hogy ha átállítom a fuse biteket 8MHz-es belső órajelre, akkor a programban beállított hangok fele olyan magasak és a beállított várakozási idők dupla olyan hosszúak, ezt szeretném valahogy kiküszöbölni, hogy a hangmagasságok és a várakozási idők ugyan olyan legyen mint 16MHz esetén.
(#) k3gy3tl3n válasza Vacok hozzászólására (») Szept 28, 2015 /
 
Ha nem tudod programozni legrosszabb esetben párhuzamos programozóval tudod visszaállítani az eredeti fuse biteket. Pár hónapja feltettem ebbe a fórumba a kapcsolást és a kódot. Kell hozzá egy másik uc és egy marék ellenállás. Bővebben: Link
Szerk.: Bocs látom közben már megoldódot.
A hozzászólás módosítva: Szept 28, 2015
(#) Sick-Bastard válasza Vacok hozzászólására (») Szept 28, 2015 /
 
Ha van forráskódod (C-ben), akkor ott kell újra definiálni a sebességet, vagy a Make file-ban.
  1. #define F_CPU 16000000UL

helyett
  1. #define F_CPU 8000000UL

Így a _delay_ms() valóban annyi lesz, amennyi meg van adva.
A hozzászólás módosítva: Szept 28, 2015
(#) Ivan93 válasza Vacok hozzászólására (») Szept 28, 2015 /
 
Sziasztok! Én is jártam már így és hasonló módszerrel újra tudtam programozni, de nem tudom ez a megoldás mindig működik-e? Tapasztaltabbaktól kérnék megerősítést, mert nem merek kísérletezni az órakvarcal, attól félek úgymarad az uC. Köszönöm!
(#) Max26 hozzászólása Szept 28, 2015 /
 
Sziasztok! Valaki tudna helpet adni jól van-e bekötve ez a kártyaolvasó? A világért nem akar működni. Eddig LC Studio-t használtam, de erre 'Sd Card Module' van ráírva. Lehetséges, hogy hibás a bekötése?
(#) Bakman válasza Max26 hozzászólására (») Szept 28, 2015 /
 
Én ilyenből vettem öt darabot, de az egyikben a tápegység IC zárlatos volt, a többi négy ment rendesen. Igaz, kb nincs is benne semmi, csak pár felhúzóellenállás.
(#) Vacok válasza Sick-Bastard hozzászólására (») Szept 28, 2015 /
 
Az a helyzet, hogy a program arduinoban íródott és eddig azzal is fordítottam gond nélkül, viszont így hiába írom be a fent említett sort, az arduino gondolom automatikusan 16MHz-re állítja az órajelet. Megpróbáltam a programot kimásolni és egy main.c fájlban elmenteni és Win-AVR programmal lefordítani, de a egy csomó hibát jelez. Makefájl rendben van, mégse fordítja le.
A hozzászólás módosítva: Szept 28, 2015
(#) Sick-Bastard válasza Ivan93 hozzászólására (») Szept 28, 2015 /
 
Egy órajel-generátor sok esetben segíthet, hacsak nincs kikapcsolva az SPIEN vagy/és az RSTDISBL ill. JTAGEN (ha van rajta).
Azt nem tudom, hogy mi van, ha van JTAG, de a RST ki van kapcsolva, akkor lehet-e JTAG-en felprogramozni?

Minden más esetben a HVSP/HVPP megoldás egyikét kell használni, AVR-től függően.

Ha konkrétan órakvarcra gondoltál mint CPU órajel, abban nem vagyok biztos. Lehet fut az AVR, de legvalószínűbb, hogy olyan lassan, hogy a programozókkal nem tud kommunikálni.
Tudomásom szerint legalább 1MHz-es órajel kell neki, hogy programozható legyen.
(#) Sick-Bastard válasza Vacok hozzászólására (») Szept 28, 2015 /
 
Ez át kell itt adnom valaki másnak, aki használt már arduinot.
Amennyire ismerem az arduinot, a C kódja(felépítése/syntax?) jelentősen eltér a WinAVR-tól.
pl.: ami arduinoban loop() az a WinAVR-ban a while(1) megfelelője... már ha jól értelmeztem egy minta kódot.
(#) Vacok válasza Sick-Bastard hozzászólására (») Szept 28, 2015 /
 
Értem, hát ez nem hangzik jól, akkor gyakorlatilag át kellene írni az egész programot. Köszönöm az eddigi segítséget.
(#) Ivan93 válasza Sick-Bastard hozzászólására (») Szept 29, 2015 /
 
Cpu órajelnek szántam, de utána nem lehetett programozni akkor sem, ha feltettem a programozóra az alacsony isp frekvenciás jumpert (Topi féle doper). A program amúgy futott rajta, csak lassan, mert az F_CPU-t nem írtam át. Az xtal1 lábra tettem ~1MHz négyszögjelet, és harmadik próbára át tudtam állítani a fuse biteket. De akkor ez nem egy 100%-os módszer.
(#) csabeszq válasza Vacok hozzászólására (») Szept 30, 2015 /
 
Nem teljesen értem, hogy ha az eredeti Arduino program 16Mhz kristályról futott, akkor miért akarod 8MHz-es belső oszcillátorról futtatni.

Fogod, megveszel 700 Ft-ért a kínaiaktól egy Arduino nano-t és nem szórakozol kvarc kristállyal, meg fuse bitekkel, meg RESET gombbal, meg miegymással. Ha Arduinoban írták meg, akkor te miért nem Arduino-n akarod használni?

Mindent lehet csinálni, ha megfelelően vájkálsz a config-ok között, akár 8 MHz-re is átállíthatod az Arduino keretet. Sőt, Arduino makefile-t is letölthetsz, ha make-kel akarsz fordítani.

A kérdés, hogy van-e értelme. Szerintem semmi. Miért baj neked, hogy a nano 16 MHz kristályról fut? Miért jobb a belső RC oszcillátor a kvarc kristálynál?
A hozzászólás módosítva: Szept 30, 2015
(#) csabeszq válasza csabeszq hozzászólására (») Szept 30, 2015 /
 
Mellesleg: ha az Ardiunot alacsony hardverórajellel akarod járatni:

  1. #include <avr/io.h>
  2.  
  3. setup()
  4. {
  5.   CLKPR = 0x80;
  6.   CLKPR = 8; // rögtön 62.5 kHz-frekvenciával fog menni, ennél alább sajnos nem mehetsz
  7. }


Ez pont ugyanazt csinálja, mint a fuse biteknél a CLKDIV.
A hozzászólás módosítva: Szept 30, 2015
(#) Sick-Bastard válasza csabeszq hozzászólására (») Szept 30, 2015 /
 
Ha jol ertettem Vacok helyzetet, akkor az atiras azert kellett mert itt azt irta, hogy modositott az itteni eredeti programot. A Timer 2-t szerette volna aszinkron modban hasznalni, egy orakvarccal.

Az atmega328p XTAL es OSC ki/bemenetei egyazon labon vannak es ezert szeretne belso 8Mhz-es orajelen jaratni az AVRt.
(#) rolandgw hozzászólása Szept 30, 2015 1 /
 
Bocs az off-ért,valami hasonló megoldást tudnátok javasolni glcd-hez ?
(#) rolandgw válasza rolandgw hozzászólására (») Szept 30, 2015 1 /
 
Tárgytalan,találtam egy ingyenest.
(#) TavIR-AVR válasza rolandgw hozzászólására (») Okt 1, 2015 / 1
 
Mi a neve? Link?
(#) rolandgw válasza TavIR-AVR hozzászólására (») Okt 1, 2015 /
 
Lcd-Tools a support-nál.Szerényebb képességű,de jól használható.Az app. notes-nál is sok hasznos dolog van.
(#) pont hozzászólása Okt 1, 2015 /
 
Üdv!
Ha már kijelzőknél tartunk, ezt a fajta kijelzőt (HMI) Bővebben: Linknagyon bonyolult lenne összehozni AVR-el? Sokat meglehetne spórolni, ha ki lehetne hagyni a PLC-t. MODBUSZ-RTU használ RS232-n. "Csupán" csak memóriacímeket ír/olvas. Pl. egy bit lekéréséhez 0x512 formátumban kell megadni a címet.

samdraw.JPG
    
(#) Zsolt2 válasza pont hozzászólására (») Okt 2, 2015 /
 
Itt szét lehet nézni. Nekem sikerült már Slave Modbus-RTU protokollt implementálni AVR-en, nem látom akadályát a forditott müveletnek sem. A hozzá szükséges müködő CRC algoritmust linkelem.

mbcrc.c
    
Következő: »»   696 / 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