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   422 / 840
(#) szdani válasza Massawa hozzászólására (») Márc 7, 2012 /
 
Az RCA-ba mert ő is olyan csatlakozót használt gondolom oda kell.
(#) Massawa válasza szdani hozzászólására (») Márc 7, 2012 /
 
Van valamilyen müszered, vagy szkopod?

Voltmérövel kb. 1 V -t kellene mérned a kimeneten, szkoppal meg egy videojel féleséget.

Él a TV-den az RCA bemenet - van TV-n ahol ezt programozni kell, meg olyan is ahol ez csak kimenet.
(#) szdani válasza Massawa hozzászólására (») Márc 7, 2012 /
 
A tv rca része jó mert ha mást dugok rá akkor működik. Műszerből csak multiméterem van mert nincs pénzem szkópra:S pár vízszintes csíkot látok pontosan ha rádugom a tv-re.
(#) Massawa válasza szdani hozzászólására (») Márc 7, 2012 /
 
Akkor SW hibád lesz.
(#) zombee válasza szdani hozzászólására (») Márc 7, 2012 /
 
Szerintem az AVR órajel lesz a ludas, vagy a kimenő ellenállás! FUSE bitek beállítva?
(#) szdani válasza zombee hozzászólására (») Márc 7, 2012 /
 
a fuse bitekben csak azt állítottam be hogy 20MHz-es kristályról kapja az órajelet. CKSEL=1111 SUT=11 a többit azt hagytam gyárinak CKVID8 nincs bepipálva.
(#) Brian88 válasza szdani hozzászólására (») Márc 8, 2012 /
 
Szia
Az adatlapon azt írja (Mega168) hogy a 20mhz ajánlott fuse bit: Full swing crystal oscillator operating modes
Vagyis: CKSEL3..1 értéke: 011
Ezen az adatlapon a 31. oldalon írja!
Szerintem még érdemes ezzel is megpróbálni.

http://www.atmel.com/Images/doc2545.pdf
(#) atideath hozzászólása Márc 8, 2012 /
 
Sziasztok! Eddig minden AVR-emet 5V-on használtam. Most viszont egy kijelzőhöz hogy tesztelni tudjam 3.3V kellene. Hogyan tudom 3.3V-on használni az AVR-t? Csak annyi hogy a VCC lábára nem 5V-ot adok hanem 3.3V-ot? Vagy FuseBite-t is állítani kell? Atmega128 az alany. Vagy Atmega 644P
(#) kiborg válasza atideath hozzászólására (») Márc 8, 2012 /
 
Szia!
Váltáshoz csak annyi, hogy 5V helyett 3,3V-t adsz neki a VCC-n. Nem muszáj hozzá módosítani semmit, de ha akarod, a Power On Reset szintjét átállíthatod, de nem kötelező. Másrészt sima ATMega128 nem lesz jó. VAGY ATMega128L, ami megy 3,3Vról(igaz,hogy csak 8MHz-ig) VAGY ATMEGA128A, ami 3,3Vról is 16MHzig megy.
ATMega644P-hez nem tudok hozzászólni.
Kiborg
(#) pooler hozzászólása Márc 8, 2012 /
 
Sziasztok!
Belső oszcillátort használva előfordulhat hogy néha nem teljesen azt csinálja a kontroller amit kellene neki? Értem itt ez alatt hogy menüben lépkedve egyszer csak kihagy egy sort az lcd-ről amit ki kellene írnia, vagy egy gomb nyomva tartása közben ha épp olyanja van elindít egy másik folyamatot mintha egy másik gombot is megnyomnék közbe.
Okozhatja ezt az hogy belső oszcillátort használok?
Vagy az olcsó kínai kijelző lehet a ludas? Vagy esetleg a gomboknál lehet a gond az hogy a belső felhúzókat használom? A program biztos hogy jó, mert már átnéztem vagy 20x és a fuse bitek is jól vannak beállítva. Tápot USB-ről kapja.
Igazából nagyon ritkán fordul elő és teljesen véletlenszerű időnként/helyzetekben (ezért is tippeltem órajel hibára) így annyira nem is zavaró, de jó lenne azért a legközelebbi projektemet bugmentesre csinálni Van ötlete valakinek esetleg mitől lehet ez?
(#) pooler válasza pooler hozzászólására (») Márc 8, 2012 /
 
Kicsit jobban kutakodva találtam itt a fórumban egy hozzászólást ami talán választ ad a gombos problémámra: Bővebben: Link
De az lcd kihagyások még mindig kérdésesek, bár így akkor lehet hogy azt is valami hálózati zavar akasztja ki, és erre is ott a megoldás a kommentben De a kérdés azért továbbra is adott, a belső oszcillátor okozhat gondokat a kontroller működésében? Már persze nem a timerek pontosságára gondolok. Érdemes külsőt használni valamiért ha nem fontos a pontosság?
(#) kiborg válasza pooler hozzászólására (») Márc 8, 2012 /
 
A belső oszci csak költségcsökkentő megoldás. Nem találkoztam olyannal még, hogy a belső miatt hibázott volna egy program. Pontossága az olyan amilyen,de ez mint írtad nem kritérium.
Tudod nekem azt tanították: minden program tartalmaz legalább egy változót, minimum egy ciklust és egy hibát. Szóval a programot tesztelted már másik egységen más hardver összeállításban, stb... ahol tuti jól működik ? Ameddig ez nem igaz, addig nem mondhatod, hogy biztos jó a program. A fordítás, optimalizálás, megszakítás tud rejtélyes hibákat belevinni Tapasztalat.
Üdv Kiborg
(#) Reggie válasza pooler hozzászólására (») Márc 8, 2012 /
 
Szerintem a stack tulcsordulasat kene ellenorizned. Tipikusan arra utalnak a jelek.
(#) pooler válasza kiborg hozzászólására (») Márc 8, 2012 /
 
Annyira azért nem bonyolult a program hogy ne lehessen kiszúrni benne egy hibát a tesztelésnél Ebben biztos nincs hiba, és szimulátorban is tökéletesen tette a dolgát. Ha ez nevezhető más hardver összeállításnak. Meg ugye az hogy nem lehet kötni semmihez a jelenséget, ez ki is zárja a program hibát (legalábbis a problémával kapcsolatos részekét). Mert akkor meg tudnám ismételni ha ugyanazt eljátszom még egyszer mint amikor a hiba előjött. Szóval biztos hogy valami zavar, én arra gondoltam hogy a belső kvarc pontatlansága miatt. De így belegondolva egy rádió antenna van a kontrollertől egy centire, szóval akkor valószínű inkább ez lesz a hiba. Leárnyékolom rendesen, aztán majd kiderül. Nem gondoltam hogy ilyen érzékeny lesz. Mindenesetre köszi
(#) pooler válasza Reggie hozzászólására (») Márc 8, 2012 /
 
Hmm.. Erre nem is gondoltam, pedig tényleg overflow szagú. Eljátszok akkor először ezzel, köszi a tippet.
(#) Droot hozzászólása Márc 9, 2012 /
 
Gyári avr isp mkii-met szeretném megjavítani. Nagyfeszültséget kapott, egy földhurkon keresztül. Azóta se kép se hang, ha bedugom a led-ek nem világítanak. Ötleteket várok.
A benne lévő atmega128-ba égetendő hex-et szeretném megszerezni.
(#) sikolymester válasza Droot hozzászólására (») Márc 9, 2012 /
 
Az eredeti hex-et sosem kapod meg.
Attól félek, hogyha fel sem ismeri a géped, akkor annak annyi. Általában a programozott oldalról szoktak túlfesznél kinyuffani a szintillesztők, amiket cserélni lehet. A te esetedben azonban ha jól veszem ki nem ez a gond.
(#) Wiver hozzászólása Márc 9, 2012 /
 
Sziasztok! Szeretnék egy egyszerű áramkört megépíteni. Ebben kérném a segítségetek. A célom az lenne hogy egyetlen egy darab hétszegmenses kijelző ledjeinek a körbe körbe villogtatása, mintha körbe forogna. Ezt attiny13 vagy attiny2313-as AVR-el szeretném (mert csak az van itthon) Valaki össze tudna nekem dobni erre egy áramkört, Úgy hogy egy ovis is megértse. És kellene a hozzá való programocska is amit az AVR-be égessek. (Itt a hex file-ra gondolok, és magára a forrás kódra, hogy tudjak rajta módosítani, kísérletezgetni, esetleg egy nyomógomb is jól jönne, amivel leáll, és újboli megnyomásra elindul, vagy más ötlet) Mert nagyon lelkes vagyok, szóval megtudom építeni. De szükségem van a siker élmény. Célom ezzel a tanulás, kisérletezés, építés, díszítés. Köszönöm szépen a segítségetek!
(#) sikolymester válasza Wiver hozzászólására (») Márc 9, 2012 /
 
Ajánlom figyelmedbe ezt a sorozatot: Nyolc lábbal AVR

A lábkiosztás azonos, így hogyha ATtiny 13 -at állítasz be a project settingsedben, akkor helyesen fog neked lefordulni.
(#) norbigal hozzászólása Márc 9, 2012 /
 
Hali
Miután majdnem minden megszakítást már kipróbáltam, belevágtam az Atmega16 Beépített RTC funkciójának tesztelésébe.

A PORTC-t bemenetként inicializáltam, a megfelelő TOSC1 és 2 lábakra rácsatlkoztattam a kristályt és megírtam a programot.
Úgy gondolom, hogy magával a programmal nincs gond, mert ha le szedem a kristályt akkor nem történik megszakítás (a PORTB-n kivillanna egy LED másodppercenként), viszont bekötve megtörténik a villogtatás. Prescaler beállításom 1, vagyis nem lehet leosztási probléma.

Maga programrészlet, olyan értékekkel amelyeken kb fél másodpercenként növekededik a sec értéke:
void TC2_RTC()
{
for(;
{
if((TCN2UB&OCR2UB&TCR2UB)==0) break;
}
bc(TIMSK,OCIE2); //Disable TC2
bc(TIMSK,TOIE2); //Disable TC2
//_delay_ms(10);

bs(ASSR,AS2); //AS MODE
//_delay_ms(10);

bs(TIMSK,OCIE2);
//_delay_ms(10);
bs(TCCR2,CS20);
bc(TCCR2,CS21);
bc(TCCR2,CS22);
OCR2=32;

cli();
sei();

}

ISR(TIMER2_COMP_vect)
{
counter--;
if(counter==0) {sec++; counter=1;}
if(sec==60) {sec=0; min++;}
if(min==60) {min=0; hour++;}
if(hour==24) {hour=0;}
}


Azonban valami mégsem kerek. A fenti programban ugye nem a javasolt értékek vannak. Hiszen elvileg 32.768KHz-es kristálynak kellene lennie a TOSC1,2 lábak között, és az OCR2-t is 32768-cal kellene feltölteni, hogy pontosan 32768 db megszakítás után (amikor count==0) 1 másodperc teljen le.

Viszont ilyen beállításokkal csak hosszú percek után villan ki a LED-em aminek 1 másodpercenként kellene fel illetve lekapcsolnia.
Próbálkoztam más hasraütött, jóval kisebb értékekkel és úgy sűrűbben villog a LED. (ezt a programrészletet tettem be a javasolttól eltérő értékekkel)
A hosszú bevezető után tehát az alábbi kristállyal kapcsolatban kérnék segítséget: KDS7B. Találtam egy külföldi oldalt ahol szintén az RTC-vel és ezen kristállyal voltak problémák de nem írtak semmi végleges dolog vele kapcsolatban. VOlt már valaki, aki AVR-rel használt ilyen kristályt? Az üzletben ahol vettem 32,768KHz-esnek árulták de olyan érzésem van, hogy ennek kanyarban sincs köze ehhez a frekvenciához. Hogy lehetne le ellenőrizni a kristály értékét? Multiméterem sajnos nem mér frekvenciát, scopeom meg nincs, de valahogy ki kellene derítenem a problémát, mert szerintem csak a kristály lehet a gázos...
(#) sikolymester válasza norbigal hozzászólására (») Márc 9, 2012 /
 
Először is hadd javasoljam a kód tag használatát, akkor kicsit könnyebben tudjuk olvasni a forrásod.

Idézet:
„...az OCR2-t is 32768-cal kellene feltölteni...”

Az OCR2 regiszter 8 bites, így abba biz isten nem írsz bele ekkora számot.

Én azt javaslom, hogy állítsd be az előosztót 128-ra. Így amikor túlcsordul a Timer2, ami ugye 8 bites, akkor az 128*256 = 32768 órakettyenés után történik meg, ami egy 32768 Hz -es órajel mellett pont 1mp-et jelent.
(#) norbigal válasza sikolymester hozzászólására (») Márc 9, 2012 /
 
Hű köszi, kipróbálom így. Érdekes, hogy ennyire nagyvonalúan elsiklottam a regiszter 8 bites mivolta felett, mert más megszakításra már használtam a TC2-t, és akkor valahogy magától jött, hogy 255 lehet a max érték. Majd kipróbálom, de szerintem tutira ez lesz a baj. Köszi mégegyszer!

ui: a kód taggal legközelebb megpróbálkozom
(#) sikolymester válasza norbigal hozzászólására (») Márc 9, 2012 /
 
Egyébiránt nem kizárt, hogy egy kristály ne működjön a rendeltetésének megfelelően. Nekem egy kapcsolásomban egyszer csak meghalt a 12MHz -es kvarcom. Más kapcsolásban sem ment már, szóval tuti kampec lett.

Forrasztási hősokk nem lehetett szerintem, mivel 1 év üzemelés után halt meg. Bár lehet közrejátszott esetleg, habár nem hiszem, hogy 2mp-nél tovább melegítettem volna.

Szóval mindig lehet bármi a hiba.
(#) vzoole válasza norbigal hozzászólására (») Márc 9, 2012 /
 
Az említett hibán kívül is érzek némi bizonytalanságot.

Pl.: a counter változó... ha nullára deklarálod, akkor első körben negatív irányba túlcsordul, és felveszi a maximum éréke, majd egyszer lefogy 0-ra. Amikor 0, akkor beállítod egyre, de mivel minden megszakítás elején csökkented is 1-el, majd noveled 1-el.
Ennek semmi értelme.

Valahogy így kéne kinéznie TIMER1 használatával:
(beállításoknál csak leírom mit kell keresni)

  1. //TIMER1 beállítása CTC módba
  2.  
  3. //TIMER1 Output Compare "A" megszakítás engedélyezése
  4.  
  5. //T1 láb beállítása órajelnek
  6.  
  7. OCR1A = 32768; //32768 órajel után legyen megszakítás (azaz 1 mp)
  8. sei();
  9.  
  10. ISR(TIMER1_COMPA_vect) { //ez fut le 32768 órajel után (azaz másodpercenként)
  11.     sec++;
  12.     if(sec==60) {sec=0; min++;}
  13.     if(min==60) {min=0; hour++;}
  14.     if(hour==24) {hour=0;}
  15. }
(#) vzoole hozzászólása Márc 9, 2012 /
 
Valakinek van ötlete, hogyan lehet a PWM jelet szinkronizálni külső órajellel?

Konkrétan váltakozó feszültséget kéne kapcsolni, de nulla átmenetnél.

Köszi!
(#) sikolymester válasza vzoole hozzászólására (») Márc 9, 2012 /
 
Hát őszintén szólva számomra nem világos egészen a kérdés.
Kicsit kérlek fejtsd ki bővebben mit szeretnél csinálni.
(#) norbigal válasza vzoole hozzászólására (») Márc 9, 2012 /
 
Köszi a tippeket, bár megvallom ezt a csökkentem és növelem is egyszerre dolgot nem értem :S Vagyis azt értem, hogy annnak valóban nincs értelme, de szerintem nem ez történt, mert-bár nem olyan időközönként ahogy kellene - de a megszakítás állandó időközönként történt. Bár mára már nem agyalok ezen, de holnap átgondolom amit írtál mert valszeg igazad lehet.
Amúgy a TC1-et már használtam minden ökörségre, de amúgy is az adatlap azt javasolja, hogy a TC2 a legjobb opció RTC-hez szóval maradok annál. Meg amúgy is kár lenne az Atmega 16 "leg többrétűbb" Timer -jét (1-eset) egy órára elhasználni. De mindenesetre köszi a segítséget és észrevételt!
(#) Ricsi89 válasza sikolymester hozzászólására (») Márc 9, 2012 /
 
Szerintem fázishasításos szabályzót akar, ahol a négyszögjel mindig nullátmenetnél vált magas szintre.
(#) vzoole válasza norbigal hozzászólására (») Márc 9, 2012 /
 
Arra gondoltam...

counter=1 állapottól nézzük.

  1. ISR(TIMER2_COMP_vect){
  2.     counter--;  //azaz counter = 0 lesz
  3.     if(counter==0) {sec++; counter=1;} //IF feltétel teljesül
  4.     //az IF mindenképp lefut, mert counter = 0
  5.     //ekkor countert beállítod 1-re (ami ugyan olyan mintha hozzáadnál 1-et)
  6.     //mivel counter=1 és következő körben megint le vonsz belőle 1-et, azaz 0 lesz,        de ha 0 akkor megint lefut az IF és beállítod 1-re.
  7.  
  8.     //a többi rész nem számít most
  9. }


Lényegében olyan mintha ennyit csinálnál a counter változóval:
  1. counter--;
  2. counter++;


remélem érthetően írtam le.
(#) vzoole válasza sikolymester hozzászólására (») Márc 9, 2012 /
 
Igen... 24V AC feszt kéne kapcsolnom.
Úgy akarom, hogy nulla átmenetnél kapcsoljon ki.

Egy hullám 10ms ideig tart, ennyi idő alatt kéne fel és le is számolnia a PWM-nek (phase correct PWM).
És valahogy a hullám végéhez kéne szinkronizálni a jelet.

Mellékelt képen látszik a PWM jel, és a kimeneti AC jelalak is.
(AC jelalakon a vonalazott rész a kapcsolt feszültség)

Csak ennyi
Következő: »»   422 / 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