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   487 / 840
(#) elektros90 hozzászólása Okt 12, 2012 /
 
Sziasztok.
Most ismerkedek az AVRekkel. Olvasgatom az AVR-es cikkeket, elemezgetem a kódokat.
Az 1. 8 lábbal cikkben a ledes villogónál van egy sor amihez lenne kérdésem.

  1. DDRB = (1<<PINB3)|(1<<PINB4);


Értem, hogy a PINB3 és a PINB4 kimenet lesz, mert 1es lesz a regiszterben.
Miért nem
  1. DDRB = (1<<DDB3)|(1<<DDB4);
? hisz ezek a bitek vannak a DDRB regiszterben.

Köszönöm a választ.
A hozzászólás módosítva: Okt 12, 2012
(#) Sick-Bastard válasza elektros90 hozzászólására (») Okt 12, 2012 /
 
Üdv!
Én is kezdő vagyok ezen a téren szóval ha nagy ostobaságot írom kérem javítsatok ki.

Ha jól tudom mind két megoldást lehet használni, ha compiler ismeri. Tehát ha "szabványos", vagy definiáltad.

  1. DDRB = (1<<PINB3)|(1<<PINB4);
  2. DDRB = (1<<PB3)|(1<<PB4);
  3. DDRB = (1<<DDB3)|(1<<DDB4);
  4. DDRB = 0b0001100;
  5. DDRB = 0x0C;


vagy
  1. #define Lab3 0b00000100;
  2. #define Lab4 0b00001000;
  3.  
  4. DDRB |= (Lab3) | (Lab4);


Kezdőként ezt javasolnám neked:
Microcontroller Tutorial - A Beginners Guide

Nekem sokban segített.

icserny:
Mitől szörnyű amit írtam?
Annyit beismerek, hogy érthetőbb lenne, ha ezt írnám:
  1. #define SPI_PORT PORTB
  2. #define SPI_DDR  DDRB
  3. #define F_CPU 8000000UL
  4. #define SCK PB7 // vagy 0x80 vagy 0b10000000
  5. #define MOSI PB5 // vagy 0x20 vagy 0b00100000
  6. #define SPI_CS0 PB4 // vagy 0x08 vagy 0b00001000
  7.  
  8. int main(void)
  9. {
  10.     SPI_DDR |= (1<<SCK)|(1<<MOSI)|(1<<SPI_CS0);
  11.     SPCR |= (1<<SPE)|(1<<MSTR);
  12.     SPSR |= (1<<SPI2X);
  13.     SPI_PORT |= (1<<SPI_CS0);
  14.     SPI_74HC595_Write(0);
  15. ....}

És ha később másik típusú(avr->avr) vezérlőre szeretném feltenni, akkor nem az egész kódot kell átírnom, "csak" a #define részben kell matatni.
(#) sikolymester válasza elektros90 hozzászólására (») Okt 13, 2012 /
 
A PINB3 -ra találsz egy #define -t az egyik header fileban.
Valami ilyesmi:
  1. #define PINB3 3


Igazából ezt is lehete írni:
  1. DDRB = (1<<3)|(1<<4);


Sőt a preprocessor eleve az utóbbi formában adja át a C fordítónak a forrásod.
(#) sikolymester válasza icserny hozzászólására (») Okt 13, 2012 /
 
Ez szép és jó, de gyakorlatban kevesen használják ezt így.
Nem kellene oltani szegényt, ha nem így csinálja, ahogyan te.

Turkálj bele bátran bármilyen open source AVR projektbe és látni fogod, hogy ezzel kisebbségben lennél.
Persze ízlések és pofonok.
(#) zombee válasza sikolymester hozzászólására (») Okt 13, 2012 /
 
Perifériáknál a bitek neveit szokás használni, például:
  1. TCCR1B|=1<<CS02;

I/O portoknál meg a sorszámot, azaz nem "PB3" meg hasonlók:
  1. DDRB|=1<<3;
A hozzászólás módosítva: Okt 13, 2012
(#) elektros90 válasza sikolymester hozzászólására (») Okt 13, 2012 /
 
Értem már akkor az összefüggést, sejtettem, hogy valami ilyenről lehet szó.
Lehet tévedek, de akkor elméletileg írhatnám ezt is:

  1. DDRB = (1<<EEAR3)|(1<<EEAR4);

(Még ha lehetne is, akkor is hülyeség és értelmetlen.)

  1. DDRB = (1<<DDB3)|(1<<DDB4);

Számomra ez a mód a legvilágosabb, esetleg bináris formában.

Mi suliban a 8051est tanuljuk, de sulin túl AVRezek.
Hexa kódban szoktuk írni.

  1. TCCR1B|=1<<CS02;

Miért nem elég csak =, miért kell az or is?

(Remélem nem zavarok senkit a buta kérdéseimmel)
(#) blackdog válasza elektros90 hozzászólására (») Okt 13, 2012 /
 
Persze, hogy írhatnád azt is, hogy EEAR3 vagy KUTYAFULE3.
Definiálás kérdése.

|= azért van mert a regiszteren belül egyetlen bit értékét szeretnéd csak módosítani.
A hozzászólás módosítva: Okt 13, 2012
(#) szdani hozzászólása Okt 14, 2012 /
 
Hali

3310-es kijelzőre szeretnék menüt csinálni switch case utasítással de nem tudom hogyan hozzam össze úgy hogy gombokkal oda - vissza lépkedjek. Valaki tudna ebben segíteni? mert neten nem sok mindent találtam erről a témáról. Előre is köszönöm.
(#) blackdog válasza szdani hozzászólására (») Okt 14, 2012 /
 
Ne mond már! Tele van vele a net: Bővebben: Link
(#) szdani válasza blackdog hozzászólására (») Okt 14, 2012 /
 
Amit megtaláltam az nem működött mert nem lépett tovább az LCD csak a case1 utasítás futoot le.
(#) blackdog válasza szdani hozzászólására (») Okt 14, 2012 /
 
Ha lenne kód akkor biztos lenne aki segít. Ez szerintem kódolási hiba és független az alkalmazott kijelzőtől.
(#) sikolymester válasza szdani hozzászólására (») Okt 14, 2012 /
 
Ez kell neked a menü struktúrához:
Micromenu
(#) csabeszq válasza szdani hozzászólására (») Okt 15, 2012 /
 
Hát, nálam a kijelző be sem fért be a memóriába és úgy is sikerült menüt csinálnom (grafikus LCD, ami nem támogatta a visszaolvasást).

A működése:
- 8x8-as cellákra bontod a képernyőt 1 biten tudsz egy 8x8-as cellát érvényteleníteni (újrarajzolás)
- létrehoztam egy tömböt, amibe renderer függvényeket lehetett bepakolni (szövegdoboz, keret, grafikus kép,...)
- amikor érvénytelenítesz egy cellát, az összes olyan renderer függvényt meghívja sorrendben, amelyik tartalmazza a cellát

Példa: háttérkép + lekerekített ablak keret + menü
1. a 8x8-as cellába belerajzolja a háttérképet (függvény)
2. belerajzolja a keretet tartalmazó részt (függvény)
3. belerajzolja a menü szövegét tartalmazó részt
4. átküldi az LCD panelnek a 8x8-as cellát

Nem tárolsz biteket, nem tárolsz tartalmat, ha valami változik újraszámolsz mindent.
A hozzászólás módosítva: Okt 15, 2012
(#) Adam329 válasza Reggie hozzászólására (») Okt 15, 2012 /
 
Köszi!

Mit adjak meg kezdőpozíció értéknek?
(#) szdani válasza csabeszq hozzászólására (») Okt 15, 2012 /
 
Annyira nem akarom túlbonyolítani, törlöm az egész kijelzőt és kiírom rá az új adatokat. Csak nem tudom megcsinálni, hogy a case utasítások között lépkedjek gombokkal. Rájöttem hogy ha a switch változójának értéke megegyezik a case utasítás számával akkor az fut le, csak a változó értékét nem tudom változtatni. Legalábbis ha jól értelmeztem így működik,de felrakom a komplett kódot.

Progam.zip
    
(#) sikolymester válasza szdani hozzászólására (») Okt 16, 2012 /
 
Megnézted a micromenu -s linkemet?
Az pont azt csinálja amit szeretnél, csak nem case switch ekkel, hanem function pointerekkel.
(#) szdani válasza sikolymester hozzászólására (») Okt 17, 2012 /
 
Igen nézegettem köszi még próbálom értelmezni.
(#) gaboca69 hozzászólása Okt 17, 2012 /
 
Sziasztok!

Van egy projektem: Lehetőleg Motorola G24 /G30/ GSM modemet SMS kommunikáció, vezérlés céljából, egy ATMEGA128 mikrokontrollerhez. Főleg hardveres illesztés megvalósításához kérném a segítségeteket, milyen SIM foglalat, illesztő, bekötés...stb.
/Az I2C foglalt más kommunikáció miatt/

Adatlapok:
Motorola G24/G30:
ATMEGA128:

Segítségeteket előre is köszönöm.
(#) gaboca69 hozzászólása Okt 17, 2012 /
 
A Linkek lemaradtak

Motorola G24/G30:Motorola GSM modem
ATMEGA128: AMEGA128


Köszi..
(#) blaci hozzászólása Okt 17, 2012 /
 
Üdv!

Építettem egy sakkórát, és majdnem minden tökéletes. Egyetlen gondom, hogy az egyik váltó gomb, ami int1-re van kötve, furán működik. Prell nincs, azt hardveresen kiszűrtem, és az int0-ra kötött gomb is teszi a dolgát.(Szkóppal nézve is minden rendben). Az int1-re kötött viszont lenyomott állapotban generál egy int0-t, és csak amikor elengedem, hajtja végre a hozzá tartozó kódot. A gombokat megcserélve sem változik a dolog, ebből gondolom, hogy szoftveresen lehet valami gond.
Mellékelem a programot, amiből mindent kidobtam, csak a két ledet váltogatja a két nyomógomb lenyomásának függvényében. A kapcsolás lelke egy atmega8 8MHz-es belső oszcillátorról hajtva, de próbáltam már visszavenni az órajelből, az se használ.
Van valakinek ötlete?

buttontest.c
    
(#) Reggie válasza blaci hozzászólására (») Okt 17, 2012 /
 
A kod alapjan inkabb HW hibanak tunik.
(#) Sick-Bastard hozzászólása Okt 18, 2012 /
 
Üdv!

Írtam egy kis megszakító kódot azzal a céllal, hogy felfüggessze az avr működését, majd ismét megnyomva az interrupt gombot a feladatát folytassa.
Valahogy így néz ki:

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>
  4.  
  5. int stop;
  6.  
  7. int main(void)
  8. {
  9.         sei();
  10.         GICR |= (1<<INT0);
  11.         MCUCR |= (1<<ISC00)|(1<<ISC01);
  12.        
  13.         //  avr main programja
  14. }
  15.  
  16. ISR (INT0_vect)
  17. {
  18.         stop++;
  19.         _delay_ms(100);
  20.         while(1)
  21.         {
  22.                 if(stop>0x01)
  23.                 {
  24.                         stop=0x00;
  25.                         return;
  26.                 }
  27.                 else
  28.                 {
  29.                         _delay_ms(1000);
  30.                 }
  31.         }
  32. }


Ez így jó?
(#) Reggie válasza Sick-Bastard hozzászólására (») Okt 18, 2012 /
 
Nem. Ha belep a megszakitasba, akkor letiltja a megszakitasokat, igy nem hivja meg a fuggvenyt ismet, ha ujra megnyomod a gombot.
A stop valtozonak volatile-nak kell lennie, mert kulonben nem irodik vissza az erteke a memoriaba es az ujra meghivodo fuggveny meg mindig 0-nak fogja latni.
A hozzászólás módosítva: Okt 18, 2012
(#) blaci válasza Reggie hozzászólására (») Okt 18, 2012 /
 
Nem tartom kizártnak a hw hibát, de már több dolgot teszteltem, és azok jónak tűnnek.
Mellékelem a kapcsolási rajzot, a hw ez alapján készült, és valóban egyezik is vele.
Kétcsatornás szkóppal nézve a két gomb (player1, player2) teljesen függetlenül működik egymástól. Mit nézzek még?
A hozzászólás módosítva: Okt 18, 2012

kapcsrajz.png
    
(#) blaci válasza blaci hozzászólására (») Okt 18, 2012 /
 
És megtaláltam a hibát. A 40106n bármely két egymás mellett levő kapuján produkálja a hibát, de ha kihagyok egyet, vagy a két ellentétes oldalon használom az egymás utániakat, akkor már tökéletesen működik. Gyakorlatilag az 1-2, 2-3, 4-5, 5-6 triggerek nem használhatók együtt. Két ilyen ic-m van, mindkettő így viselkedik, viszont az adatlapon nem találtam erre utalást....
(#) Reggie válasza blaci hozzászólására (») Okt 18, 2012 /
 
Igazabol a kapcs rajz is jonak tuni. Ez valami erdekes hiba lesz. Szerintem toltsd fel a leforditott kodot, es majd este megnezem, hogy visszafejtve helyes-e a program.

(Ugye az ADC-t nem hasznalod belso referenciarol? Ha nem haszalod az ADC-t akkor egyszerubb nem bekotni az AREF labat, viszont igy, ha engedelyezed az alapbeallitasokkal, akkor helybol zarlat lesz a belso referencia es az 5V kozott.)
A hozzászólás módosítva: Okt 18, 2012
(#) Adam329 hozzászólása Okt 18, 2012 /
 
Reggie nagyon köszönöm a segítséged. Az ablakozáshoz amit javasoltál milyen kezdőpozíciót kell adjak meg?
(#) blaci válasza Reggie hozzászólására (») Okt 18, 2012 /
 
Feltettem az egész projektet, benne van a hex is. AVR studio 4-gyel készült. Ez a program csak egy kibelezett csontváz, kizárólag az interrupt tesztelésére. A hw ugyanaz természetesen, bár az eredetihez képest annyit változtattam, hogy a 40106n 1-5 triggereit használom az 1-2 helyett. Így szinte tökéletes, de azért ha sokat nyomkodom gyorsan egymás után, akkor képes produkálni az eredeti problémát.
Az ADC itt egyáltalán nem lesz használva.
(#) blackdog hozzászólása Okt 18, 2012 /
 
Sziasztok!

Óra és naptár alkalmazáshoz DS1337 IC-t rendeltem. Viszont ennek nincs VBAT lába mint a 1307-nek. Viszont én szeretném, hogy áramszünet esetén se "menjen el" az idő beállítás.
1337-et nem tudom elemről üzemeltetni? Ill. úgy tápot adni neki, hogy áraszünet esetén 3V-ról működjön és az AVR ebből ne kapjon?
(#) Reggie válasza Adam329 hozzászólására (») Okt 18, 2012 /
 
0-rol mehet, aztan ha a vegere ertel, akkor megint kezd elolrol. Ez egy gyurus puffer.
A hozzászólás módosítva: Okt 18, 2012
Következő: »»   487 / 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