Keresés: 
 Bejelentkezés
Nick:
 
Jelszó:
 
 
 
   
» Elfelejtettem a jelszavamat :'(
» Regisztráció
 Fórum témák
» Több téma
 Frissek
RSS hírforrások
  Hírek.rss
  Fórum.rss
  2012. Máj, 24. Csü
19:11:45
  Jelenleg 632 fő olvassa az oldalt
Fórum » Pontra menő témák » AVR - Miértek, hogyanok... »
AVR - Miértek, hogyanok...  
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök
Mikroprocesszorok » ATMEL processzorok
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 Méret:     404 / 443     
(#1158490) sgt válasza szdani hozzászólására (#1158479) Válasz • Feb 4, 2012
Ha világít egy sor, akkor a LöCöDöd működik, csak nem jól inicializálod. A hiba az önkészülékében van .

Egy forráskódot kérnénk.

Jó tanács: te határozd meg delay függvényekkel, hogy mikor jöhet a következő parancs, mert ha Busy Flag-t használod az érdekes módon nem mindig működik ahogy azt az ember elgondolta.

(#1158493) szdani válasza mzozo95 hozzászólására (#1158410) Válasz • Feb 4, 2012
szerintem próbáld meg valahogy így, ebben van leírás hogy működik a pwm.

(#1158495) zombee válasza mzozo95 hozzászólására (#1158410) Válasz • Feb 4, 2012
Az ATTiny2313-ban csak 2 időzítő van, mindkettőnek 2 kimenete, saját komparátor-regiszterrel(OCR).
Három, teljesen független PWM csatornát nem tudsz kezelni, de ha ebből kettőnél a PWM-frekvencia lehet azonos
akkor nincs akadálya. Esetleg ATMega48-at ajánlom amibe 3 timer van 2+2+2 OCR regiszterrel.

Kitöltési százalékot sehol nem lehet megadni, maximum azt hogy a számláló milyen állásainál(értékeinél) történjen valami. Először a frekvenciát kell beállítani: 2000+20000us=22ms ~45.4545Hz. Ebből, és az AVR órajeléből kell kisakkozni a számláló maximális értékét. Én 8MHz-vel számolok ha nem gond, azt beépítve tudja az ATTiny2313 és az ATMega48 is(CKDIV8 FUSE bit kikapcsolásával).

És a Timer1-el számolok, ott pontosabb értékeket meg lehet adni. Az előosztónak 64-et választom mivel 8MHz/64=125kHz, azaz a számláló pontosan 125-öt számol minden ezredmásodpercben. Ugye 22*125=2750, ebből 1-et ki kell vonni és azt kell megadni, mint a számláló TOP értéke. Az 1-es időzítőnél az ICR1-et állítsd be 2749-re!
Most jön a PWM. Az OCR1A-t állítsd be (125*2)-1=149-re! Ezután a kimenetet kell beállítanod a TCCR1A-n a COM1A1:0 biteken hogy az OCR1A eléréséig logikai 1, utána a számláló újraindításáig logikai 0 legyen. A timert a megfelelő módba kell kapcsolni olyan PWM módba, hogy a TOP az ICR1 legyen! A számlálót a TCCRB-ben az előosztó beállításával indítod el.

(#1158501) Tetye válasza szdani hozzászólására (#1158479) Válasz • Feb 4, 2012
Lcd akkor tán nem halott... de nem értem E4 elviler a belső saját oszci.
Neked van most rajta valami órajel forrás?
Belső 8mhz vel próbáld.
Robi ?

(#1158504) Tetye válasza sgt hozzászólására (#1158490) Válasz • Feb 4, 2012
Tessék (hátha Te többre mész):
  1. $regfile = "attiny2313.dat"
  2. $crystal = 8000000
  3. Config Lcdpin = Pin , Rs = Portd.0 , E = Portd.2 , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0
  4. Config Lcd = 16 * 2
  5. Initlcd
  6. Initlcd
  7. Cursor Off
  8. Cls
  9. Lcd "Hello Sz. Dani !"
  10. End

(#1158508) szdani válasza sgt hozzászólására (#1158490) Válasz • Feb 4, 2012
odaadom a komplettet, netről szedtem le én, az avr studio szerint jó.
» A fájlok letöltéséhez be kell jelentkezned! «

(#1158509) zombee válasza zombee hozzászólására (#1158495) Válasz • Feb 4, 2012
Hogy ne legyen kínai, leírom a beállításokat ATTiny2313-ra és ATMega48-ra ugyanúgy jó a kód:

  1. //Plafon beállítátsa - 22ms:
  2. ICR1 = 2749;
  3. //Kitöltés beállítása - 2ms:
  4. OCR1A = 249;
  5. //időzítő mód beállítása és a timer indítása - előosztó=64 :
  6. TCCR1B = 1<<WGM13 | 1<<WGM12 | CS11 | CS10;
  7. //időztő mód(WGM11 és WGM10 marad 0-ban), és kimenet(OC1A) beállítása:
  8. TCCR1A = 1<<COM1A1;


A logikai 1 és 0 értékeket felcserélheted, 2-féleképpen is, én a legegyszerűbbet írom le:
  1. OCR1A = 2499//(125*20)-1

Megjegyzés: PWM módoknál az értékek a timer újraindulásakor(TOP elérésekor) érvényesülnek.
Másik megoldás a kimenet polaritásváltása(COM1A1:0 átállíátsa), de a változtatás azonnal életbe lép!

(#1158516) Tetye válasza szdani hozzászólására (#1158508) Válasz • Feb 4, 2012
Nem azzal hex-el próbáltad amit küldtem?

(#1158528) szdani Válasz • Feb 4, 2012
Működik!! Találtam itthon egy másik 2313-mat mert gondoltam hátha jó lesz. A régi chip-nek is kiolvassa rendesen a signatúráját, de azzal nem jó. Köszönöm szépen mindenki segítségét

(#1158529) szdani válasza Tetye hozzászólására (#1158516) Válasz • Feb 4, 2012
De igen azt írtam bele utoljára most ki is írja hogy Hello Sz. Dani. csak gondtam elküldöm neki azt a projektet amit direkt 2313hoz írt valaki és én azzal is próbáltam.

(#1158533) mzozo95 válasza zombee hozzászólására (#1158509) Válasz • Feb 4, 2012
Szia!

valami nem akar működni... Szoftveresen tökéletesen működik a pwm, de sajnos ezzel sem(próbáltam pár netes jódot is...), ezt a kódot égettem be:
  1. #define F_CPU 8000000
  2. #include <avr/io.h>
  3.  
  4. int main(void) {
  5.     DDRB = (1<<PINB3);
  6.  
  7.         //Plafon beállítátsa - 22ms:
  8.     ICR1 = 2749;
  9.     //Kitöltés beállítása - 2ms:
  10.     OCR1A = 249;
  11.     //időzítő mód beállítása és a timer indítása - előosztó=64 :
  12.     TCCR1B = 1<<WGM13 | 1<<WGM12 | CS11 | CS10;
  13.     //időztő mód(WGM11 és WGM10 marad 0-ban), és kimenet(OC1A) beállítása:
  14.     TCCR1A = 1<<COM1A1;
  15.    }


A jel egy RC szervóhoz és egy ledhez megy, a led nem is világít, így valami gond van, a kimenet az OC1A, azaz a PB3 ha jól gondolom... Végignéztem a többi kimenetet is, de sehol semmi...

Egész délután ezzel az egyszerű dologgal küszködök, sajnos elég hiányos az elérhető dokumentáció is a neten...

Mi lehet a hiba?

Zoltán

(#1158541) szdani válasza mzozo95 hozzászólására (#1158533) Válasz • Feb 4, 2012
Pontosan mit szeretnél csinálni a szevóval? Mert én régebben töltöttem le egy rajzot, attini2313-ra van kötve egy szervó, 4 nyomógomb amivel vezérled, meg van egy lcd-je ami kiírja mi történik de az nem lényeg rá. Ha valami ilyet szeretnél eltudom küldeni

(#1158548) mzozo95 válasza szdani hozzászólására (#1158541) Válasz • Feb 4, 2012
Szia!

Egyenlőre csak annyit, hogy hardweres pwm-el elő tudjam állítani a megfelelő vezérlőjelet, és értsem is hogyan működik... Utána egy ADC-vel rákötnék egy potit, majd azzal vezérelném az egészet, végül jönne az lcd is... Már msp430 as kittel megcsináltam az egészet, de most váltottam nem rég AVR-re...

Valaki talált hibát a forráskódban?

Zoltán

(#1158558) szdani válasza mzozo95 hozzászólására (#1158548) Válasz • Feb 4, 2012
Ezt nézd meg ez egy rc-szervó teszter egy potival vezérled egész jól le van írva ahogy megírta a srác.

(#1158567) zombee válasza mzozo95 hozzászólására (#1158533) Válasz • Feb 4, 2012
Bocsánat! CTC módban fut az időzítőd, rossz értéket adtam meg. Bár ettől még működhetne...
De ejtettél egy végzetesebb hibát: a program futása soha nem érhet véget, a main() fv. végére tegyed be:
  1. while(1);


Illetve mondom a helyes timer beállítást. Egyedül a TCCR1A-s sort kell módosítani:
  1. TCCR1A = 1<<COM1A1 | 1<<WGM11;

(#1158588) sgt válasza szdani hozzászólására (#1158528) Válasz • Feb 4, 2012
Minden jó ha a vége jó .

(#1158660) mzozo95 válasza zombee hozzászólására (#1158567) Válasz • Feb 5, 2012
Szia!

Módosítottam a programot:
  1. #ifndef F_CPU
  2. #define F_CPU 8000000
  3. #endif
  4. #include <avr/io.h>
  5.  
  6. int main(void) {
  7.     DDRB = PINB3;
  8.  
  9.         //Plafon beállítátsa - 22ms:
  10.     ICR1 = 2499;
  11.     //Kitöltés beállítása - 2ms:
  12.     OCR1A = 250;
  13.     //időzítő mód beállítása és a timer indítása - előosztó=64 :
  14.     TCCR1B = 1<<WGM13 | 1<<WGM12 | CS11 | CS10;
  15.     //időztő mód(WGM11 és WGM10 marad 0-ban), és kimenet(OC1A) beállítása:
  16.     TCCR1A = 1<<COM1A1 | 1<<WGM11;
  17. while(1){};
  18.    }


Így sem reagál, semelyik lábon sem ad ki pwm jelet, sőt, mindegyik láb értéke "0".

Talán hibás lenne az AVR...? A normál portot működnek... de ez nem akar. Nem kellene külső oscillátor hozzá? (elég butaság lenne...)

Ilyenkor mit lehet tenni?

Zoltán

(#1158698) zombee válasza mzozo95 hozzászólására (#1158660) Válasz • Feb 5, 2012
Két hiba is van, este nem vettem észre. Egyiket Te ejtetted, másikat én, és pont ugyanaz a hiba.
Persze ilyenkor mindenki arra gondol kínjában hogy talán az AVR nem jó(én is).

7. sor:
  1. DDRB = 1<<PINB3;

14. sor:
  1. TCCR1B = 1<<WGM13 | 1<<WGM12 | 1<<CS11 | 1<<CS10;

(#1159081) Suncorgo Válasz • Feb 5, 2012
Sziasztok

Azért fordulok hozzátok mert egy mega8-as nem válaszol vissza. Mi lehet a baja?

Próbáltam kvarcot tenni mellé, külső órajellel de semmi. ISP freki hibát ír az avr studio.

Szkóppal néztem, SKC-n van órajel, MOSI-n van adat viszont az IC nem válaszol vissza a MISO lábán. Kinyirtam volna a bootloadert belőle?

Van valami egyszerű nagyfesz programozó amivel életre tudnám kelteni?

Üdv:
Suncorgo

(#1159097) zombee válasza Suncorgo hozzászólására (#1159081) Válasz • Feb 5, 2012
Az ISP inkább egy programozási felület, nem szokás bootloadernek hívni. Ha a RESETDISBL vagy az ISPEN nevű FUSE bitek valamelyike el lett állítva, az csak nagyfeszen(HVPP) javítható.
A legegyszerűbb ilyen eszköz a HVPP Fuse bit Doctor, erre rákeresve meglesz a kapcsrajz is.

Ezen kívül a gyári STK500(és HVPP-képes klónjai, pl. a sajátom vagy a der-hammer féle), illetve AVR Dragon.

(#1159103) Suncorgo válasza zombee hozzászólására (#1159097) Válasz • Feb 5, 2012
Nem azt hívtam bootloadernek. Csak gondoltam hogy a bootloader válaszol vissza SPI-n a programozónak mikor adat kiolvasás van.

Az AVR doper ami itt az oldalon fennt van az képes HV progra? Mármint ha megoldom hogy a cél AVR reset lábára 12Vot kapcsoljon?

(#1159120) zombee válasza Suncorgo hozzászólására (#1159103) Válasz • Feb 5, 2012
Bootloader nem szokott SPI-n kommunikálni. Általában Rx/TX-en, mint pl. az Arduino vagy az Evertool.
Vagy USB-n (pl. USBBOOT), illetve hardveres USB-vel rendelkező AVR-ek esetében a FLIP bootloader.

ATMega8 esetében a Doper nem lesz jó HVPP-re, azzal csak HVSP-t lehet(ami a kisebb Tiny-khoz jó).
A legegyszerűbb amit építhetsz erre, az egy HVPP Fusebit Doctor, kb. ugyanannyira bonyolult mint a Doper.

(#1159126) Suncorgo válasza zombee hozzászólására (#1159120) Válasz • Feb 5, 2012
Értem. Köszönöm a segítséget zombee!

(#1159335) kovacsj válasza zombee hozzászólására (#1159120) Válasz • Feb 5, 2012
Mire való tulajdonképpen az a bootloader? Én még soha nem használtam, pedig lehet, hogy jobb lett volna.

(#1159382) zombee válasza kovacsj hozzászólására (#1159335) Válasz • Feb 5, 2012
Egyfajta program az AVR-ben ami bizonyos feltételek esetén kommunikál valamilyen csatornán(lehet USART, SPI, I2C, USB), és rajta keresztül betölti azt a kódot amit a boot-feltétel nem-teljesülése esetén futtatni fog.
Persze a bootloadert is be kell égetni és a BOOTRST-t meg a kezdőcímet beállítani.
Meg is kell írni/módosítani a bootloader kódját ha pl. az induló feltételt állítanád be.

A legjobb példa erre az Arduino és a JTAG-ben használt Evertool.
A legtöbb AVR-hez elérhető a szintén avr910-kompatíbilis bootloader(pl. az Evertool is az).
Ha már avr910: általában lefoglal egy portlábat, és bekapcsoláskor azt figyeli hogy le van-e húzva.
Ha nincs akkor a bootloader a kezdőcímre ugrik(magyarul: kilép), ha igen akkor avr910-es programozóként viselkedik és önmagát programozza.
A programozás végén általában újra kell indítani az AVR-t, és a bootloader aktiválásához is kézzel RESET-elni kell tehát nem lesz egyszerűbb.
Olyan eszközöknél használnak bootloadert amelyeket néha(inkább nagyon ritkán vagy soha) frissíteni is kell, és azt a meglévő(tehát RS-232, USB, CAN-busz, stb.) csatlakozáson egy egyszerű program lefuttatásával külső segédeszköz(pl. AVR-programozó) nélkül lehet megejteni.

Nekem is lenne egy kérdésem a GSM-modullal, mert éppen egy konzolos eszközt(PC interfész) kellene programoznom. A GSM-modul esetében az AT parancsokat vagy egy ENTER(azaz , 13-as ASCII-kód) zárja ha kézzel programozod, de automata(pl. AVR-ből) programozásnál már egy \n (ez egy , 10-es ASCII-kóddal).
A kérdésem hogy lényegében mindkettő zárhat egy utasítást?

(#1159444) Suncorgo Válasz • Feb 5, 2012
Megszületett az AVR Fuse Doctor. Remélem hozza a várt eredményt
» A fájlok letöltéséhez be kell jelentkezned! «

(#1159446) Suncorgo válasza zombee hozzászólására (#1159382) Válasz • Feb 5, 2012
Bootloadert ISP programozóval lehet betölteni? Ez lehet hogy hülye kérdés mert pont az a szoftverrészt akarom felülírni ami éppen kommunikál.

(#1159458) zombee válasza Suncorgo hozzászólására (#1159444) Válasz • Feb 5, 2012
Gyönyörű! Az első változatom megépítése is tovább tartott és csak drótoztam, tervezésre nem futotta(1. kép).
De végül 2 hét alatt csak-csak elkészült egy maratott verzió 3 darab foglalattal(2. kép).
» A fájlok letöltéséhez be kell jelentkezned! «

(#1159471) zombee válasza Suncorgo hozzászólására (#1159446) Válasz • Feb 5, 2012
Betölteni egy szűz AVR-re csak programozóval(ISP, JTAG) lehet.

A bootloader elvileg felülírhatja magát, de minden pillanatban csak olyan szektort írhat amin
éppen nem fut a program. Egy szektor mérete jelen ismereteim szerint a BOOTSZ nevű FUSE bitek által legkisebb értékre beállítható terület. Hülye megfoglamazás tudom, ATMega32-nél ez 256 bájt. Tehát a maximális, 2048 bájtos bootloader esetében bármely, megadott állapotban 7 darab bootloaderes szektort írhatsz...

A kommunikációs rész is lecserélhető ha az új programkódot a kommunikációs rész az SRAM-ba vagy EEPROM-ba tárolja le, egy másik szektorba pedig lehet az a kód ami onnan kiolvassa és flasheli...

(#1159498) Suncorgo válasza zombee hozzászólására (#1159458) Válasz • Feb 5, 2012
Köszönöm. Pedig ezt csak gyorsan összedobtam.

Következő     404 / 443     
 HEStore.hu
 Hirdetés
TrainModules.hu