Fórum témák
» Több friss téma |
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
"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.
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.
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...
É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.
Én nem vagyok ilyen szerencsés, talán hogy azért mert Windows alól tolom? Egy ilyen halmazt kapok:
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
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ő
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
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.
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.
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?
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
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.
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.
Szia!
AT32UCB0256 Ez alapján tudsz segíteni?
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ő
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!
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.
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?
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!!!!
A "volatile" makrókiegészítő lesz, természetesen.
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.
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.
A megoldást nem igaz értem. Hol van és mi ez a stack? És hol találom az _int0 labelt?
Stack ügyében: Memory Areas
_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.
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.
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!
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. |
Bejelentkezés
Hirdetés |