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   401 / 840
(#) zombee válasza ReFi hozzászólására (») Jan 18, 2012 /
 
Az AVCC-t vajon megszűrted már?
(#) sikolymester válasza ReFi hozzászólására (») Jan 18, 2012 /
 
Legyen minden táp láb bekötve. Különösen az AVCC és AGND, amennyiben ADC-zel.
Mindegyik táp lábon legyen egy ~100nF-os hidegítő kondi.
(#) gabi20 válasza zombee hozzászólására (») Jan 19, 2012 /
 
Szia igen észrevettem hogy amikor hangmagasságot váltok néha egy rövid időre elhallgat. Úgyhogy maradok annál amit először írtál
(#) ReFi hozzászólása Jan 19, 2012 /
 
AVCC-t be sem kötöttem
(#) Reggie válasza ReFi hozzászólására (») Jan 20, 2012 /
 
Pedig azt mindig be kell kotni. Meg ha nem is hasznalod az ADC-t, akkor is.
(#) zombee válasza Reggie hozzászólására (») Jan 20, 2012 /
 
Ha meg használod akkor szűrni is kell. 100uH tekercs és min. 1µF kondi.
(#) Reggie válasza zombee hozzászólására (») Jan 20, 2012 /
 
Dehogy. Boven eleg a 10uH es 100nF, mint az ajanlasban van.
(#) zombee válasza Reggie hozzászólására (») Jan 20, 2012 /
 
Miért, kipróbáltad? Az ajánlást én is olvastam, és eléggé ugrált azokkal az értékekkel.
Nálam ezért 100uH/1µF a minimum, de sokszor 10µF is megy oda...
(#) kovacssz hozzászólása Jan 20, 2012 /
 
Sziasztok,

próbálgatom a timer0 megszakítását, de valami miatt nem működik. Annyit kellene csinálnia, hogy a PORTCt 1be teszi. Mivel a portct nem törlöm ezért folyamatosan 1ben kellene lennie, ha 1x is lefut a megszakítás. (jól gondolom?)

itt a program(ATMEGA8+AVRGCC ahol ATMEGA8 van kiválasztva):
#define F_CPU 8000000UL
#include
#include

ISR(TIMER0_OVF_vect)
{
PORTC=0xff;
sei();
}

int main(void)
{
DDRC=0xff;
PORTC=0x00;
SREG |= (1<<7);
TIMSK|=(1< TCCR0|=(1< TCNT0 = 0x00;
sei();
while (1)
{

}
return 0;
}>>>>>>>>
(#) gtk válasza kovacssz hozzászólására (») Jan 20, 2012 /
 
Jol sikerult a ko'd beillesztes !
(#) kovacssz válasza gtk hozzászólására (») Jan 20, 2012 /
 
a beviteli ablak módban minden OK, amikor kiteszi ide, akkor meg szét van esve
ez a sor helyett
TIMSK|=(1< TCCR0|=(1< TCNT0 = 0x00;
ez a 3 sor van a kódban:
TIMSK|=(1 << TOIE0);
TCCR0|=(1 << CS02)|(1 << CS00);
TCNT0 = 0x00;>>>>>>>>
(#) Ricsi89 válasza kovacssz hozzászólására (») Jan 20, 2012 /
 
Használd a válasz ablakban a kód gombot és akkor jól teszi be!
(#) kovacssz válasza Ricsi89 hozzászólására (») Jan 20, 2012 /
 
  1. #define F_CPU 8000000UL
  2. #include <avr/io.h>
  3. #include <avr/interrupt.h>
  4.  
  5. ISR(TIMER0_OVF_vect)
  6. {
  7.     PORTC=0xff;
  8.     sei();
  9. }
  10.  
  11. int main(void)
  12. {
  13.      DDRC=0xff;
  14.      PORTC=0x00;
  15.      SREG |= (1 << 7);
  16.      TIMSK|=(1 << TOIE0);
  17.      TCCR0|=(1 << CS02)|(1 << CS00);
  18.      TCNT0 = 0x00;
  19.      sei();        
  20.     while (1)
  21.     {
  22.        
  23.     }
  24.     return 0;
  25. }

kösz, így már OK!
(#) zombee válasza kovacssz hozzászólására (») Jan 21, 2012 /
 
Egyébként mi a hiba? Nem állítódik be a PORTC?

C-ben SREG-hez ne(!) nyúljunk:
  1. SREG |= (1 << 7);
Egyébként ez épp egy sei() lenne...

Az interrupt végén nem kell sei() (és ret/iret sem), ezeket a fordító elvégzi, egyébként interruptban tilos a sei().

Egyéb apróságok, elvileg nem hiba de nem árt javítani:
- a TCNT0-t akkor nullázod amikor már pörögne a számláló, egyébként az AVR indulásakor alapból nulla
- az SREG-be épp egy "sei()"-nek megfelelő műveletet állítasz, de azt inkább a TIMSK beállítás után kéne...
(#) norbigal hozzászólása Jan 21, 2012 /
 
Szeretnék építeni egy Header Board-ot egy ATmega16L-hez. Az AVCC-ről olvastam az adatlapban, hogy egy szűrő kell rá és visszaolvasva épp most beszéltetek is róla, de egy dolog még nem világos: Az AREF lábat közvetlenül 5V-ra kell tenni??? Mert a neten keresgélve olyanokat találtam, hogy ha +5V-ra kötöm, akkor a chip A/D átalakítója a bejövő analóg jelet +5V-nál 1023-ként adja vissza. Vagyis 0 és a referencia feszültség között 1023 értéket képes érzékelni. EZ így helytálló? Vagy ez lehet nagyobb 5V-nál is? Az A/D átalakító egyébként egy LM35-ös hőszenzorhoz kellene majd, de jó lenne nagyjából univerzálisra csinálni az áramkört, mert ha az működik másokat is kipróbálnék.


A másik problémám pedig, hogy az 1 oldalas NYÁK miatt eddig minden láb megúszta az átkötést, de a MISO és MOSI-t sehogy nem tudom elvezetni az ISP felülethez. 0 OHM-os ellenállással megoldhatnám a dolgot, HA lenne itthon, de sajna nincs. Csak netről tudnék rendelni, de 480FT-ot kifizetni 2 db 10FT- os alkatrészért elég gázos lenne. Tehát ha a MISO/MOSI lábakat egy 180 Ohm-os ellenálláson keresztül programozom az mit befolyásol? Ugyanúgy fog programozni, vagy esetleg megkaphatom a jó öreg ENTERING PROGRAMMING MODE: FAILED! szöveget?
(#) zombee válasza norbigal hozzászólására (») Jan 21, 2012 /
 
Ez így nem igaz, én speciel mindig az AVCC-re kötöm és ha az AVCC a referencia akkor semmi gond nem lehet.

A gyártó ajánlásáért az adatlapon az ADMUX-ot leíró rész: az AREF lábra minden más esetben amikor nem ő a referencia, egy kondenzátort ír elő(közte és a föld között). Értéket nem ír, de szerintem 100-220nF elég.

Én is használok 0Ohm ellenállásokat, de csakis SMD-ben, az egyszerűbb mint fúrni és átkötni.
Nem írtad hogy SMD vagy DO, de ha DO akkor a 0 Ohm ellenállás helyett egy szál drót miért nem jó?
Egyébként 180 Ohm az nem probléma, csak ne legyen terhelve(pl. LED-ekkel) az adott láb!
Akkor biztosan programoz. Van aki a programozóba 1kOhm-ot épít bele a leválasztás miatt.
(#) kovacssz válasza zombee hozzászólására (») Jan 21, 2012 /
 
igen, az a problémám, hogy nem látom, hogy működne a megszakítás, a PRTC LEDjei sötétek maradnak. A megszakítás első meghívásától folyamatosan magas szinten kellene lenni a PORTCnek mivel nem törlöm sehol -legalábbis én így gondolom...

javítottam így:
  1. #define F_CPU 8000000UL
  2. #include <avr/io.h>
  3. #include <avr/interrupt.h>
  4.  
  5. ISR(TIMER0_OVF_vect)
  6. {
  7. PORTC=0xff;
  8. }
  9.  
  10. int main(void)
  11. {
  12. DDRC=0xff;
  13. PORTC=0x00;
  14. TIMSK|=(1 << TOIE0);
  15. sei();
  16.               TCCR0|=(1 << CS02)|(1 << CS00);
  17.     while (1)
  18.     {
  19.     }
  20.  return 0;
  21. }


de így sincs változás. Egyébként nagyon sok variációt csináltam már, töltöttem le mintaprogikat a netről is, de semmi...
Ha mainbe vagy a while elé rakom a PORTC=0xFFet, akkor úgy OK.
Fordítási hibát egyszersem írt ki
(#) zombee válasza kovacssz hozzászólására (») Jan 21, 2012 /
 
Először a JTAGEN-t kéne kikapcsolni, ha nem adja akkor hardverhibát sejtek.
Nézzük meg akkor hogy elindul-e az időzítőd. A while részbe tegyél egy ilyet:
  1. PORTC = TCNT0;


Frekimérővel mérve a PORTC lábait a nagyobb számú lábakon fele/negyede/nyolcada... kell lennie a frekinek.
(#) kovacssz válasza zombee hozzászólására (») Jan 21, 2012 /
 
hmm, a PORTC = TCNT0;-al számol, szépen, megvannak a frekik. Szóval a számláló elindul, csak valahogy a megszakítás nem jön.
megnéztem a fordítási optimalizációt is, ott -Os van, viszont felette a device: ATMEGA128 volt. Ahogy áttettem ATMEGA8ra jó lett...szóval ez volt a probléma.

köszönöm a segítséget!
(#) zombee válasza kovacssz hozzászólására (») Jan 21, 2012 /
 
Na ez a msáik probléma, jó ha tudja az ember hogy mit programoz. Az interruptok máshol vannak!
(#) Reggie válasza zombee hozzászólására (») Jan 21, 2012 /
 
Nem hogy kiprobaltam, azzal gyartunk mindent, es tokeletesen mukodik. Ha neked meg 10u is kell neha, ott valami komoly problema van, erdemes lenne a layoutot es a taparamkoroket megvizsgalni/atgondolni.
(#) kovacssz válasza zombee hozzászólására (») Jan 24, 2012 /
 
sajnos még nem nagyon ismerem a dolgokat ezek az első karcsapások az AVR világában. De idővel...
(#) mester06 hozzászólása Jan 24, 2012 /
 
Üdvözletem!

2 LED-et (sorba kötve) szeretnék működtetni egy atmega8 kimenetéről. A LED-eket tranzisztorral szeretném kapcsolni (gondolom az avr elbírná magában is azt a 2 ledet, de így tisztességesebb megvalósítás szerintem).

Jól gondolom, hogy ha egy PNP tranzisztor bázisát a kimenetre kötöm (felhúzóellenállás engedélyezve van az adott kimeneten) és a kimenetre logikai 0át adok, akkor a tranzisztor be fog kapcsolni?
(#) zombee válasza mester06 hozzászólására (») Jan 24, 2012 /
 
Én max. 15mA-t szoktam számolni, az alatt elbírja. Ettől függetlenül én arra tippelek hogy nem fog menni, méghozzá a sorbakötés miatt! A legtöbb LED nyitófeszültsége 2.5-3V körüli, az AVR pedig max. 5V lehet. Régebbi, diffúz LED-eknél már lehet 1.5-2V, de én a párhuzamos kötést ajánlom, LED-enként 1-1 előtét ellenállással.
De ha nagyobb fesz is kéznél van akkor a sorbakötött LED-ek katód oldala egy NPN tranzisztor kollektorára mehet, de itt se feledkezz meg az áramkorlátozó ellenállásról!
(#) trudnai válasza mester06 hozzászólására (») Jan 24, 2012 /
 
Zombee hozzaszolasat annyiban szeretnem kiegesziteni, hogy a tranzisztor segitsegevel a LED-eket meg lehet taplalni nagyobb feszultseg forrassal is. Tehat ha a nyito feszultsegek miatt a LED-eket nem lehet 5V-rol hajtani (ami nyilvan megvan a kontrollered meghajtasa miatt) akkor tehetsz oda egy masodik feszultseg forrast is ami lehet 9V vagy 12V stb.
(#) Steven19 válasza mester06 hozzászólására (») Jan 24, 2012 /
 
Helló.Így van. De mivel 20mA-ig simán terhelhető a kimenete az AVR-nek így nem lenne gond a led működtetése közvetlen sem, de ahogy gondolod.
De ezzel a tranzisztoros dologgal vigyázz mert ha a tranzisztor bázisa magasabban van mint 5V akkor tönkreteheted az AVR kimenetét.Akkor már inkább NPN-est használ és akkor logikai magas szintre fog negatívot adni a lednek és láss csodát világítani fog a leded. Valamilyen BC tranzisztorral nyugodtan próbálkozhatsz Bázissal sorosan egy 1,2KOhmos ellenállás azt ennyi.
(#) mester06 válasza zombee hozzászólására (») Jan 24, 2012 /
 
Azért akartam sorba kötni a ledeket, mer fényszenzorba kellenek, ahol fontos, hogy a 2 LED fénye azonos legyen, és soros kapcsolásban ugye az áramok megegyeznek...Bár, egy kicsit belegondolva ha párhuzamosan kötöm őket azonos előtéttel, akkor se lehet mérést zavaróan nagy különbség a két fényerő között.

A tranzisztor bázisára kell kötnöm ellenállást, vagy mehet közvetlenül az AVR-re?

EDIT: mire megírtam már meg is kaptam a választ köszi nektek
(#) sikolymester válasza mester06 hozzászólására (») Jan 24, 2012 /
 
Ami a fényerőt illeti, sorba kötve csakugyan azonos áramuk lesz, a fényerő pedig elég jó közelítéssel arányos ezzel. Azzal viszont ellentmondanék, hogy két led fényereje megegyezik azonos előtét ellenállással.
Láttam én már órát, amiben volt 100 fehér led. Nos szembetűnő különbségek voltak a fényerejük között.

Azzal ellentmondanék, hogy 5V -os tápfesszel nem menne két led sorba kötve. Egy piros led példának okáért ~1.7V-nál nyit.

Egyszerűen fel kell lapozni az adatlapját és megnézni. Legtisztább persze áramgenerátoros kapcsolással lenne a dolog, de feltételezem ekkora felhajtást nem akarsz.
(#) mester06 válasza sikolymester hozzászólására (») Jan 24, 2012 /
 
Igazából van elfekvőben egy áramgenerátor (lézerekkel is szórakozok bár még csak próbapanelen van meg), csak az vele a problémám, hogy egy elég kis robotalvázra kell felzsúfolnom mindent.

Szerintem maradok a sima előtét ellenállásnál, azt meg majd kipróbálom, hogy nyitnak-e a ledek 5V-ról sorban. Ha közel egyenlő a két led fénye, már megfelel, csak egy fekete vonalat kell megtalálnia a szenzornak (vonalkövetőt építek)
(#) zombee válasza mester06 hozzászólására (») Jan 25, 2012 /
 
Áramgenerátornak a tranzisztor(NPN) is megteszi, de csak óvatosan számold a bázisáramot nehogy leégjen...
Következő: »»   401 / 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