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   149 / 840
(#) TavIR-AVR válasza Teng hozzászólására (») Szept 16, 2009 /
 
Az XTAL1 bemenetre külső órajelet tessék adni, akkor újraéled....
(#) Teng hozzászólása Szept 16, 2009 /
 
xtal1 és gnd közé raktam a topi féle cuccot, de meg sem nyikkan igaz 4MHz-s Qvarcot raktam bele, de most próbáltam 12essel sem megy.
(#) Sir-Nyeteg válasza TavIR-AVR hozzászólására (») Szept 16, 2009 /
 
Üdv!
Bővebben: Link
Nem működik az oldal?
(#) Topi válasza Teng hozzászólására (») Szept 16, 2009 /
 
Valami műszer, szkóp, frekimérő, log. analizátor, multiméter? Jó lenne tudni, hogy egyáltalán az oszcillátor megy-e. Ha igen, akkor az STK200 programozó egyáltalán küld-e ki adatot.

Műszer nélkül csak találgatunk. Ha nincs műszered, akkor készíts 4069-ből egy fokozatot LED-hez, hogy megnézd van-e rajta feszültség. Közvetlen ne kösd az oszcillátorra a LED-et, mert megáll. Kell egy köztes fokozat.
Vagy egy soros R, párhuzamos C tagot (LED helyére) amire multimétert kötsz. És nem szabad 0 vagy 5V-ot kapnod... Ha azt kapsz, nem fut az oszc.

Ha így sem oké, akkor nem az órajelet állítottad félre, hanem letiltottad az ISP-t, vagy letiltottad a Reset lábat. Ekkor csak HVSP vagy HVPP-vel lehet programozni.
(#) zsuscsinyo válasza tpeter hozzászólására (») Szept 16, 2009 /
 
Látom pár emberkének (köztük nekem is) jó lenne egy Rotary Encoder kezelő program. Csináltam egyet és egész jónak bizonyul, (persze lehet hogy nem tökéletes) de ez kinek szája íze szerint. Igyekeztem átláthatón és legrövidebb kóddal megoldani, kommentáltam egyes sorokat és csupán a bemeneti portot kell megadni.

Jó szórakozást hozzá!
(#) trudnai válasza zsuscsinyo hozzászólására (») Szept 17, 2009 /
 
Szerintem elegendo, ha csak az A csatornat teszed az interruptra, es igy csak annak felfuto ele okoz megszakitast, utana pedig elegendo a masodik csatorna allapotat figyelni (H szint balra tekered, L szint jobbra...).

Az egesz bonyolultsagat amugy epp az okozza, hogy ne legyen kenyszer varakozas az interrupton belul debouncing gyanant. A masik amit szerettunk volna elkerulni, hogy mikor a luzer tekergeti az encodert a keletkezo prellezes miatt ne keletkezzen olyan sok megszakitas.
(#) janyjozsef hozzászólása Szept 17, 2009 /
 
Itt egy pingelős változat 2db enkóderre.

  1. BYTE m_OldVoltageDir;
  2. BYTE m_OldAmpereDir;
  3.  
  4. BYTE m_VoltageImpulzus[4];
  5. BYTE m_AmpereImpulzus[4];
  6.  
  7. BYTE m_VoltageCounter = 0;
  8. BYTE m_AmpereCounter = 0;
  9.  
  10. int m_Voltage = 0;
  11. int m_Ampere = 0;
  12.  
  13. WORD m_NewVoltage = 0;
  14. WORD m_OldVoltage = 0;
  15.  
  16. WORD m_NewAmpere = 0;
  17. WORD m_OldAmpere = 0;
  18.  
  19. BYTE m_NewLedState = 0;
  20. BYTE m_OldLedState = 0;
  21.  
  22. BYTE CheckVolumeState(BYTE VolumeControll)
  23. {
  24.         BYTE RetVal = 0;
  25.         if(VolumeControll == VOLTAGE)
  26.         {
  27.                 if(LEFT_VOLTAGE == FALSE)
  28.                 {
  29.                         RetVal |= DIR_1;
  30.                 }
  31.                 if(RIGTH_VOLTAGE == FALSE)
  32.                 {
  33.                         RetVal |= DIR_2;
  34.                 }
  35.                
  36.         }else
  37.         {
  38.                 if(LEFT_AMPERE == FALSE)
  39.                 {
  40.                         RetVal |= DIR_1;
  41.                 }
  42.                 if(RIGTH_AMPERE == FALSE)
  43.                 {
  44.                         RetVal |= DIR_2;
  45.                 }
  46.         }
  47.         return RetVal;
  48. }
  49.  
  50. //0, 1, 2
  51.  
  52. char CheckVolumeMove(BYTE Dir, BYTE VolumeControll)
  53. {
  54.         char RetVal = 0;
  55.        
  56.         if(VolumeControll == VOLTAGE)
  57.         {
  58.                 if(Dir == m_OldVoltageDir)return 0;
  59.        
  60.                 m_OldVoltageDir = Dir;
  61.  
  62.                 m_VoltageImpulzus[m_VoltageCounter++] = Dir;
  63.        
  64.                 if(m_VoltageCounter >= 3)
  65.                 {
  66.                         if(m_VoltageImpulzus[0] == DIR_0 && m_VoltageImpulzus[1] == DIR_1 && m_VoltageImpulzus[2] == DIR_3)
  67.                                 RetVal = 1;else
  68.                         if(m_VoltageImpulzus[0] == DIR_1 && m_VoltageImpulzus[1] == DIR_3 && m_VoltageImpulzus[2] == DIR_2)
  69.                                 RetVal = 1;else
  70.                         if(m_VoltageImpulzus[0] == DIR_3 && m_VoltageImpulzus[1] == DIR_2 && m_VoltageImpulzus[2] == DIR_0)
  71.                                 RetVal = 1;else
  72.                         if(m_VoltageImpulzus[0] == DIR_2 && m_VoltageImpulzus[1] == DIR_0 && m_VoltageImpulzus[2] == DIR_1)
  73.                                 RetVal = 1;else
  74.  
  75.                         if(m_VoltageImpulzus[0] == DIR_0 && m_VoltageImpulzus[1] == DIR_2 && m_VoltageImpulzus[2] == DIR_3)
  76.                                 RetVal = -1;else
  77.                         if(m_VoltageImpulzus[0] == DIR_2 && m_VoltageImpulzus[1] == DIR_3 && m_VoltageImpulzus[2] == DIR_1)
  78.                                 RetVal = -1;else
  79.                         if(m_VoltageImpulzus[0] == DIR_3 && m_VoltageImpulzus[1] == DIR_1 && m_VoltageImpulzus[2] == DIR_0)
  80.                                 RetVal = -1;else
  81.                         if(m_VoltageImpulzus[0] == DIR_1 && m_VoltageImpulzus[1] == DIR_0 && m_VoltageImpulzus[2] == DIR_2)
  82.                                 RetVal = -1;
  83.  
  84.                         m_VoltageCounter = 0;
  85.                         m_VoltageImpulzus[m_VoltageCounter++] = Dir;
  86.                 }
  87.        
  88.        
  89.         }else
  90.         {
  91.        
  92.                 if(Dir == m_OldAmpereDir)return 0;
  93.        
  94.                 m_OldAmpereDir = Dir;
  95.  
  96.                 m_AmpereImpulzus[m_AmpereCounter++] = Dir;
  97.        
  98.                 if(m_AmpereCounter >= 3)
  99.                 {
  100.                         if(m_AmpereImpulzus[0] == DIR_0 && m_AmpereImpulzus[1] == DIR_1 && m_AmpereImpulzus[2] == DIR_3)
  101.                                 RetVal = 1;else
  102.                         if(m_AmpereImpulzus[0] == DIR_1 && m_AmpereImpulzus[1] == DIR_3 && m_AmpereImpulzus[2] == DIR_2)
  103.                                 RetVal = 1;else
  104.                         if(m_AmpereImpulzus[0] == DIR_3 && m_AmpereImpulzus[1] == DIR_2 && m_AmpereImpulzus[2] == DIR_0)
  105.                                 RetVal = 1;else
  106.                         if(m_AmpereImpulzus[0] == DIR_2 && m_AmpereImpulzus[1] == DIR_0 && m_AmpereImpulzus[2] == DIR_1)
  107.                                 RetVal = 1;else
  108.  
  109.                         if(m_AmpereImpulzus[0] == DIR_0 && m_AmpereImpulzus[1] == DIR_2 && m_AmpereImpulzus[2] == DIR_3)
  110.                                 RetVal = -1;else
  111.                         if(m_AmpereImpulzus[0] == DIR_2 && m_AmpereImpulzus[1] == DIR_3 && m_AmpereImpulzus[2] == DIR_1)
  112.                                 RetVal = -1;else
  113.                         if(m_AmpereImpulzus[0] == DIR_3 && m_AmpereImpulzus[1] == DIR_1 && m_AmpereImpulzus[2] == DIR_0)
  114.                                 RetVal = -1;else
  115.                         if(m_AmpereImpulzus[0] == DIR_1 && m_AmpereImpulzus[1] == DIR_0 && m_AmpereImpulzus[2] == DIR_2)
  116.                                 RetVal = -1;
  117.  
  118.                         m_AmpereCounter = 0;
  119.                         m_AmpereImpulzus[m_AmpereCounter++] = Dir;
  120.                 }
  121.         }
  122.        
  123.         return RetVal;
  124. }
  125.  
  126. -------------------------------------
  127. A MAIN -BEN
  128.  
  129. l_Move = CheckVolumeMove(CheckVolumeState(VOLTAGE), VOLTAGE);
  130.                 if(l_Move != 0)
  131.                 {      
  132.                         if(BT_VOLTAGE != 0)
  133.                         {
  134.                                 l_Move *= 10;
  135.                         }
  136.                         m_Voltage += l_Move;
  137.                 }
  138.  
  139.                 l_Move = CheckVolumeMove(CheckVolumeState(AMPERE), AMPERE);
  140.                 if(l_Move != 0)
  141.                 {      
  142.                         if(BT_AMPERE != 0)
  143.                         {
  144.                                 l_Move *= 10;
  145.                         }
  146.                         m_Ampere += l_Move;
  147.                        
  148.                 }
  149. ---------------------------------------
  150.  
  151. #define BT_AMPERE                       (PIND & (1<<PD5))
  152. #define BT_VOLTAGE                      (PINB & (1<<PB2))
  153.  
  154. #define LEFT_VOLTAGE            (PINB & (1<<PB0))
  155. #define RIGTH_VOLTAGE           (PINB & (1<<PB1))
  156.  
  157. #define LEFT_AMPERE                     (PIND & (1<<PD6))
  158. #define RIGTH_AMPERE            (PIND & (1<<PD7))
  159.  
  160. #define DIR_0                           0x00
  161. #define DIR_1                           0x01
  162. #define DIR_2                           0x02
  163. #define DIR_3                           0x03
  164.  
  165.  
  166. #define VOLTAGE                                 0x05
  167. #define AMPERE                                  0xA5


Ez csak kimásolás egy nagyobb progiból.
Remélem mindent ide tettem ami kell.
ATMEGA8 belső RC osc 8MHz
Gombos (2láb) 16-os felbontású enkóder (3láb)
Idézet:
„ss”
(#) janyjozsef hozzászólása Szept 17, 2009 /
 
Valaki tudja, hogy ha kód ként illesztem be, akkkor miért nem kódként jelenik meg?

A tömbös dologra a forgásirány megállapítása miatt van szükség. Ez tárolja az előző állapotot.
(#) trudnai válasza janyjozsef hozzászólására (») Szept 17, 2009 /
 
[OFF]
Idézet:
„Valaki tudja, hogy ha kód ként illesztem be, akkkor miért nem kódként jelenik meg?”


Mert a [code=c] mezot meg kell editalni, hogy pl [code=C] legyen ill assembly eseteben [code=asm]

De amugy ha ilyen hosszu a kod akkor erdemesebb szerintem csatolni.
(#) wg_kezdo hozzászólása Szept 17, 2009 /
 
Órát szeretnék készíteni.
Vettem egy 32.768Khz-s kristályt, de úgy akarom megcsinálni, hogy ne ez adja a proci órajelét, hanem a belső órajelet használnám.
A kristállyal előállított jelet egy megszakítás (mondjuk az int0) kezelné.
A program nem probléma, de nem tudom hogyan kéne bekötni a kristályt.
Kerestem itt is meg a google-t is, de csak az XTAL1-2-re való bekötést találtam meg sajnos.
(#) Lucifer válasza wg_kezdo hozzászólására (») Szept 17, 2009 /
 
Az INT0 nem arra való. Órakvarcról leginkább timert lehet hajtani (procifüggő). Pld az ATMEGA8 esetén a TOSC1 és TOSC2 lábakra lehet órakvarcot tenni. Ez a 8 bites Timer2-t fogja neked hajtani, ha az ASSR regiszter AS2 bitjét 1-re állítod.
(#) wg_kezdo válasza Lucifer hozzászólására (») Szept 17, 2009 /
 
Köszönöm akkor utána nézek ennek a két lábnak.
A bekötést ugyanúgy kell, mint a sima kvarcnál? Vagyis két kondival?
(Amúgy milyen kondi kell a 32.768khz-s kristálynak? 22pF jó hozzá? egy másik rajzon 10pF-est láttam csak az most nincs raktáron)
(#) wg_kezdo válasza Lucifer hozzászólására (») Szept 17, 2009 /
 
Most nézem, hogy a ATMEGA88-20PU procinál ugyanaz a láb hivatott a külső kristályra, mint az órajelre?
Vagyis vagy rakok oda egy 20Mhz-s kristályt vagy egy 32Khz-st a kettő együtt nem megy?
A mostani cuccomhoz mondjuk nem fontos mivel csak hőmérsékletet mérek és azt akarom elraktározni, hogy tudjam hány órakkor mennyi volt a kollektor hőmérséklete, így elég a belső órajel+külső kristály a pontos időhöz.
(#) Lucifer válasza wg_kezdo hozzászólására (») Szept 17, 2009 /
 
Idézet:
„The device can operate its Timer/Counter2 from an external 32.768 kHz watch crystal or a exter-
nal clock source. The Timer/Counter Oscillator Pins (TOSC1 and TOSC2) are shared with
XTAL1 and XTAL2. This means that the Timer/Counter Oscillator can only be used when an
internal RC Oscillator is selected as system clock source

Ergo a kettő együtt nem megy.

A kondi a 10-25pF között mindegy csak egyforma legyen.
Nekem anno 15 pF-el ment ilyen kapcsolás.
(#) wg_kezdo válasza Lucifer hozzászólására (») Szept 17, 2009 /
 
Értem és köszönöm.
Akkor, ha mégis együtt akarnék ilyesmit kell egy külső órajel generátort kapcsolni valamelyik lábra.
(#) tpeter válasza zsuscsinyo hozzászólására (») Szept 17, 2009 /
 
Szia!

Köszi szépen, nekem szerintem amúgy nem a kódolással volt gondom hanem egyszerűen nem sikerült rendesen pergésmentesíteni hogy az megfeleljen a kódomnak... najó akkor mondhatjuk hogy a kódolással volt gond

janyjozsef: köszi neked is, ki fogom próbálni amit sikerül életre keltenem az ISP-met.
(#) patexati hozzászólása Szept 17, 2009 /
 
Sziasztok! Mindjárt megüt a guta ezért inkább kérdeznék! Megépítettem a doplert de az AVR-t fel kéne programoznom de nem tudom milyen progival csináljam Van egy LPT külsó tápos 8MHz es külső rezonátoros égetőm ezt szeretném hozzá használni! Milyen progival megy ez? Avr studio 4 vagy mi van a gépemen de azon csak com portokat lát a beállításban Amúgy ha így simán bedugom az usb csatiba azt írja ki nem lehet felismerni az usb eszközt!
(#) zsuscsinyo válasza trudnai hozzászólására (») Szept 17, 2009 /
 
Viszont ez minden második jelre reagál, és még nincs megoldva a prell mentesítés, és pl. ha épp úgy áll hogy egyet tekersz balra, egyet jobbra, az mindíg csak egy irányba fogja vinni.
(#) zsuscsinyo válasza wg_kezdo hozzászólására (») Szept 17, 2009 /
 
A megoldás, hogy a 32768Hz-es kristályt TOSC1 és TOSC2-re teszed, és a mikrovezérlő belső órajelről fut. Vagy ha 2 kristályt szeretnél használni, akkor megfelelő típust kell választani, amin mindkettőt lehet egymástól függetlenül használni (pl.: Atmega16).
(#) tpeter válasza zsuscsinyo hozzászólására (») Szept 17, 2009 /
 
Amúgy ez a diódás megoldás miért jó?
Eddig úgy csináltam mitha sima nyomógomb lenne: int láb felhúzva ellenállásal és az adott láb és aföld közé kötve az enkóder, párhuzamosan vele meg egy kondi.

előnyök, hátrányok?
hogy csinálnám ha profi lennék?
(#) zsuscsinyo válasza tpeter hozzászólására (») Szept 17, 2009 /
 
Ez a diódás megoldás arra jó, hogy mindkét oldal ('A' és 'B') lefutó élére reagál és csak egy Interruptot használ, valamint egymástól függetlenül működnek.

Idézet:
„előnyök, hátrányok?”


Hátránya:
-Kondenzátorosnak ha nem megfeleő értéket választasz az vagy nem tölt fel időben (lassan reagál a tekerésre), vagy nem végzi el a megfelelő prellmentesítést.

-Az én szoftveres verziómnak is van hátránya, mégpedig az, hogy kényszer várakozást hajt végre (magyarul megvárja míg átfordul a holtponton), ha ezt kivesszük akkor több impulzust ad le.Én arra törekedtem, hogy egy "billenésre" 1-et léptessen.

Idézet:
„hogy csinálnám ha profi lennék?”


Úgy mint a nagyok Még énsem tudom, mivel nem vagyok profi, csak elszánt kísérletező.
(#) patexati hozzászólása Szept 17, 2009 /
 
Létezik,hogy a dopler azért nem megy mert nekem ATMEGA8-16PU AVR van bent? Írásnál nem ezt írja ki a hexre hanem AT90S8515 az nem ugyan az! Vagy láma vagyok? Most akarok avr dolgokkal foglalkozni de kell egy jó dopler és utána nem lenne gondom vele menne laptopról is a műhelyben ezért erőlködök vele! A Poniprog-al úgy néz ki sikerült beírnom a hexet de nem ismeri fel most sem
(#) herzsolt hozzászólása Szept 17, 2009 /
 
Atmega8-at szeretnék felprogizni AVR-Doper, USB-s ISP programozó-val. AVRSTUDIO4 van fent.
Ezt írja ki:
Erasing device.. OK!
Programming FLASH .. OK!
Reading FLASH .. OK!
WARNING: FLASH byte address 0x0A00 is 0xDF (should be 0xC8).. FAILED!
Leaving programming mode.. OK!
Mit ronthattam el?
Minden fül OK-t jelez.

hiba.JPG
    
(#) Topi válasza patexati hozzászólására (») Szept 17, 2009 /
 
PonyProg-ot nem ismerem, de Neked kell beállítani szerintem a processzor típust. Ha más processzorként programozod be, akkor lehet, hogy még a Fuses-okat is kinyírod -> örök hallgatásba merül a proci.
(#) Topi válasza herzsolt hozzászólására (») Szept 17, 2009 /
 
1. Hosszú vezeték
2. Túl magas órajel
3. Instabil táp (zajos, nem pufferelt, stb)
4. Valami van a programozó lábakon.. Külső HW-re gondolok.
(#) herzsolt válasza Topi hozzászólására (») Szept 17, 2009 /
 
Az összekötő vezeték Kb15cm.
A tápot a progrmozórol kapja.
A magas órajelet hogy érted?
(#) patexati válasza Topi hozzászólására (») Szept 17, 2009 /
 
Csak atmega 8 meg atmega 16 van bent olyan mi 8-16 nincs melyik a jó? Sajna az AVR-ben láma vagyok! Az usb akkor is ugyanazt írja ki ha bent vannak a procik mint mikor nincsenek " A számítógéphez csatlakoztatott usb eszköznél hiba lépett fel nem lehet felismerni" Zárlat az nincs mert rámértem megkapja az 5V-ot de mégis kuka! Szerintem a program az oka! Megírja az avrt meg ki is olvasom belőle de nem annak látja minek kéne lenni a programozó! Te melyik progit ajánlanád az alábbi programozóhoz?Bővebben: Link
(#) wg_kezdo válasza zsuscsinyo hozzászólására (») Szept 17, 2009 /
 
Sikerült!

Nem kell kondi egyszerűen csak az TOSC1 és TOSC2 láb közé kell tenni a kristályt.
Bascomban pedig ennyi:

  1. Config Timer2 = Timer , Async = On , Prescale = 128
  2. On Timer2 orajel
  3. Enable Interrupts
  4. Enable Timer2
  5.  
  6.  
  7. orajel:
  8.  rem ide minden másodpercben érkezik a vezérlés.
  9. return


(#) herzsolt válasza herzsolt hozzászólására (») Szept 17, 2009 /
 
Megoldódott, a cél áramkör nem kapot rendesen tápot.
Most már jó.
(#) gtk válasza wg_kezdo hozzászólására (») Szept 17, 2009 /
 
X1,2 -re mehet orakvarc, ez hajtja valamelyik timert, es a proci mehet belso oszcilatorrol. Nixi oraban ugyanezt a megoldast hasznaltam. Kulso kondi nem kell orakvarchoz, van belso.
Következő: »»   149 / 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