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   404 / 840
(#) zolee1209 válasza zombee hozzászólására (») Jan 30, 2012 /
 
Most épp az ATmega64 adatlapja van nyitva...:

Vint:
MIN: 2.4V
TIP: 2.56V
MAX: 2.8V
(#) gabi20 hozzászólása Jan 30, 2012 /
 
Az adatlapban sajnos nem találtam róla semmit. Egyébként kipróbáltam és nincs vele semmi gond. Nem is csökkent rajta a feszültség. De biztos ami biztos valami olcsó műveleti erősítőt hozzákötök. ATmega8535 - öt használok egész pontos 2,5V - ot mérek rajta. De ha nem lenne szabad akkor minek vezetik ki a refet
(#) blackdog válasza kiborg hozzászólására (») Jan 30, 2012 /
 
Én teljesen értem amit írsz. Lehet rosszul fogalmazom a kérdésem. Szóval:
PB0 = R_duty;
PB1 = G_duty;
PB2 = B_duty;

Én ezt az értékadást hiányolom. Nem látom a kódban, hogy adott porthoz hol rendeli hozzá az ő változóját.
Szerintem a C ismereteim hiánya miatt vagyok gondba.
(#) sikolymester válasza gabi20 hozzászólására (») Jan 30, 2012 /
 
Követő erősítős kapcsolással menni fog. Amúgy azért van kivezetve, hogy egy kondit tudj rákötni, hogy stabilabb legyen.
(#) gabi20 válasza sikolymester hozzászólására (») Jan 30, 2012 /
 
Értem és köszi
(#) sgt válasza gabi20 hozzászólására (») Jan 31, 2012 /
 
Meg ne valami mosfet erősítővel próbálkozz, mert a 2,5 V-ból lesz 3 V . Mindenféleképpen tranyós erősítő legyen. Lehetőleg minél kisebb offsettel.
(#) kiborg válasza blackdog hozzászólására (») Jan 31, 2012 /
 
Szia!
Kifejezetten nincs dedikálva, mert minek ?
Az egy ledhez tartozó portlábat csak 2 helyen módosítja, így nincs szükség hozzárendelésre(1, amikor mindhármat egyszerre 1-be állítja, 2, amikor egyesével (külön-külön) 0-ba kapcsolja, amikor az adott SZÍNhez tartozó változó eléri a 0-t. Az R_G_B_duty -t nem lehet porthoz rendelni,mert az VÁLTOZÓ !!! ennek függvényében van kapcsolva az adott ledhez tartozó kimeneti port.
Üdv Kiborg
(#) blackdog válasza kiborg hozzászólására (») Jan 31, 2012 /
 
  1. if(R_counter) R_counter--;
  2.            if(G_counter) G_counter--;
  3.            if(B_counter) B_counter--;
  4.  
  5.            if(R_counter==0) PORTB &= ~(1<<PINB3);
  6.            if(G_counter==0) PORTB &= ~(1<<PINB4);
  7.            if(B_counter==0) PORTB &= ~(1<<PINB5);


Ezek szerint itt dől el, hogy mikor milyen szinten legyenek a portok?
Bocs, hogy ennyit értetlenkedek, de még mindig nem volágos mert a LED színe akkor is függ a kitöltéstől. És ezeket az összefüggéseket keresem. :hide:
(#) kiborg válasza blackdog hozzászólására (») Jan 31, 2012 /
 
Amit írtál részben dől el, hogy MEDDIG lesz aktív a kimenet.
  1. if(R_counter==0) PORTB &= ~(1<<PINB3);
  2.            if(G_counter==0) PORTB &= ~(1<<PINB4);
  3.            if(B_counter==0) PORTB &= ~(1<<PINB5);

Itt kapcsolja, ki, ha adott számláló elérte a 0-t.
A megszakítás részében, meg bekapcsolja egyszerre mindet.
(#) blackdog válasza kiborg hozzászólására (») Jan 31, 2012 /
 
Nem tudnátok ajánlani egy jó könyvet vagy leírást a C alapokról AVR-hez? Belátom, hogy a C tudásom sem elég ide.
(#) blackdog válasza kiborg hozzászólására (») Jan 31, 2012 /
 
Köszönöm! Átnézem őket.
Bár így gyorsan beleolvasa ezeket tudom. Nem tudom a következő sor mennyire AVR spec:
  1. PORTB &= ~(1<<PINB3);

A PORTB és PINB3 nyilván az csak nem értem miért így ad neki értéket.
(#) kiborg válasza blackdog hozzászólására (») Jan 31, 2012 /
 
Ennyire már én sem vagyok C guru. Messziről ugatom, de inkább ASM
(#) Reggie válasza gabi20 hozzászólására (») Jan 31, 2012 /
 
Foleg azert vezetik ki, hogy szurokondit tudjal kotni ra, illetve ha kulso referenciat valasztasz, akkor ide kell kotnod a kulso forrast.
(#) Reggie válasza blackdog hozzászólására (») Jan 31, 2012 /
 
Csak a PORTB es a PINB3 AVR specifikus(, de akar barmi mas is lehetne).

A PORTB a B port kimenete, egy 8 bites regiszterre mutat, de szamodra olyan, mintha egy valtozo lenne. A PINB3 a B port 3. labara(0-tol indul a szamozas) utal, de valojaban ez egy konstans aminek az erteke 3. Igy az utasitst ertelmezve
  1. 1<<PINB3=1<<3=8=0b00001000, majd ~8 -ra adodik, hogy 0b11110111.
Vegul az elobbi ertekkel es a PORTB aktualis ertekkel vegez "es" muveletet, majd ezt visszairja a PORTB regiszterbe. Azaz a PORTB regiszter 3. bitjet torli(0-tol szamolva).
(#) blackdog válasza Reggie hozzászólására (») Jan 31, 2012 /
 
Nem lett volna egyszerűbb alak:
PORTB = 0b00000100;

Szerk.:
Talán nem mert így lekapcsolom az összes többi lábat amit néha nem kéne?
(#) sikolymester válasza blackdog hozzászólására (») Jan 31, 2012 /
 
Bit maskolásnak hívják. Ez a módja annak, hogy egy bit változzon meg, anélkül, hogy tudnánk a fordítási időben, hogy majd a futási időben mi is lesz a pontos értéke a PORTB -nek.
(#) blackdog válasza sikolymester hozzászólására (») Jan 31, 2012 /
 
Ok. Értem, de ebben az esetben miért van rá szükség?
  1. if(B_counter==0) PORTB &= ~(1<<PINB3);

Nem egy fix feltétel esetén kapcsolja fel vagy le a B port 3-as lábát? Itt elvileg fordításkor is tudom mi az érték.?
(#) sikolymester válasza blackdog hozzászólására (») Jan 31, 2012 /
 
A feltétel az fix. De mit javasolsz akkor, hogyan töröljük a 3. bitet a PORTB -ben?
(#) blackdog válasza sikolymester hozzászólására (») Jan 31, 2012 /
 
PORTB = 0b00001000;
Ez miért nem jó?
(#) Mezoas válasza blackdog hozzászólására (») Jan 31, 2012 /
 
Nekem nem igazán tetszik ez a maszkolásos dolog, ezért a múltkor keresgélve ezeket találtam:

  1. #define BIT(x) (1 << (x))
  2. #define SETBITS(x,y) ((x) |= (y))
  3. #define CLEARBITS(x,y) ((x) &= (~(y)))
  4. #define SETBIT(x,y) SETBITS((x), (BIT((y))))
  5. #define CLEARBIT(x,y) CLEARBITS((x), (BIT((y))))
  6. #define BITSET(x,y) ((x) & (BIT(y)))
  7. #define BITCLEAR(x,y) !BITSET((x), (y))
  8. #define BITSSET(x,y) (((x) & (y)) == (y))
  9. #define BITSCLEAR(x,y) (((x) & (y)) == 0)
  10. #define BITVAL(x,y) (((x)>>(y)) & 1)


Ezek után így néz ki a dolog:
CLEARBIT(PORTB,3);
Tökre ugyanazt csinálja, de legalább a gyakorlatlan szem is látja mi történik.
(#) kiborg válasza Reggie hozzászólására (») Jan 31, 2012 /
 
Szia!

Akkor ez lényegében ugyanaz, mint amsben a következő kódrészlet:

  1. in r16,pinb         ;(r16-ba beolvasom Bport PINjeinek értékét)
  2. ori r16,0b00000001  ;(LSB bekapcs) VAGY
  3. andi r16,0b11111110 ;(LSB kikapcs)
  4. out portb,r16       ;(r16 kiírása Bportra)


Avagy sem?

ami természetesen egyenértékű:
  1. sbi portb,0 (LSB bekapcs)
  2. cbi portb,0 (LSB kikapcs)
(#) kiborg válasza blackdog hozzászólására (») Jan 31, 2012 /
 
Azért nem, mert ebben esetben ha pl a 0.bit 1 volt, akkor azt is törlöd, pedig nem is akarod...
(#) blackdog válasza Mezoas hozzászólására (») Jan 31, 2012 /
 
Ez nagyon jó. Szerintem alkalmazni fogom, de előbb szeretném megérteni ezt a maszkolást. Sehol nem találok kezdő számára érthető magyarázatot.
(#) kiborg válasza blackdog hozzászólására (») Jan 31, 2012 /
 
Szia!

Gondold át, az előző hozzászólásom.
Ott pont a maszkolást mutatom be. Egyszerűen.
Beolvasok egy regiszterbe(változóba) egy értéket.
A vagy(ori) utasítással be tudok kapcsolni egyes nekem tetsző biteket. Az és (andi) utasítással pedig kikapcsolom azt a bitet, ahol 0 van, a többit ahol 1 van, változatlanul hagyom.
Majd végül kiírom a regiszter értékét a kimenetre.

Ez csak egyszerű boole algebra. A digitális technika alapja.
(#) blackdog válasza kiborg hozzászólására (») Jan 31, 2012 /
 
Ok. Így már értem.
A lényege, hogy ne változtassam mind a 8 bit állapotát, hanem csak azt az egyet amelyiket én akarom hiszen ebben az esetben:
  1. PORTB = 0b00001000;

az összes bit változna viszont én nem biztos, hogy tudom mind a 8 értéket az meg fölösleges, hogy előbb lekérem őket.
Remélem jól gondolom.
(#) blackdog válasza blackdog hozzászólására (») Jan 31, 2012 /
 
Már nem tudtam módosítani a HSZ-t.

Viszont ez nem ugyan az?
  1. PORTB.3=1;

Végül is itt is csak a PORTB 3. lábának adok 1 értéket.
(#) kiborg válasza blackdog hozzászólására (») Jan 31, 2012 /
 
A C-hez újfent nem tudok hozzászólni.

Viszont PORTB =0b00001000 nem feltétlenül jelenti hogy minden bit változni hogy a kimeneten !!! Amik 0-k voltak, azok nem változnak.(de gondolom ez triviális).
Akkor felesleges lekérni az értéket, ha tudod, de ha nem tudod, akkor le kell kérni, hogy maszkolással tudd módosítani. Hiszen ha nem tudod mit módosítasz annak nincs értelme...
(#) dr prof hozzászólása Jan 31, 2012 /
 
Sziasztok.
A segítségeteket szeretném kérni mivel csinálok egy vonalkövetö robotott egy Atmega8-al de a PWM vezérlés nem akar összejönni. Az OCR1B azaz PB2-es lábon nem akar létrejönni a jel. A PB1-es tökéletesen müködik.Nem hinném hogy az Atmegával lenne a baj mivel több darabon is kipróbáltam és az eredmény ugyan az. A kódott feltöltöttem. Elöre is köszi.

PWM.PNG
    
(#) szdani hozzászólása Jan 31, 2012 /
 
Találtam egy HTML-es szimulátort 2x16 -os alfanumeratikus kijelzőre, és gondoltam megvalósítom egy attiny2313-al. csak 4-bites adatátvitelt és kétsoros kijelzést akartam beállítani , úgy hogy a lábakat állítom L vagy H szintre ,de nem jött be. Nézegettem hogy más hexadecimális számokkal vezérli. Tud valaki abban segíteni hogy hol találok valami leírást hogy ezt hogyan kell megvalósítani?
Következő: »»   404 / 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