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   190 / 840
(#) piciusmarcus válasza Fizikus hozzászólására (») Feb 19, 2010 /
 
Ez tulajdonképpen csak 1 kondival több annál ahogy én összekötöttem. Beraktam és pontosan ugyanígy kötöttem be mindent mint a képen, de a probléma továbbra is fennáll. Ugyanúgy melegszik az avr és piros led világít. Kezdem azt hinni hogy a tápfesz nem elég stabil (megesik összekötésnél kondival is).
Ha a programozóra csak a vcc-t és a gnd-t kötöm be a mefelelő 5V-os fesszel akkor zölden kellene világítania? Nagyban megkönnyítené a dolgot ha így lenne, mert akkor már biztosan tudnám hogy az jó.
Mindenesetre 9V-os elemről 7508-on keresztül is megpróbálom táplálni. Ebben az esetben elég egy 330µF-es kondi a közös negatív és a +9V közé?
(#) (Felhasználó 4577) válasza piciusmarcus hozzászólására (») Feb 19, 2010 /
 
Idézet:
„Ugyanúgy melegszik az avr és piros led világít.”

Fordított polaritás?

Idézet:
„Mindenesetre 9V-os elemről 7508-on keresztül is megpróbálom táplálni.”

Nem biztos hogy jó gondolat egy 5V-os AVR-nek 8V-ot adni, a 8V-os stabilizátornak meg 9-et, amikor 4V effektív feszültségnek kell lennie a megfelelő működéshez.
Inkább kösd össze légszerelve.

Idézet:
„Ha a programozóra csak a vcc-t és a gnd-t kötöm be a mefelelő 5V-os fesszel akkor zölden kellene világítania?”


Idézet:
„Ha a programozóra csak a vcc-t és a gnd-t kötöm be a mefelelő 5V-os fesszel akkor zölden kellene világítania?”

Ezt már egyszer leírtam.

Olvass adatlapot, mielőtt hozzákezdenél. Az égetőhöz kapott User guide-t se ártana elolvasni.
(#) Sir-Nyeteg válasza Ricsi89 hozzászólására (») Feb 19, 2010 /
 
Esetleg ez?
Hétvégén fogom kipróbálni.
(#) Ricsi89 válasza Sir-Nyeteg hozzászólására (») Feb 19, 2010 /
 
Életjelet ad ezzel, de csak krix-kraxokat ír a kijelzőre. Szerintem a bekötéssel lesz valami, de már ez is jobb, mint a semmi. Ezzel folytatom a kísérleteket.
(#) Sir-Nyeteg válasza Ricsi89 hozzászólására (») Feb 19, 2010 /
 
Nálam a gtk féle is ment régen!
(#) gtk válasza Ricsi89 hozzászólására (») Feb 19, 2010 /
 
Azt hiszem, hogy az adatvonalakra az a kikotes hogy sorban, azonos porton kell lenniuk.
(#) Ricsi89 válasza Sir-Nyeteg hozzászólására (») Feb 19, 2010 /
 
Nekem az még az inicializálást sem csinálja meg. Már fordításnál hibát dob. Ez meg összevisszaságokat csinál. De legalább életjelet ad. Lefordítottam egy az egyben a programot, amit a linken mutattál, ott is ugyanilyen összevisszaságok vannak. Olyan, mintha a kijelzőnek teljesen már parancskészlete lenne. Pedig régen egy pic-es órával együttműködött és ment rendesen.
(#) (Felhasználó 4577) hozzászólása Feb 19, 2010 /
 
Sziasztok!

Léptetőmotor vezérlésen dolgozok. Egy ATtiny13-al szeretném megoldani, a kapcsolási rajzot és a C forráskódot csatoltam.
Egyenlőre egészlépéses módban szeretném vezérelni, később pedig féllépéses módban, de azt szeretném, ha most az egészlépéses működne rendesen.
A vezérlést jelenleg működik, de egy idő után a motor és az ULN2003 nagyon elkezd melegedni, annak függvényében, hogy milyen sebességet (késleltetést) állítok be.
Ha jól gondolom az a probléma, hogy túl sok ideig adok a motorra 24V-ot.
Mennyi időre lehet ráadni a 24V-ot?

Valahogy így képzeltem el:
  1. PORTB = (1<<PB0);
  2.         _delay_ms(DELAY_STEP);
  3.         PORTB = 0;
  4.         _delay_ms(DELAY);
  5.         PORTB = (1<<PB1);
  6.         _delay_ms(DELAY_STEP);
  7.         PORTB = 0;
  8.         _delay_ms(DELAY);
  9.         PORTB = (1<<PB3);
  10.         _delay_ms(DELAY_STEP);
  11.         PORTB = 0;
  12.         _delay_ms(DELAY);
  13.         PORTB = (1<<PB2);
  14.         _delay_ms(DELAY_STEP);
  15.         PORTB = 0;
  16.         _delay_ms(DELAY);

Ez így jó megoldás?
Hogyan lenne a legkorrektebb a vezérlés?
Nem lenne jobb inkább egy belső Timer-el megcsinálni az időzítést?
(#) toto válasza gtk hozzászólására (») Feb 20, 2010 /
 
A simple-driver először nekem is összevisszaságot csinált a kijelzőn(kicsit átvariáltam a kontrollernek az LCD-hez használt portlábait), aztán ahogy jobban belenéztem, az előírás a következő: egy porton belül kell lennie a lábaknak, de ez még nem elég.
Az adatvezetékeknek a Portx0...3 lábakon kell lennie sorban a DB4...7-nek megfelelően.
Nálam már elkészült a panel, mire erre a megkötésre rájöttem, és mivel újat nem akartam csak ezért gyártani, ezért kicsit módosítottam az LCD drivert.
A módosítás után is egy porton kell lenni a lábaknak, de azon belül szabadon variálhatók.
Remélem, segítettem.
Warningot nekem is dobál a lcd_putstr() miatt, de nem törődöm vele, mert rendesen működik.

Hopp, most látom, ezt gr89-nek akartam címezni.
(#) Ricsi89 válasza toto hozzászólására (») Feb 20, 2010 /
 
Tökéletes! Örök hálám. Végre elkezdhetem a többi dolgot.
(#) trudnai válasza toto hozzászólására (») Feb 20, 2010 /
 
Idézet:
„Nálam már elkészült a panel, mire erre a megkötésre rájöttem, és mivel újat nem akartam csak ezért gyártani, ezért kicsit módosítottam az LCD drivert.”


Bar most szerencsed volt, hogy igy szoftver modositassal megusztad, megis nem gyozom hangsulyozni, hogy mielott a prototipus nem mukodik, teljesen felesleges panelt tervezni es marni... De mindenki a sajat boren tanul
(#) toto válasza trudnai hozzászólására (») Feb 20, 2010 /
 
Az áramkör csupa SMD-ből állt, így nehéz lett volna próbapanelen összedobni. Ráadásul 4 IC-nél már olyan kókány lett volna a próbapanel, hogy az is csak hibalehetőségeket szül.
(#) toto válasza Ricsi89 hozzászólására (») Feb 20, 2010 /
 
A kisdobos ahol tud, segít.
Az érdem nagyobbik része gtk-t illeti, én csupán apró módosítást hajtottam végre a forrásban.
(#) vzoole válasza toto hozzászólására (») Feb 20, 2010 /
 
Ugyanezt a drivert én úgy használtam, hogy az 'E' láb másik porton volt.
(#) toto válasza vzoole hozzászólására (») Feb 20, 2010 /
 
Másik porton, mint a többi láb? A driver változtatása nélkül? Érdekes.
(#) niches hozzászólása Feb 20, 2010 /
 
Sziasztok!

Olyan kérdésem lenne, hogy hogyan kell egy 8 bites, sorosan fogadott adat irányultságát megfordítani? Egy jeladó küld ilyen jelet, de így, hogy elől van a LSB, nem tudom feldolgozni. Tartományokra kellene az értéket vizsgálnom 0-1023 között, de próbáltam mind decimálisan, mind binárisan beírni az if feltételeit, sehogy sem működött rendesen. Ha viszont a 8 bites fogadott értéket kiküldöm közvetlenül egy portra, a rákötött ledsoron látható, hogy simán binárisan számol felfelé.

Előre is kösz a válaszokat!

niches
(#) ATtiny válasza niches hozzászólására (») Feb 20, 2010 /
 
Enek működnie kell, bár nem nagyon teszteltem, csak megírtam.

  1. uint8_t fordit(uint8_t be)
  2. {
  3.  uint8_t i;
  4.  uint8_t ki = 0x00;
  5.  
  6.  for(i=0;i<8;i++)
  7.  {
  8.   if(be&(1<<i)) ki|= (0x80>>i);
  9.  }
  10.  return ki;
  11. }


Így kell használni:

  1. uint8_t proba = 26;
  2.   uint8_t kimenet;
  3.  
  4.   kimenet = fordit(proba);  //kimenet változóba 88 lesz
  5.  
  6.   //vagy ez is jó:
  7.  
  8.   proba = fordit(proba);  //próba változóba 88 lesz
(#) Ricsi89 hozzászólása Feb 20, 2010 /
 
Egy apró kérdésem lenne. Próbáltam életre kelteni az atmega8 int1-es interruptját, de nem jött össze teljesen. Az int0 és int1-re is újraindult a program, pedig csak az 1-est kapcsoltam be. Valaki leírná, hogy hogyan tudom bekapcsolni az 1-es interruptot?
(#) vzoole válasza Ricsi89 hozzászólására (») Feb 20, 2010 /
 
  1. MCUCR = 0b00001010;
  2. //3-2 INT1, 1-0 INT0:
  3. //00 - alacsony szint generál megszakítást
  4. //01 - bármilyen logikai váltás megszakítást generál
  5. //10 - csökkenő él generál megszakítást
  6. //11 - novekvő él generál megszakítást
  7.  
  8. // INT0, INT1 bekapcsolása.
  9. GIMSK  |= (1<<INT0) | (1<<INT1);
  10.  
  11. //megszakítás bekapcsolás  
  12. sei();
(#) trudnai válasza toto hozzászólására (») Feb 20, 2010 /
 
Nyilvan nem kell elmagyaraznom neked, hogy SMD alkatreszekbol is lehet prototipust csinalni, arrol mar nem is beszelve, hogy rendes labas alkatreszekbol is meg lehet epiteni a proba aramkort, es amikor az mar kesz akkor lehet az SMD-s nyak tervet megcsinani az alapjan...
(#) niches válasza ATtiny hozzászólására (») Feb 20, 2010 /
 
Köszi, bár nem működik tökéletesen. El tudnád magyarázni nekem a működését? A rész, amit nem értek az ez:
  1. if(be&(1<<i)) ki|= (0x80>>i);

egyik része, hogy az 1 < < i nem azt jelenti, hogy az i-be egyet állítok be? Ebbena felállásban azt jelenti, hogy a be változó i-edik bije? Illetve a következő zárójelben a fordított relációjelek shiftelést jelentenek?

Kösz
(#) Ricsi89 válasza vzoole hozzászólására (») Feb 20, 2010 /
 
Köszi, sikerült így már bekapcsolni csak ezt az egyet, de nem megy. Már egy másik gombom sem megy. Ez egy menü lenne, ahol van egy fel, egy le gomb, meg egy oké és egy vissza gomb. A vissza gombot szeretném megcsinálni megszakítással, hogy bármikor megnyomom, akkor visszamenjen a menübe és abbahagyja a feladatot. Úgy gondoltam, hogy a megszakítással egy változó értékét változtatnám meg, így kilépve a while ciklusból és visszatérve a menübe, de nem megy. Eddig bele tudtam lépni a feladatba az oké gombbal, de mióta beraktam a megszakítást, már az sem megy. A menüben lépkedni tudok, de mást nem. :no:
(#) ATtiny válasza niches hozzászólására (») Feb 20, 2010 / 1
 
Az 1 << i azt jelenti, hogy 1-et ami binárisan 00000001 elshiftelünk balra. Az, hogy mennyi bittel kell balra shiftelni az i változótól függ.

konkrétan:
1 << 0 az binárian 00000001 = 1
1 << 1 az binárian 00000010 = 2
1 << 2 az binárian 00000100 = 4
1 << 3 az binárian 00001000 = 8
1 << 4 az binárian 00010000 = 16
1 << 5 az binárian 00100000 = 32
1 << 6 az binárian 01000000 = 64
1 << 7 az binárian 10000000 = 128

a másik shiftelés a (0x80>>i) az jobra shifteli a decimális 128-at (binárisan 10000000)

konkrétan:
128 >> 0 az binárian 10000000 = 128
128 >> 1 az binárian 01000000 = 64
128 >> 2 az binárian 00100000 = 32
128 >> 3 az binárian 00010000 = 16
128 >> 4 az binárian 00001000 = 8
128 >> 5 az binárian 00000100 = 4
128 >> 6 az binárian 00000010 = 2
128 >> 7 az binárian 00000001 = 1

Gyakorlatilag végigmegyünk a be változó összes bitjén és ha valamelyik bit 1-es, akkor kimeneti változónál bekapcsoljuk az ellenkező irányból megfelelő bitet.
(#) Ricsi89 válasza Ricsi89 hozzászólására (») Feb 20, 2010 /
 
Működik az interrupt. Most megcsináltam, hogy egy ledet kapcsoltatok be, ha interrupt jön és hát a led akkor kapcsolt be, amikor kedve tartotta. Na gyorsan bekapcsoltam a belső felhúzó ellenállást és egyből működött is. Én marha. Mindig tanul valamit az ember.
(#) toto válasza trudnai hozzászólására (») Feb 20, 2010 /
 
SMD-ből mégis hogyan lehet prototípust csinálni?
Mert én összeforrasztok egy prototípust, és ha jól működik, átkeresztelem kész terméknek.
Egyébként én sokszor valami nagyfrekvenciás pillenpattyot szoktam eszkábálni (még ha kontroller is van benne) , ahol nem igazán szerencsés egy agyonhuzalozott próbapanelről végkövetkeztetést levonni. SMD-ből van itthon minden szükséges alkatrész, ha meg mindenből lábas jószágot is tartanék, a sörnek már nem jutna hely az asztalon.
(#) tukko hozzászólása Feb 21, 2010 /
 
Csinálta egy nyákot az STK200 programozómhoz 8 pines foglalattal, most olvastam hogy külső 5 volt is kell neki!
Így csináltam az összekötést:
Bekötés
Kép a nyákról
Jól csináltam, jól kötöttem be a külső 5V-ot? Úgy értem, hogy a programozónak és az avr-nek is kell a külső 5v vagy csak az avr-nek?
A led pinhez mit kell kötni?
(#) (Felhasználó 4577) válasza tukko hozzászólására (») Feb 21, 2010 /
 
Ha csak az AVR-nek kellene vagy csak a programozónak akkor hogy tudsz csak neki adni diódák nélkül?
Egyértelműen igen, mind a kettőnek kell és jól kötötted be.

Tényleg kellene már erről egy cikk, mert minden harmadik oldalon felmerül egy ilyen jellegű kérdés.
(#) niches válasza ATtiny hozzászólására (») Feb 21, 2010 /
 
Köszönöm a részletes választ! A programomban található további finomítgatásokkal úgy néz ki, mostmár megy minden
Elmondom azért, miért írtam, hogy értem az elvet, de nem tökéletes a működése az irányultság fordítónak.

Tehát fogadok egy jelet sorosan az USART1-en. A dekóder, ami a jelet küldi, egy rövid órajelsorozatot vár, majd kb 20 us szünetet. Ezt úgy tudtam megvalósítani, hogy engedélyezem az RX-et és Tx-et, várok az adat beérkezésére, majd feldolgozom a kapott eredményt, végül letiltom az usartot, beiktatok kis delayt, és kezdődik minden előlről. Így nem működött jól, így ma friss fejjel átraktam az usart kikapcsolását közvetlen azután, hogy kiolvastam a regiszterből a kapott adatot, és ezután kezdtem csak el a feldolgozását. És láss csodát, már működik is
Amíg nem így csináltam, addig eleinte jól működött a fordítás, de 4-5 lépés után össze-vissza számolt. Ami még érdekesebb, hogy csináltam egy olyat, hogy egyik portra kivezettem a kész kiolvasott eredményt, ami ugye jó, csak fordított irányultságú, a másik portra pedig a megfordított eredményt. ÉS érdekes módon mindkét porton ugyanúgy hülyeség jelent meg csak ellentétes irányultsággal. Pedig az elsőhöz nem nyúltam tehát elméletben nem kellett volna megzavarnia az utána jövő lépéseknek...érdekes, hogyan hatott visszafelé a fordit() fgv. meghívása
(#) trudnai válasza toto hozzászólására (») Feb 21, 2010 /
 
Idézet:
„SMD-ből mégis hogyan lehet prototípust csinálni?”


64 LQFP

SMD prototipus panelek

Amugy hallottam olyanrol is aki siman pottyosre raforrasztja a 0603-as alkatreszeket, a SOIC-okhoz meg egyszeruen kette valasztgatja a forr szemeket es epp jol jon ugy ki a meret.

Idézet:
„Egyébként én sokszor valami nagyfrekvenciás pillenpattyot szoktam eszkábálni (még ha kontroller is van benne) , ahol nem igazán szerencsés egy agyonhuzalozott próbapanelről végkövetkeztetést levonn”


Hat igen, sokszor azokhoz valoban nem szerencses madzagozni, de ott mar ugysi speci kovetelmenyek vannak tehat nyilvan ha olyat tervezel akkor mar megvan hozza a kello tapasztalatod, tehat sokszor elsore megy a paneled. De ugye azt nem kell megemlitenem, hogy SMD elotti korszakban is epitettek nagyfrekis cuccokat?

(Gyarban ugye az ilyeneket le kell gyartatni nehany darabban, es teszteles es mericskeles alapjan ujra es ujra tevezni, ujra es ujra legyartani a proba panelt mig mukodokepes nem lesz. Az ilyen nehany darabos paneleket nevezik ilyenkor prototipusnak)
(#) toto válasza trudnai hozzászólására (») Feb 21, 2010 /
 
Úgy érzem, nem állunk mi olyan messze a véleményünkkel egymástól.
Idézet:
„nyilvan ha olyat tervezel akkor mar megvan hozza a kello tapasztalatod”

Igen, kb. két évtizede foglalkozom elektronikával, még ha ez a hozzászólásaimból nem is világlik ki minden esetben. Bár az is igaz, hogy ez idő alatt megmaradtam hobbi szinten, és AVR-rel kb. fél éve foglalkozom komolyabban.
Idézet:
„Gyarban ugye az ilyeneket le kell gyartatni nehany darabban, es teszteles es mericskeles alapjan ujra es ujra tevezni, ujra es ujra legyartani a proba panelt mig mukodokepes nem lesz.”

Igen, ilyesmire céloztam kissé elnagyoltan:"Mert én összeforrasztok egy prototípust, és ha jól működik, átkeresztelem kész terméknek."

Mielőtt végképp szétoffolom a témát, kicsit összegezném:
az, hogy milyen fejlesztési módszert választ az ember egy készülék készítésekor(drótozgatós próbapaneles próbálgatás után végső formába öntés vagy prototípus gyártása, mérése változtatás, újabb prototípus, stb.) az függhet az áramkör jellegétől (pl. nagyfrekis), kialakításától (pl. SMD), előzetesen készen álló segédezközöktől (pl SMD-s próbapanelek), a fejlesztő gyakorlatától, bla-bla-bla.
Mindez együtt megadja, hogy melyik módszerrel várható a legkevesebb idő és energiabefektetés no meg pénz árán eredmény. Így nincs EGY tökéletes megoldás, mindig az adott feladathoz, és az emberke saját habitusához választhat módszert.
Következő: »»   190 / 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