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   384 / 840
(#) dc001 válasza zombee hozzászólására (») Nov 27, 2011 /
 
"Valaki tudna segíteni, hogy mégis miket kell importálni és átírni, vagy esetleg telepíteni?"

Van egy programom ami mérési eredményeket USB-s HID billentyűzetet emulálva küldi el egy PC-nek. Kerítek egy AVR Studio-t és megpróbálom ott is lefordítani. Ha sikerült "beszámolok" az eredményről.
(#) dc001 válasza zombee hozzászólására (») Nov 28, 2011 /
 
Sikerült lefordítani. A következőt csináltam:

Kiindulási állapot egy könyvtár a főprogrammal és az usb configurációs állománnyal:
main.c, usbconfig.h
ezen belül van egy usbdrv könyvtár az USB firmware-hoz:
asmcommon.inc usbdrvasm128.inc usbdrvasm12.inc usbdrvasm15.inc usbdrvasm165.inc usbdrvasm16.inc usbdrvasm18-crc.inc usbdrvasm20.inc usbdrvasm.asm usbdrvasm.S usbdrv.c usbdrv.h usbportability.h

Letöltöttem az AVR Studio 4.19-et és az AVRToolchain-t az atmel honlapjáról.
Letöltöttem a WinAVR-t a sourceforge.net-ről.
Mindegyiket feltelepítettem (next,next,finish módszerrel).

Az AVR strudio-ban készítettem egy új projekt-et.

A 'Source files'-en jobb egérgomb -> 'Add exisiting Source files' menüpont alatt hozzá adtam a forrásokat a fent emlitett könyvtárból és az usbdrv könyvtárból

A 'Header files'-en jobb egérgomb -> 'Add existing Header files' menüpont alatt hozzá adtam a fejlécfájlokat szintén mindkét könyvtárból.

Az 'Edit Configuration Options' (jobb egérgomb) menüpont alatt az 'Include directories' menüpontnál hozzá adtam a fent említett könyvtárat és az usbdrv könyvtárat.

Ugyan itt a 'General' alatt megadtam a 'Device:'-nél a tipust (atmega168), az órajelet '12000000' (12MHz) és hagytam, hogy méretre optimalizáljon '-Os'.

Ezek után a 'Build' (F7) gond nélkül lefordította a programomat USB driver-el együtt.

Nem tudom neked melyik lépés maradhatott ki. Remélem tudtam segíteni.
(#) zombee válasza dc001 hozzászólására (») Nov 28, 2011 /
 
Az a vicces hogy pár hónapja ezeket a lépéseket már megcsináltam a Doper-en, lefordult, de nem működött.
Pontosabban, a gép nem ismerte fel az eszközt. Kipróbáltad már a lefordított programot?
Becsapós a kis r*hadék...

Olyan fordítás kellene nekem ami a Makefile-t használja. Ha beállítod hogy "use external makefile",
akkor nálad is valószínűleg át fog váltani pirosba...
(#) sikolymester válasza zombee hozzászólására (») Nov 28, 2011 /
 
Én a doper fw-t magamnak fordítottam, mivel meguntam, hogy a hobbielektronikás fw mindig sírt studio 4.18SP3 -ban, hogy van frissebb fw és, hogy frissítsem arra (erre ugye mindig cancelt kellett nyomni). Átírtam az stk500 fw verzió részét, így most a studio 4 boldog.

Semmi különlegeset nem tettem, csak kiadtam a make parancsot parancssorban.
(#) zombee válasza sikolymester hozzászólására (») Nov 28, 2011 /
 
Én nem vagyok ilyen szerencsés, talán hogy azért mert Windows alól tolom? Egy ilyen halmazt kapok:
  1. E:\AVR-Doper.2008-11-27\firmware>make hex
  2. avr-gcc -Wall -Os  -Iusbdrv -I. -DDEBUG_LEVEL=0 -DF_CPU=12000000 -mmcu=atmega8 -c usbdrv/usbdrv.c -o usbdrv/usbdrv.o
  3. avr-gcc -Wall -Os  -Iusbdrv -I. -DDEBUG_LEVEL=0 -DF_CPU=12000000 -mmcu=atmega8 -x assembler-with-cpp -c usbdrv/usbdrvasm.s -o usbdrv/usbdrvasm.o
  4. avr-gcc -Wall -Os  -Iusbdrv -I. -DDEBUG_LEVEL=0 -DF_CPU=12000000 -mmcu=atmega8 -c usbdrv/oddebug.c -o usbdrv/oddebug.o
  5. avr-gcc -Wall -Os  -Iusbdrv -I. -DDEBUG_LEVEL=0 -DF_CPU=12000000 -mmcu=atmega8 -c hvprog.c -o hvprog.o
  6. avr-gcc -Wall -Os  -Iusbdrv -I. -DDEBUG_LEVEL=0 -DF_CPU=12000000 -mmcu=atmega8 -c isp.c -o isp.o
  7. avr-gcc -Wall -Os  -Iusbdrv -I. -DDEBUG_LEVEL=0 -DF_CPU=12000000 -mmcu=atmega8 -c serial.c -o serial.o
  8. avr-gcc -Wall -Os  -Iusbdrv -I. -DDEBUG_LEVEL=0 -DF_CPU=12000000 -mmcu=atmega8 -c stk500protocol.c -o stk500protocol.o
  9. stk500protocol.c: In function 'stkEvaluateRxMessage':
  10. stk500protocol.c:142: warning: pointer targets in passing argument 1 of 'strcpy_P' differ in signedness
  11. stk500protocol.c:142: warning: pointer targets in passing argument 2 of 'strcpy_P' differ in signedness
  12. avr-gcc -Wall -Os  -Iusbdrv -I. -DDEBUG_LEVEL=0 -DF_CPU=12000000 -mmcu=atmega8 -c timer.c -o timer.o
  13. avr-gcc -Wall -Os  -Iusbdrv -I. -DDEBUG_LEVEL=0 -DF_CPU=12000000 -mmcu=atmega8 -c utils.c -o utils.o
  14. avr-gcc -Wall -Os  -Iusbdrv -I. -DDEBUG_LEVEL=0 -DF_CPU=12000000 -mmcu=atmega8 -c vreg.c -o vreg.o
  15. avr-gcc -Wall -Os  -Iusbdrv -I. -DDEBUG_LEVEL=0 -DF_CPU=12000000 -mmcu=atmega8 -c main.c -o main.o
  16. avr-gcc -Wall -Os  -Iusbdrv -I. -DDEBUG_LEVEL=0 -DF_CPU=12000000 -mmcu=atmega8 -o main.elf usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o hvprog.o isp.o se
  17. rial.o stk500protocol.o timer.o utils.o vreg.o main.o
  18. rm -f main.hex main.eep.hex
  19. avr-objcopy -j .text -j .data -O ihex main.elf main.hex
  20. ./checksize main.elf 8192 1024
  21. E:\AVR-Doper.2008-11-27\firmware\checksize: awk: command not found
  22. E:\AVR-Doper.2008-11-27\firmware\checksize: [: -gt: unary operator expected
  23. ROM:  bytes (data=)
  24. E:\AVR-Doper.2008-11-27\firmware\checksize: [: -gt: unary operator expected
  25. RAM:  bytes


A legeéső két figyelmeztetés már AVR Studio-ban is megjelent a fordítási kísérletnél:
warning: pointer targets in passing argument 1 of 'strcpy_P' differ in signedness
(#) Gery válasza Gery hozzászólására (») Nov 28, 2011 /
 
Valószínűleg ez a sor a probléma:

AVR32_PWM.IER.chid0=1;

Akkor 32bites AVR-ben hogyan kapcsolom be a PWM interrupt-ját?

Üdv.:Gergő
(#) szabo.gth hozzászólása Nov 28, 2011 /
 
Sziasztok!
Azon gondolkozom már rég óta, hogy miért van az, hogy AVR programozót mindig AVR vezérel, PIC programozót mindig PIC. Erre tud valaki valami okosat mondani? Vagy csak én nem láttam még eleget?

Köszi
(#) sikolymester válasza zombee hozzászólására (») Nov 28, 2011 /
 
Nos, megnéztem.

Nekem is ugyanezeket dobja ki mint neked. Bár most nem arról a gépről fordítottam mint anno. Majd, ha az előtt a gép előtt leszek, akkor kipróbálom ott is.

Bár szerintem lehet, hogy ott is ilyen warningokat dobott, én mindenesetre használom így az stk500 klónomat. Különösebb gebaszt nem tapasztaltam vele mindenesetre.
(#) sikolymester válasza szabo.gth hozzászólására (») Nov 28, 2011 /
 
A kérdés önmagában hülyeség. Egy cég vajon miért csinálna egy olyan terméket, amiben lehetne az, amit amúgy is gyárt és értékesíteni akar, és még sem azt teszi bele?

Amúgy, hogy szolgáljak ellenpéldával:
-A Pickit2 kis módosítással tud AVR-t programozni.

Az AVR ONE -ban egy FPGA van.
(#) dc001 válasza zombee hozzászólására (») Nov 29, 2011 /
 
Kipróbáltam a AVR Studio-val lefordított programot és azzal is működik (felismeri az USB eszközt a PC és fogadja a billentyűket is).

Ha neked mégsem ismeri fel, akkor egyrészről az áramköri részt kellene leellenőrizni, másrészről az usb beállításait az usbconfig.h-ban is.

A PC abszolult nem is látja az USB eszközödet vagy látja de nem telepít hozzá driver-t?
(#) dc001 válasza zombee hozzászólására (») Nov 29, 2011 /
 
A "warning: pointer targets in passing argument 1 of 'strcpy_P' differ in signedness" csak figyelmeztetés, hogy az strcpy_P() függvény első paraméterben signed char pointer-t vár, de a programban unsigned char pointer-t kap. Ettől még tökéletesen műdik a firmware.

A "E:\AVR-Doper.2008-11-27\firmware\checksize: awk: command not found" üzenet azt jelenti, hogy nem találja az awk programot (nincs feltelepítve vagy nem szerpel a PATH elérési útban).
Igazából ez sem akkora gond, mert csak egy '#' karakert kell tenni annak a sornak az elejére, amely a 'checksize'-t tartalmazza a Makefile-ban. Így csak annyi történik, hogy fordítás után nem fogja leellenőrizni a kész firmware-t, hogy elfér-e az atmega-ba.

A méretet kézzel is le lehet ellenőrizni, ha futtatod az 'avr-size -f main.elf' parancsot, ekkor parancssorban* ki fogja írni, hogy hány byte-os lett a program.

Ezektől függetlenül teljesen használható a fordítás eredménye.

* Start->Futtatás->cmd
(#) dc001 válasza zombee hozzászólására (») Nov 29, 2011 /
 
Az awk-k elvileg a AVR Toolchain csomag tartalmazza, ami letölthető az atmel honlapjáról:
C:\Program Files\Atmel\AVR Tools\AVR Toolchain\bin\awk.exe

Ha mégis fel van telepítve, akkor a PATH-hoz kell hozzá fűzni az alábbi sort (vagy ha máshol van akkor oda kell mutatnia):
;c:\Program Files\Atmel\AVR Tools\AVR Toolchain\bin

A PATH környezeti változót a 'Sajátgép'->jobb egérgomb->Tulajdonságok->Speciális->Környezeti változók->Rendszerváltozók alatt találod.

Ezek után működnie kell a checksize batch-nak.
(#) Reggie válasza puli122 hozzászólására (») Nov 29, 2011 /
 
A te megoldasodnal a sorbakotott FET-eknel a kozvetlenul a foldre kotott FET kikapcsolasaval a folotte levo FET gate kapacitasat is kisutod, bekapcsolaskor pedig azt is fel kell tolteni. Igy nagyban romlik a kapcsolasi karakterisztika. P csatornas FET-ek alkalmazasa eseten a P csatornas FET-ek fuggetlenul mukodnek az N csatornas FET-ektol.
(#) Reggie válasza Gery hozzászólására (») Nov 29, 2011 /
 
Milyen tipusu konkretan a uC?
(#) Gery válasza Reggie hozzászólására (») Nov 29, 2011 /
 
Szia!

AT32UCB0256

Ez alapján tudsz segíteni?
(#) Gery válasza Reggie hozzászólására (») Nov 30, 2011 /
 
A datasheet ír egy ilyen sort:

The PWM interrupt line is connected to the interrupt controller. Using the PWM interrupt requires
the interrupt controller to be programmed first.

Ez fontos nekem? Nem elég annyi, hogy a PWM Interrupt Enable Register -t bekapcsolom? A PWM-em a 0-ás csatornán van. Ha a CHID0 -ba írok 1-et azzal a sorral amint fentebb írtam akkor nem is fut a program a kontrollerbe, legalábbis semmire nem reagál. Viszont ha mondjuk a CHID1-be írok 1-est akkor a program fut, de ha jól gondolom meg se történik az interrupt. Van valami ötleted mi lehet a probléma?

Üdv.:Gergő
(#) rattanee hozzászólása Nov 30, 2011 / 1
 
Végignéztem amiker írtatok, voltak érdekesebb hozzászólások, de ahogy utánanéztm be kell lássam hogy nem lesz időm visszarázódni a programozásba. Nem lenne valaki aki a kihívás mellet némi anyagi kompenzációért (vagy esetleg ha hardvert kell építeni azt is szívesen csinálok) cserébe kisegítene?

Az a helyzet hogy ahogy kialakultak az igények, több mindent is meg kellene oldani lehetőleg egy ic keretein belül.

Röviden amit meg kellene oldani, akár 1db kontrollerrel:
-USB vagy PS/2 billentyűzet interface a korábban leírtak szerint, mátrixos megoldás kizárva! (inkább bevállalom a nagyobb ic-t)
-Frekvenciaszámláló (folyamatosan figyel egy szinkronjelet, és ha az nem egy adott tartományon belül van, 0-n tart egy lábat.
-15khz-es RGB jellel egy statikus kép megjelenítése

Ha van valaki aki bevállalná(nyilván nem 500 ft-ért), dobjon egy mailt ide: 4vatera kukkancs gmajil plotty komm
Kérném olyan jelentkezzen aki azért már tényleg érti a dolgát és be tudja vállalni, ígérgetés nem kell, abból van elég.

Köszi!
(#) Reggie válasza Gery hozzászólására (») Nov 30, 2011 /
 
Minden fontos.
Na vegyuk sorra a dolgokat. Eloszoris 32bite AVR-nel celszeru az erratat eloszor elolvas, es onnan kiderul, hogy van egy olyan bug, hogyha kozepre igazitott PWM-et hasznalsz, akkor az interrupt engedelyezesekor egy megszakitas keletkezik rogton. Tehat a helyes sorrend: 1. be kell konfiguralni a csatornat, 2. engedelyezni kell a megszakitast az adott csatornara, 3. engedelyezni kell a csatornat. Termeszetesen mindezek elott regiszralhatod nyugodtan a megszakitas kezelot. A megszakitasban az ISR regisztert mindenkeppen ki kell olvasni, hogy torold a megszakitas kerest, ha nem teszed meg, akkor folyamatosan meghivja a megszakitast es nem is ter vissza a foprogramhoz.

Mivel a kod amit bemasoltal csak osszeollozott, igy nem latszik belole se, meg az sem hogy hol engedelyezed a csatorna megszakitasat, igy ahhoz nem tudok otletet mondan. De ismet javaslom hogy letre lehet hozni minta projectet az AVRStudio projekt varazslojaval, azt kene megnezned.
(#) Gery válasza Reggie hozzászólására (») Nov 30, 2011 /
 
Véleményem szerint úgy csinálom ahogy írod. Mellékelem a programot ami írtam, bár nem tudom mennyire tudsz kiigazodni belőle. Van benne TC Interrupt ugyanis egy olyan programot vettem alapul amibe USART kommunikáció már le volt programozva.
Az egyik kép azt mutatja, hogy debug módba ha nyomok egy pause-t hol áll folyamatosan a program. A másik kép pedig azt, hogy hol írok 1-et a PWM Interrupt Enable Register-be. Azt a PWM enable elé írtam, ahogy mondtad.
Egy kicsit feljebb található meg ez a sor :

INTC_register_interrupt(&pwm_interrupt,AVR32_PWM_IRQ, AVR32_INTC_INT0);

ami elvileg meghívja a megszakítás kezelőt ami a programnak majdnem a legtetején van és így kezdődik:

static void pwm_interrupt(void)

Ez alapján tudsz valamit mondani?
Amúgy szoktam nézegetni az Example programokat. Rengeteg dologba segítettek már, de csak External Interruptal kapcsolatban találtam programokat PWM Interruptot nem, vagy csak én nem látom?
(#) nemesimi hozzászólása Nov 30, 2011 /
 
Sziasztok!

Azt a kérdést szeretném feltenni hogy:

INT megszakítás lábon prell ellen irtam egy fügvényt
ami anyit csinál hogy:

Indít egy timert ami egy sec_leptetes nevű változót léptet 1 másodpercenként!
while(sec_leptetes != 1)
{
}

Működik is!!! Csak az a bajom ha ezt az INT rutinban hivom meg akkor végtelen ciklusba megy át mert szerintem nem látja a sec_leptetes változót pedig globális!Máshol ha meghívom tökéletesen müködik!

Nem tudom mi lehet a baj ha valaki tudja kérem segítsen!!


Remélem jól magyarázom!!!!
(#) zombee válasza nemesimi hozzászólására (») Nov 30, 2011 /
 
A "volatile" makrókiegészítő lesz, természetesen.
(#) huba válasza zombee hozzászólására (») Nov 30, 2011 /
 
A sec_lepes-t hol változtatod? Ha egy másik interruptban akkor nem fog lefutni egy másik interrupt amíg ez le nem jár.

Old meg fordítva. A gombnyomásos megszakításba írd azt hogy gombido=1; és a másodpercszámlálósba, csökkentsd, nézd mikor éri el a nullát és ott végezd el az egyebeket.
(#) Reggie válasza Gery hozzászólására (») Nov 30, 2011 / 1
 
Igen, ugy tunik, hogy jol csinalod a dolgokat. Viszont van egy rossz hirem: ha ott all meg a program az azt jelenti, hogy kivetel keletkezett. Konkretan a te esetedben az "Instruction Address" kivetel azt jelenti, hogy egy utasitas memoriacime nincs 4 bajtos hatarra igazitva. Megint juttasd el idaig a uC-t, majd allitsd meg debug modban. Ekkor a stack tetejetol szamitva a masodik ertek (azaz SP-8 cimen) megtalalod annak az utasitasnak a cimet, ami ezt a kivetelt okozta. Van egy olyan tippem, hogy ez a megszakitaskezeles kornyeken lesz. Amennyiben igazam van, akkor a kovetkezo javaslatom az, hogy a _int0: label cimere rakjal egy breakpoint-ot es onnan lepesrol lepesre hajtsd vegre az utasitasokat, hogy lassad mi tortenik.
(#) Gery válasza Reggie hozzászólására (») Nov 30, 2011 /
 
A megoldást nem igaz értem. Hol van és mi ez a stack? És hol találom az _int0 labelt?
(#) sikolymester válasza Gery hozzászólására (») Dec 1, 2011 /
 
Stack ügyében: Memory Areas
(#) Reggie válasza Gery hozzászólására (») Dec 1, 2011 /
 
_int0: az exception.S-ben talalhato, de gyakorlatilag teljesen mindegy, mert a szimbolumtablazatban megtalalod es ott lesz a cime is.
A stack pedig ott van a memoriaban, ahova a stack pointer (SP) mutat.
(#) iceface hozzászólása Dec 1, 2011 /
 
Sziasztok!

Szeretném elsajátítani az ATmega programozását alap fokon.
Egy AND_TECH.PL EvB 4.3 fejlesztő készletem van ATmega644p-vel
Bascom programozóm és nulla tapasztom a témáról!

Ebben szeretném segítségeteket és türelmeteket kérni.
Hol tudnám az alapokat könnyen elsajátítani.

pl: nyomó gombal kapcsolni egy ledet, LCD-re kiírni dátumot,órát, hőfokot

Szeretnék infra távirányítóval 5db ledet kapcsolgatni a különböző távirányító gombokkal.
Persze ehhez még rengeteget kell tanulnom.

Valahogy dekódolni kellene a távirányító infra jeleit típusa: LG 6710CCAR01G, majd az ismert kódokhoz kimeneteket definiálni.
(#) sikolymester válasza iceface hozzászólására (») Dec 1, 2011 /
 
Azt hiszem legjobb, hogyha itt kezdesz:
Bascom

ATmega164P

Hajrá
(#) Gery válasza Reggie hozzászólására (») Dec 1, 2011 /
 
Nos, a probléma megoldódott, ugyanis az uC nem tudta milyen típusú az interrupt, ezek a sorok hiányoztak az interrupt meghívás elől:

#if defined (__GNUC__)
__attribute__((__interrupt__))
#elif defined (__ICCAVR32__)
#pragma handler = USPSR_TC_IRQ_GROUP, 1
__interrupt
#endif

Köszönöm a segítséget!
(#) norbigal hozzászólása Dec 1, 2011 /
 
Van egy adott programrészlet ami LCD-re ír ki szöveget, úgy hogy a bemenő változója egy char tömb.

void LCDString(char *str)
{
while(*str) LCDChar(*str++); //az LCDChar viszi ki a string elemeit
}

Hogy bírnám ezt átírni úgy, hogy a bemenő érték ne ez a *str legyen hanem ilyen alakú legyen: str[]
És ezzel egyetemben hogy bírom átírni ilyen alakúra az *str-t a while feltételében?!?!
Igazából csak azt szeretném elérni az eégésszel, hogy a while ciklusban meg bírjam határozni, hogy az str tömb hányadik elemétől kezdődően írja a karaktereket.
De ebben a string formában nem tudom. Sanos csak egyik tanárom mutatta de magyarázatra nem tértünk ki, hogy ez a *str pontosan mit is jelent.
Következő: »»   384 / 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