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
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   654 / 654
(#) Kovidivi válasza Droot hozzászólására (») Szo, 22:27 /
 
Én ezt úgy küszöböltem ki, hogy egy bizonyos sebességnél gyorsabban fizikailag lehetetlen forgatni az encodert kézzel, így megszabtam, hogy ha x időn belül újra forgást érzékelek, ne történjen semmi. Ugyan ez, a forgásirány váltáskor. Néha egyenletes tekerésnél azt is vettem észre, hogy a növelt változó néha csökkent. Megszabtam, hogy ha egyik irányba forgatás történik, akkor ismét egy bizonyos időn belül történő forgásirányváltás legyen figyelmen kívül hagyva. Az időkre már nem emlékszem, úgy kísérleteztem ki soros monitor segítségével, milyen gyorsan tudom oda-vissza pörgetni az encodert, mi a leggyorsabb forgatási sebesség.
(#) Droot válasza Kovidivi hozzászólására (») Vas, 8:29 /
 
Ez jól ahangzik. A forráskódot esetleg fel tudod tenni?
(#) Kovidivi válasza Droot hozzászólására (») Vas, 10:10 /
 
Bővebben: Link
Ebben már benne van a gyorsabb tekerés észlelése is! Ha jól látom, hiányzik belőle az irányváltás védelem, azt rád bízom! De ha nem rakod bele, akkor sem lesz zavaró, ha rendesen van kondival és soros ellenállással pergésmentesítve az encoder.
A hozzászólás módosítva: Vas, 10:13
(#) Droot válasza Kovidivi hozzászólására (») Vas, 10:27 / 1
 
Köszi! Én mondjuk soros ellenállást nem kötöttem be, csak párhuzamos kondit. Még sokat kell rajta faragni, mert ugye atmega8-on nincs millis függvény.
Tehát az irányváltás védelem úgy működik, ha tekertem pl jobbra, akkor ki van védve hogy utána csak x ms múlva tekerhetem balra, ugye?

Egyébként ötletes megoldás, tetszik!
Ha egy tippet elfogadsz, használd a #define-t! Pl: #define HIPERGYORS_VALT 50
Ez azért jobb, mintha változót használnál mert a fordító, de lehet hogy nem is az hanem a linker kicseréli a HIPERGYORS_VALT szót 50-re, tehát nem jut el a mikrovezérlőig, míg a változó plusz memóriát használ.
(#) phc hozzászólása Vas, 12:45 /
 
Üdv mindenki!
Van egy probléma amire nem találtam megoldást hosszas keresgélés után sem.
Nem ketyeg a kvarc... (ATMEGA328P-AU TQFP32)
Pontosítok, mert azért mértem is.
A kavics egyik lábán alacsony szintet mérek, a másik láb rendben van. Külső oszcillátorral működik.
Első programfeltöltés után működött rendesen, majd apróbb változtatások, 2-3 újbóli feltöltés, és jött a hibaüzenet hogy nem elérhető. Segédórajellel persze ment rendesen.
feltöltöttem egy korábban írt programot teszt ként hátha ott van valami probléma.

Továbbá ezeknél a modelleknél i/o ként fel lehet használni az xtal lábakat is, de ezt a lehetőséget már kizártam.
kicseréltem a chipet is egy másikra, és ugyan ez lett a vége.
(#) TavIR-AVR válasza phc hozzászólására (») Vas, 12:49 /
 
Órajelforrás megadásod hibás? Fusebitek elállítva...
Timer2-t óraként definiálod?
A hozzászólás módosítva: Vas, 12:49
(#) phc válasza TavIR-AVR hozzászólására (») Vas, 12:52 /
 
Egy pársoros alap programmal kizártam a programhibákat, ahol csak egy LED villog 100 as delay el.
(#) phc válasza TavIR-AVR hozzászólására (») Vas, 13:16 /
 
És valóban a fusebit volt a hibás! Köszönöm a gyors választ!
(#) phc válasza TavIR-AVR hozzászólására (») Vas, 13:52 /
 
És valóban a fusebit volt a hibás! Köszönöm a gyors választ!

ezt elsiettem.
Annyi történt, hogy bekapcsoltam a belső órajelet, de mikor külsőre váltottam teljesen elvesztettem.
Már nem tudom külső órajelgenerátorral sem elérni.
(#) TavIR-AVR válasza phc hozzászólására (») Vas, 14:14 /
 
Kívül:
- szakadt/hibás/törött/forrasztáselengedett 2 db kondi (12...27pF)
- sérült kvarc
- hosszú vezeték, a kvarcok fele
- forrasztógyanta/nedvesség
(#) phc válasza TavIR-AVR hozzászólására (») Vas, 14:29 /
 
Kb 18mm hosszú a szál a kvarc felé, a gyanta miatti kapacitásra gondoltam korábban, de rendesen le van takarítva.
A kondikat cseréltem, a szakadásokat mértem, a viákat is végigmértem.
kvarcokat cserélgettem 8, 16, 20 MHz... külső generátor 8MHz.
nedvesség kizárható, a kvarc egyik lábán alacsony logikai állapot volt eddig. Most viszont ez a jelenség megszűnt.

Marok egy új nyákot és meglátjuk.

Esetleg van valami ötlet mi eredményezhette ezt 2x egymás után ?
(#) zombee válasza Droot hozzászólására (») Vas, 15:19 /
 
Én lehet hogy timert használnék amivel X időnként leolvasom az értéket ÉS fel is dolgozom, beállítom az enkódertől függő változót és kész. Ennek az időnek természetesen igazodnia kell a lehető leggyorsabb forgatáshoz, legfeljebb az "események" közt eltelt legkisebb időnek 1/4-e lehet, de ne legyen túl gyors(pl. ezred része) sem! Pl. ha motoros forgatásról beszélünk 3000/perc fordulatú motorral és egy 24 lépéses enkóderrel akkor kb. 4.8kHz-es leolvasásról beszélünk. Egy "humán interfész" ennél sokkal lassabb!

Egy működőképes enkódernél lehetetlen, hogy amikor az egyik jelnél váltás van, akkor a másik jel nem stabil. Függetlenül a szűréstől. Ezért nagyon érdekes számomra minden olyan esemény, amikor egy egységnyi elfordulásnál 5-10 egységeket is lép a változó. Legfeljebb 1-1 egységet ugrálhatna fel-le, azt is csak ha határon van a dolog.

Ezt az egyszerű kódot próbálta már valaki? Nem épp optimális, de egy 8MHz-es AVR-en simán elmegy:
  1. #DEFINE MAX 23
  2. #DEFINE MIN 0
  3. volatile int16_t pozicio = 0;
  4. uint8_t enkoder_elozo = PORTB&0b00000011; //feltéve ha PORTB1:0 az enkóder bemenete
  5.  
  6. ISR(TIMER_1_MATCH_A_INTERRUPT) //CTC-vel
  7. {
  8.   uint8_t enkoder = PORTB&0b00000011;
  9.   if(enkoder_elozo!=enkoder)
  10.   {
  11.     if(enkoder_elozo==00 && enkoder==10) pozicio++;
  12.     else if(enkoder_elozo==10 && enkoder==11) pozicio++;
  13.     else if(enkoder_elozo==11 && enkoder==01) pozicio++;
  14.     else if(enkoder_elozo==01 && enkoder==00) pozicio++;
  15.     else if(enkoder_elozo==10 && enkoder==00) pozicio--;
  16.     else if(enkoder_elozo==11 && enkoder==10) pozicio--;
  17.     else if(enkoder_elozo==01 && enkoder==11) pozicio--;
  18.     else if(enkoder_elozo==00 && enkoder==01) pozicio--;
  19.     enkoder_elozo = enkoder;
  20.     if(pozicio>MAX) pozicio = MIN;
  21.     else if(pozicio<MIN) pozicio = MAX;
  22.   }
  23.  
  24. }
A hozzászólás módosítva: Vas, 15:20
(#) Massawa hozzászólása 14:02 /
 
Egy kérdés

A studio4 szimulator üzemmodban nem akarja beolvasni a kézzel állitott port bemeneteket.
Ldi r16,$0
Out ddrd,r16. ; ddrd bemenet
In r16, pind

Ha a pinD ben az egérrel 11111110- állitok (7 fekete kocka 1 üres) akkor 254 helyett is csak 0-t olvas.
Nem tudok rájönni miért. Ez a rutin eddig mindig ment.
(#) rolandgw válasza Massawa hozzászólására (») 14:53 /
 
Mikor állítod ? Mert ha a pin olvasás előtti utasításnál az már késő.
(#) Massawa válasza rolandgw hozzászólására (») 15:11 /
 
2 lépéssel elötte.
(#) tkovacs válasza Massawa hozzászólására (») 15:55 /
 
Szia!
Én bekapcsolnám a felhúzóellenállásokat.
ldi r16,0x00
out ddrd,r16
ldi r16,0xff ;enable pull-up
out portd,r16
in r16,pind
Üdv.
(#) Massawa válasza rolandgw hozzászólására (») 16:26 /
 
Már sikerült 4-5 lepéssel korábban akkor megy.
(#) Massawa válasza tkovacs hozzászólására (») 16:28 /
 
Kösz, azok ott vannak alapbol, most inkább a szimulátorral voltam gondban. Ahhoz meg nem kell a pull-up.
A hozzászólás módosítva: 16:29
(#) rolandgw válasza Massawa hozzászólására (») 16:50 /
 
Erre való a stimuli fájl .
Következő: »»   654 / 654
Bejelentkezés

Belépés

Hirdetés
Frissek
2015. Márc, 02. Hé
19:54:38
Jelenleg 671 fő olvassa az oldalt
Online tagok:
Lapoda.hu     XDT.hu     HEStore.hu