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   506 / 839
(#) bbb hozzászólása Jan 11, 2013 /
 
Sziasztok!

Megépítettem ezt az áramkört, de akadt vele egy kis problémám. Előre bocsátom, hogy nem teljesen az eredetit építettem meg, hanem SMD alkatrészekből építkeztem. A panelomat többször is átnéztem, átmértem, az jónak tűnik, így a hiba okaként már csak a beégetett firmware-re gyanakodhatok.

Az oldal írja, hogy FUSE biteket állítgassak, de sajnos azt már nem, hogy miként. Mivel nekem eddig nemigen volt tapasztalatom Atmel procikkal, így programozóm se nagyon van hozzá, emiatt a pickit2-met programoztam át, hogy avrisp mkII legyen belőle. Látszólag szuperül programozza is a kapcsolás attiny45 prociját, a kiolvasás is remekül működik, így azt gondolom, hogy ez a rész se lehet a gond, egyre inkább a beégetett dolog felé tendálok...

Én Win7 alól használom a programozómat, így ehhez keresgéltem programokat. Az avrdude nagyszerűnek tűnik, hozzá több GUI-t is kipróbáltam, ahol tudom állítgatni a FUSE biteket, csak kérdés, hogy mire állítsam? Illetve még a projekt letöltései között van makefile az attiny45-höz, esetleg azt valaki le tudná nekem forgatni, hogy hexfile legyen belőlük? (Két féle USB implementáció van benne, hátha az egyik megy, míg a másik nem.)
(#) Istvanpisti válasza bbb hozzászólására (») Jan 11, 2013 /
 
Idézet:
„a hiba okaként már csak a beégetett firmware-re gyanakodhatok”

Na, de mi a hiba ?

Esetleg az általad megépített kapcsolást és a kódot felrakhatnád, mert így elég nehéz megpróbálni segíteni.
(#) csabeszq válasza bbb hozzászólására (») Jan 11, 2013 /
 
Hát, ha nem írod át a fuse biteket, akkor alapból a 8-as osztás van érvényben (CKDIV) és a belső RC oszcillátor. Tehát 1 MHz-en futsz.

A kapcsolás alapján V-USB-d van, idézet az oldalukról:
Idézet:
„Can be clocked with 12 MHz, 15 MHz, 16 MHz or 20 MHz crystal or from a 12.8 MHz or 16.5 MHz internal RC oscillator.”


Magyarul: a 12 MHz működéshez a CKDIV-et ki kell kapcsolni és a fuse biteknél beállítani, hogy külső kristályról menjen 8-16MHz tartományban.
(#) roland1 hozzászólása Jan 11, 2013 /
 
Sziasztok
Tudnánok segíteni hogyan lehet normálisan könyvtárakat telepíteni?
Egy ideje már bajlódok ezekkel a könyvtárakkal.
https://github.com/dreamiurg/avr-liberty
(#) michael67 válasza roland1 hozzászólására (») Jan 11, 2013 /
 
Szia. Windows alatt sehogy, csak másolni tudod.
(#) bbb válasza Istvanpisti hozzászólására (») Jan 11, 2013 /
 
Szia!

Igazad van, kihagytam, hogy mi a hiba. Amikor a már felprogramozott áramkört rádugom a gép USB-jére, akkor a windows közli, hogy "az eszköz hibát észlelt, ezért a windows leállította" és emellé megkapja az ismeretlen eszköz jelzőt is.

Az általam megépített kapcsolás és kód majdnem teljesen megegyezik az előbb linkelt oldalon találhatóval, mindössze annyiban tér el, hogy az alkatrészeknél én SMD kivitelt használtam és az USB-B csatlakozó helyett is miniUSB csatlakozót.
(#) bbb válasza csabeszq hozzászólására (») Jan 11, 2013 /
 
Szia!

Megpróbálom.
(#) pajti2 hozzászólása Jan 11, 2013 /
 
Hali!

Általános jellegű kérdés.

Létezik olyan avr-család, amibe perifériaként bele van építve valamilyen teljesítményű cpld? Felső kategóriás cuccban példa Zinq-7000, ami egyben egy arm proci és egy fpga (bivaly teljesítmény még bivalyabb áron). Van annak valami kicsi tesókája?

Végső soron lesz 2 külön tok, de hibamentesre kitesztelésben segítség lenne, ha nem kettő külön tokot kellene égetni, hanem csak egyet.

Köszi minden tippet - arra vonatkozó megjegyzést is, hogy adjam fel, ha valaki teljesen képben van a piac fejlesztéseiről, és erről biztosan tudja, hogy nem létezik ilyen.
(#) sikolymester válasza pajti2 hozzászólására (») Jan 11, 2013 /
 
Ilyen AVR biztos nincsen.
(#) kiborg hozzászólása Jan 11, 2013 /
 
Hali!
Szeretnék egy ATMega16-on szoftveres pwm-et létrehozni. Timer2-t használom(8 bites).
Helyes-e a következő mód: Amikor Timer2 túlcsordul, akkor bekapcsolom a pwm kimenetet, majd amikor eléri a komparálási szintet, akkor kikapcsolom. A megszakításban csak 1-2 utasítás van, tehát nem túl hosszú. Mégis halványan világít a portra kötött led. Akkor is, ha a komparálási szint 1-re van beállítva ( azt értem, hogy valsz. nem lehet 0ig lemenni, mert akkor túlcsordulás és komparálás egyszerre következne be) De 1-nél még nem szabadna világítani kb 5-10% fényerővel a lednek, hiszen akkor 1-255 az arány. Vagy én nézek be megint valamit?
Üdv Kiborg
(#) zombee válasza kiborg hozzászólására (») Jan 11, 2013 /
 
Nem!

1: beállítod a timer interruptot, hogy legyen elég gyakori
2: kell egy uint8_t cnt változód. Ezt minden interrupt VÉGÉN 1-el növeled.
3: EZEN FELÜL kell 1-1 komparátor változó minden kimenő portra, lehetőleg azonos típus(uint8_t)
Ezek a komparátor változók(tömbben érdemes kezelni) mind volatile kell hogy legyen!
4: Így már látod, hogy milyen sűrűn kell interruptolni. Minimum 30Hz(de inkább 100) ami alatt
körbeér a 'cnt". Tehát az interrupt gyakorisága minimum 30*256 Hz.
Ha nem CTC módba vagy, akkor a Timer frekije(tehát a TCNT2-é) ennek 256-szorosa(~2MHz).
5: interrupt!
- portonként 1-1 uint8_t változót létrehozol(tehát A,B,C,D).
- ezeket bitenként beállítgatod, pl. így: - akár ciklusba is lehet
  1. if(komparator[3]=cnt) A|=3;

- aztán az interrupt LEGVÉGÉN - és igen, itt növeled a cnt-t:
  1. PORTA = A;
  2. PORTB = B;
  3. cnt++;


Előnyök:
- egy komparátor lehet nulla is, így teljesen sötét
- lényegében egyszerre kapcsolsz mindent mivel a portokat ténylegesen csak a legvégén állítod át
- annyi kimenetet használsz amennyit nem szégyellsz(na meg amennyi az AVR-nek van)

Hátrányok:
- elég nagy frekinél zabálja a procit, mivel a szoftveres komparátorok ellenőrzése időigényes
- tehát a delay_ms és hasonló SZOFTVERES késleltetéseket jobb ha elfelejted
- LED-ek esetében a látszólagos fényerő kb. logaritmusa a komarálási értékeknek, azaz az
1,2,4,8,16,32,64,128,255 értékek közötti váltás kb. azonos fényerőszintváltásnak felelnek meg.
- teljes kivezérlés(tehát valami "folyamatosan" világít) olyan nincs, de az előzőben leírtak miatt
(és persze elég nagy frekinél) nem fogod észrevenni ha az idő 1/256 - od részében nem világít a LED.

Csak hogy saját példát mondjak, a Knight Rider vezérlőm ATMega48-al fut,
18 kimenettel és köszöni, nagyon jól megvan. ITT és ITT megtekinthető.
Azért a fent leírtak csak a csontváza a dolognak, számos szoftver trükk kellett még hozzá.
A hozzászólás módosítva: Jan 12, 2013
(#) zombee válasza zombee hozzászólására (») Jan 12, 2013 /
 
Az egyik videó linkjét rosszul másoltam be. ITT megtekinthető.
(#) Fizikus válasza kiborg hozzászólására (») Jan 12, 2013 /
 
Az alabbi kod egy ATMega8-on, szervok vezerlesere letrehozott szoftveres PWM jel, amit a 16 bites timer-rel allitok elo. A 16 bites timer 0-tol 65535-ig tud szamolni, de beallithato olyan szamlamasi mod is, ahol meg lehet adni ennel kisebb maximalis erteket is (ez a TOP ertek).
A peldaban egy 8MHz-es AVR-nel 8-as Timer eloosztast hasznalva, masodpercenkent pont 1000000-szor fog a timer lepni, ez pont 1us. Ha a timert ugy allitottam be, hogy 2500-ig szamoljon, akkor pont 2.5ms-kent csordul tul. (Az ICR1 regiszter erteke adja meg, hogy meddig szamoljon a timer es ezutan kezdi elolrol). Beallithato az is hogy a timer mikor adjon megszakitast. A peldaban 2 Timer megzakitast hasznalok. Az elso amikor a timer eleri a 2500-as erteket es tulcsordul (Timer overflow), a masik amikor a timer eszamol egy megadott ertekig (Output Compare megszakitas- ezt hasznalom a szervojel hosszanak beallitasahoz).

  1. // Timer1-el idozitett szoftveres szervovezerlo
  2. // ATMega8, belso 8MHz-es oszcillatorrol jaratva
  3.  
  4. #define F_CPU 8000000UL
  5.  
  6. #include <avr/io.h>
  7. #include <util/delay.h>
  8. #include <avr/interrupt.h>
  9. #include <stdint.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12.  
  13. unsigned volatile char s;
  14. // a 8db szervo kezdeti poziciojat tartalmazo tomb
  15. unsigned volatile int servo[8]={1500,1500,1500,1500,1500,1500,1500,1500};    
  16.  
  17. int main(void)
  18. {
  19.    DDRD = 0xFF; //Port D kimenet
  20.  
  21.    //Timer 1 beallitasai: FAST PWM mod, ICR1 top, 8-as eloosztas
  22.     TCCR1A |= (1<<WGM11);
  23.     TCCR1B |= (1<<WGM13) | (1<<WGM12) | (1<<CS11) ;
  24.     TIMSK |= (1<<OCIE1A) | (1<<TOIE1);   //Output Compare es Timer tulcsordulas megszakitas bekapcsolasa
  25.     ICR1 = 2500;       //2.5ms Periodusido
  26.  
  27.    sei();   //Altalanos megszakitasok engedelyezese
  28.  
  29.    while(1)
  30. {
  31. servo[0] = 2000; // a 0-as sorszamu szervo poziciojanak beallitasa
  32. servo[1] = 1000; // az 1-es sorszamu szervo poziciojanak beallitasa
  33. servo[2] = 2000; //
  34. servo[3] = 1000; //
  35. servo[4] = 2000; //
  36. servo[5] = 1000; //
  37. servo[6] = 2000; //
  38. servo[7] = 1000; // a 7-es sorszamu szervo poziciojanak beallitasa
  39. _delay_ms(2000); // varakozas 2 masodpercig
  40.  
  41. servo[0] = 1500; //
  42. servo[1] = 1500; //
  43. servo[2] = 1500; //
  44. servo[3] = 1500; //
  45. servo[4] = 1500; //
  46. servo[5] = 1500; //
  47. servo[6] = 1500; //
  48. servo[7] = 1500; //
  49. _delay_ms(2000);
  50.  
  51. servo[0] = 1000; //
  52. servo[1] = 2000; //
  53. servo[2] = 1000; //
  54. servo[3] = 2000; //
  55. servo[4] = 1000; //
  56. servo[5] = 2000; //
  57. servo[6] = 1000; //
  58. servo[7] = 2000; //
  59. _delay_ms(2000);
  60.  
  61. servo[0] = 1500; //
  62. servo[1] = 1500; //
  63. servo[2] = 1500; //
  64. servo[3] = 1500; //
  65. servo[4] = 1500; //
  66. servo[5] = 1500; //
  67. servo[6] = 1500; //
  68. servo[7] = 1500; //
  69. _delay_ms(2000);
  70. }
  71. }
  72.  
  73. //Megszakitas kiszolgalo rutinok
  74. ISR(TIMER1_COMPA_vect) // Output Compare
  75. {
  76.    PORTD &= ~(1<<s);      //Adott szervohoz tarozo I/O lab kikapcsolasa (GND)
  77.    s++;                   //Szervocsatorna novelese
  78.    if (s > 7) s = 0;
  79.    OCR1A = servo[s];      //A kovetkezo szervocsatorna imulzusszelesseg beallitasa
  80. }
  81.  
  82. ISR(TIMER1_OVF_vect)  // Timer tulcsordulas
  83. {
  84.    PORTD |= (1<<s);      //Adott szervohoz tarozo I/O lab bekapcsolasa (5V)
  85. }

(#) bbb válasza bbb hozzászólására (») Jan 12, 2013 /
 
Sziasztok!

Olyan jól sikerült ez a "megpróbálás", hogy most már nem sikerül egyáltalán programoznom az Attiny45-öm. Az utolsó sikeres próbánál beállítottam, hogy külső oszci legyen és a belső osztás kikapcs, azóta nem sikerül elérnem őkelmét. Elképzelhető, hogy a programozóm ment gallyra, bár kimértem a csatlakozásait és a kritikus pontokat és nem találtam meg mi lehet.

Nincs valami trükk, amivel rá lehet próbálni, hogy működik-e a programozó?

Mellékeltem az általam összerakott változat rajzait.

Még annyit, hogy megpróbáltam az oldalon olvasható hibák közül a diódakiszedős dolgot, de az se segített.
A hozzászólás módosítva: Jan 12, 2013
(#) zombee válasza bbb hozzászólására (») Jan 12, 2013 /
 
a kristály és a 22p kondik be vannak ültetve?
(#) benjami hozzászólása Jan 12, 2013 /
 
Tisztelt Kollégák.
Eddig inkább a PIC vonalon, tevékenykedtem, de úgy éreztem kell egy kis kitekintés az AVR irányába is. Ehhez első lépésben beszereztem egy arduino-duemilanove modult. Ezen van egy ATMEGA328P vezérlő meg egy FT232 -es USB-soros átalakító.
A kérdésem a következő lenne: ez a cucc az arduino programmal megy is rendesen, de én inkább az AVR studio4-es, vagy az Atmel studio 6-ost használnám. Megoldható-e az általuk generált HEX vagy ELF file (az egyik is elég) átvitele a chipbe stk500 vagy más programozó nélkül az arduino saját bootloader-ét felhasználva?
(#) csabeszq válasza benjami hozzászólására (») Jan 12, 2013 / 1
 
az avrdude kezeli, gui-t meg találni hozzá.

én azt használom.
(#) bbb válasza zombee hozzászólására (») Jan 12, 2013 /
 
Igen, be vannak ültetve.
(#) kiborg válasza zombee hozzászólására (») Jan 12, 2013 /
 
Hali!
zombee:
Nagyjából értem a gondolatmenetedet (úgy gondolom). Az nem világos, hogy mikor kapcsolod be a kimenetet? Az if-sor csak a kikapcsolásért felel ugye? ( ASM-ben tolom, az A|=3 nem tudom mit is jelent.Ha jól gondolom akkor ha a 3as komparátor egyenlő a cnt-vel, akkor lehet majd az interrupt végén kikapcsolni a 3. kimenetet). De mikor is kapcsolod be, hogy ki tudd kapcsolni ???
Egy egyenáramú DC motort szeretnék vezérelni. Én úgy gondoltam, hogy 20kHz feletti frekvencián adnám neki a PWM jelet, hogy ne sípoljon. Elég lenne neki kisebb is? Az AVR órajele 14,7456MHz, mert közben 38400kbps-el kommunikálok sorosan egy BT modullal.

Fizikus: gyakorlatilag ugyanaz, mint amit én mondtam, csak több csatornára, feltéve, hogy jól értem a kódodat. De itt az én kódom:

  1. T2_inic:
  2.         ldi temp,0
  3.         setbit temp,CS21
  4.         setbit temp,CS22
  5.         out TCCR2,temp  ; Clock select prescaler:8
  6.         ldi temp,0
  7.         out TCNT2,temp
  8.         ldi temp,0
  9.         out OCR0,temp   ;Output Compare Regiszter
  10.         in temp,TIMSK
  11.         ori temp,(1<<OCIE2)+(1<<TOIE2)  ; T0 Compare + Overflow Enable
  12.         out TIMSK,temp
  13.  
  14. TIM2_COMP:
  15. cbi portd,servo ; kikapcsol szervo vezérlőjelét
  16. out OCR2,spwm
  17. reti
  18.  
  19.  
  20. TIM2_OVF:
  21.         sbi portd,servo ; bekapcsol szervo vezérlőjelét
  22.         reti


Ez a mód tuti, hogy működik, mert a Timer0-al én is egy RC szervót vezérlek, tök jól és szépen.Csak ugye ott nem kell 0-ig lemenni, míg egy motornál sajnos igen, ha nem akarok felesleges energiaveszteséget.
Üdv Kiborg

(#) zombee válasza kiborg hozzászólására (») Jan 12, 2013 1 /
 
DC motorral(meg úgy egyébként is bármilyen motorral) csak vigyázz!
Ugye tudod hogy ezekbe tekercs van? Nem is kicsi, hanem jó nagy!
És azt is ugye hogy mi az az önindukciós tényező, és mekkora van egy ilyen motor tekercsnek?
Nézz át a frekiváltós témába: ~1kHz-es modulációs frekit használnak, ez fölött nem érdemes.

Az if-sor azért felel, hogy végignézi a komparátorokat. Persze lehet ettől még egy komparátorod is.
Az "A |= 3" helyett "A |= 1<<3" akart lenni. Ez megegyezik ezzel: "ORI r16,1<<3".
Ez még nem a portot kapcsolja hanem az átmeneti tárolót. Ezekből 1-1 mov-al megy ki a portra.
Tehát az if-es sor után írom át a portra. Ekkor kapcsolja ki és be is amit kell.>>>>
(#) Massawa válasza kiborg hozzászólására (») Jan 12, 2013 /
 
Hát nem tudom milyen az az egyenáramú motor, de a 20 kHz, még a fülnek is sok, nem egy motoronak....
Ha hagyományos motorról van szó, akkor 1kHz alatt fog jol menni (söt egyes motorok 200 Hz alatt).
Ha ugynevezett coreless (vasmentes forgorész) motorod van, annak adhatsz max 3 kHz-et. (a nagyobb frekik csak amitásnak jók).
(#) benjami válasza csabeszq hozzászólására (») Jan 12, 2013 /
 
Köszi, működik. Valószínűleg régi verziós volt a GUI, mert a baud sebességet nem lehetett benne állítani. Viszont az általa létrehozott bat file-ba a bitsebesség beállítást beszúrva (-b 57600) és azt a GUI nélkül elindítva működik.
(#) csabeszq válasza bbb hozzászólására (») Jan 12, 2013 /
 
A programozót élég nehéz agyonvágni, 5V-tal nem is fog menni, de ha +12V-ot rákötsz már több eséllyel indulsz. A rövidzár nem árt az AVR chipeknek, áramgenerátorrá alakulnak. A youtube-on látod, hogy a sok majom a LED-eket ellenállás nélkül teszi az AVR lábára, mert 40mA-nél több úgysem jön ki.

A biztosítékokkal annál könnyebb agyonvágni a chipet (sajnos ilyen), szóval 99%, hogy valamit elállítottál a biztosítékoknál, vagy a kristály rosszul érintkezik, esetleg a két 22pF-es kapacitás nincs ott. Ha más kapacitás van ott (100nF), az sem jó.

Először ki kell olvasni a biztosítékokat, utána változtatni, végül visszaírni. Ha nem ezt teszed meg, hanem azonnal változtatsz és írsz, akkor az bajt okozhat.
(#) csabeszq válasza csabeszq hozzászólására (») Jan 12, 2013 /
 
Amikor a biztosítékokat megváltoztattad, volt 3 hexa szám, amit kaptál.
Feljegyezted pontosan? Az sokat segíthet, ha tudjuk, hogy mi van jelenleg az IC-ben.

Ilyenre gondolok, hogy:
Low: 0xFF
High: 0xDF
Extended: 0x00

http://www.engbedded.com/fusecalc/
A hozzászólás módosítva: Jan 12, 2013
(#) bbb válasza csabeszq hozzászólására (») Jan 12, 2013 /
 
A kristály jól érintkezik (kicsipogtattam), a 22pF kondik szintén a helyükön vannak (és ezeket is kicsipogtattam, hátha csak a szemem csapják be). A FUSE biteket nem jegyeztem fel sajnos, de alapból 0 volt mindegyik (vagy nem olvasta ki rendesen?). A High-t ha minden igaz DE-re állítottam. Sajnos erre se emlékszem pontosan, de a SinaProgban az volt beállítva, hogy osztás kikapcs, és külső 8MHz-nél nagyobb +0 16CK/14CK. Ezen kívül még a RESET volt letiltva, hogy IO-ként lehessen használni azt a lábat is.

Most viszont, ha megpróbálom programozni, akkor azt kapom vissza, hogy status unknown 0x000000. Ellenőrizzem az összeköttetéseket.
(#) csabeszq válasza bbb hozzászólására (») Jan 13, 2013 /
 
Ha a RESET-et letiltod, utána többé nem tudsz az IC-hez kapcsolódni, kizárólag HVSP-vel.

Gondolom a programozód nem HVSP-s.
(#) vanzerr válasza bbb hozzászólására (») Jan 13, 2013 /
 
Szia!

Építsd meg EZT, ez nekem segített. Eddig minden elprogramozott chipet visszahozott a halálból.
(#) bbb válasza csabeszq hozzászólására (») Jan 13, 2013 /
 
A programozóm egy PicKit2, ami megkapta ezen az orosz oldalon található firmware-t. hogy őszinte legyek, nemigazán akarok AVR-rel többet foglalkozni, mint ennek az áramkörnek a megépítése, ezért is nem álltam neki másik programozó építésének, s inkább használtam ezt a megoldást, minthogy egy soros porti hirtelen összedrótozást próbáljak ki.

Na ekkor jön a következő kérdés, hogy itt Dunakeszin, vagy környékén (Fót, Göd, Budapest 3., 4., 13., 15. kerületek) van-e valaki, akinek van megfelelő programozója, s hajlandó a szabadidejéből rám áldozni pár percet, amíg ezt megoldjuk?
(#) csabeszq válasza bbb hozzászólására (») Jan 13, 2013 /
 
Nekem sajnos nincs HVSP/HVPP programozóm, ugyanis nem vágtam idáig szét egy IC-t sem és nem érte meg megépíteni. Mindenesetre idővel ez még változhat.

Egy ATtiny45-öt 625 Ft-ért adnak, szóval át kell gondolni, hogy megéri-e utazgatni, amikor egy BKV jegy 320 Ft, vagy veszel egy újat és mire összegyűlik elég AVR IC-d, megépíted a fuse doctort.
(#) bbb válasza csabeszq hozzászólására (») Jan 13, 2013 /
 
Én már nem BKV jegyárban gondolkozom S a gond, hogy az Attiny45ért is el kell menni, tehát ugyan ott vagyok
Következő: »»   506 / 839
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