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
Jó ötlet. Bár a bemenet ha illesztve van kondenzátorral akkor nemtudom hogy marad meg magas szinten, ki fogom próbálni.
Bővebben: Link
Ez nem az véletlenül? Nem megy jól a német, sajna.
Köszönöm a válaszokat a programozó csatlakozóval kapcsolatosan. Egyelőre maradtam az AVR910-ben is vázolt 6 pólusú ISP csatinál a programozón, ehhez majd lehet csinálni rövid kis kábeleket, amiknek a vége esetleg más. Topi ötlete is hasznos, valószínűleg fogom is alkalmazni.
Tegnap elkészült a javított verziója az USB/soros átalakítóval működő AVR910-es programozónak (utolsó 3 kép): Bővebben: Link A hardverben és a firmwareben az alábbi módosításokat hajtottam végre: 1. A szoftveres UART-ot lecseréltem hardveres UART-ra; 2. A céláramkör felé menő Vdd jelet egy FET-tel kapcsolhatóra alakítottam ki, a Vdd-t a beépített nyomógombbal lehet ki/be kapcsolni; 3. Visszajelző LED-eket tettem az alábbi vonalakra (a korábbi, RX és TX LED-eken kívül): - USB tápfeszültség - LED (ezt az eredeti fw "LED on" és "LED off" parancsai kapcsolják) - programozás mód - Vdd a céláramkörön - Vdd a programozóból a kimenetre kapcsolva 4. Programozás kezdetekor, ha a céláramkörön nem érzékel tápfeszültséget, akkor rákapcsolja; 5. Ha kimenetre kapcsolt tápfeszültség mellett nem érzékeli a céláramkör tápfeszültségét (rövidzár), akkor kikapcsolja azt és villogó LED-del értesít a hibáról. Azt hiszem, elég univerzálisra sikerült így az eszköz, az AVROSP II-vel nagyon jól használható, és fejlesztéshez az USB-ről történő tápellátás is nagyon jól jön (majdnem PICkit2 szintű így a kényelem). Persze lehet, hogy nem érdemes túl sok munkát ölni ebbe a programozóba, de végülis a firmware bővítgetésével, átírásával rengeteget tanultam. "Melléktermékként" pedig valami használható is született
Akkor szükségem lesz egy I2C, egy RS232 és egy 16bites PWM algoritmusra. Ilyenkor mi a teendő? Keressek a Neten vagy vannak olyan library-k ahol ezek már meg vannak írva? Eddig ASM-ben írogattam, ezután is jó lenne.
Még egy kérdés: mivel tudom betölteni az eepromba az adatokat a PC oldaláról? Hiperterminal?
Segítség!
Hogyan lehet a port(b-c-d)-re építeni led-es (pl.:5x5-ös) kijelzőt. C program is kéne. (akár lcd kijelző is jó) akármilyen kijelző jó, főleg a ledes mert olcsó.
Lenne 1 kérdésem/kérésem:
AVR Studio 4 –ben WinAVR-t használok h C ben tudjam írogatni a bogárkát. DE nem tudok rájönni h lehet lábanként címezni. A PORTA.0 dolog miért nem létezik mint pl a PICeknél? ( PORTA= 1; értéket így tudok adni neki, így a PORTA nullásán egy lesz) pls…
Ebbe én is belefutottam. Ezt a netes példát találtam:
// portc 0. bitjét 1-re állítom, (többit nem módosítom) PORTC |= (1<<0); // port c 1. bitjét 1-re állítom PORTC |= (1<<1); // port c 0. bitjét 0-ra állítom PORTC &= ~(1<<0); // portc 1. bitjét nullára állítom PORTC &= ~(1<<1); A |= operátor az azt jelenti, hogy bitenként összevagyolja a bal felén álló értéket a jobb oldalán állóval, és ez a vagyol térték lesz a bal oldali értéke. A &= operátor ugyan ez csak éseléssel. A (1<<0) az azt jelenti, hogy az egyet, mint számot bináris alakra váltom át, és azt shiftelem 0-val balra. Nem tudom, miért használják ezt a megoldást. (1<<0) az egyenlő 000000001-el A (1<<1) az egyenlő 00000010-val stb. A ~ operátor a bitenkénti negálást jelenti. ~(1<<2) az a 00000100 érték bitenkétni negálását jelenti, vagyis 11111011-t. Többiek pontosítsatok! >>>>>>>>>>>>>>>>
A PORTA.0 dolog nem a PIC-ekhez kapcsolódik,hanem a C standardtól eltérő C fordítókhoz.A winavr-ben nincs ilyen utasítás,de meg lehet oldani:Bővebben:itt
A codevisionban pl. van.
Sziasztok!
Azt szeretném megkérdezni, hogy miért nem működik a
Egészeket kezel.
Ha ilyet kell kiszámolni, akkor mindig a legnagyobbat a legnagyobbal szorzod, majd a legnagyobbal osztasz és így tovább. A lényeg, hogy itt a fordító 0.000625 helyett lazán 0-ával számol. Nálad:
itt a pontos megoldás,a struct bits-nél+ a macro
Köszönöm szépen a segítséget, így már működik.
Egy kicsit eltévedtem az AVR-ek között.
Ez is AVR vagy teljesen rossz nyomon járok? AT89C2051-24PU 8-BIT MC 5V 2K Flash 24MHz D Igazság szerint teljesen egyszerű dolgokra kellene nekem pár bit be és pár bit kimenet illetve, hogy basic-ben tudjam programozni. Ez a legolcsóbb és ezért is gondoltam rá. Pl ha már van 8 kimeneti bit akkor 8 darab 555-öst ki tudok váltani pl órajelnek így megéri, de ahogy látom ez azért többre is képes. Csak kérdés, hogy tudom-e programozni ezeket basic-ben és írni azokkal az stk izékkal
A legjobb tudásom szerint ez nem AVR. Ez valami 8051-es alapú mikrovezérlő. Más a programozója és fejlesztőkörnyezete mint az AVR-nek.
Használj Attiny2313-mat mondjuk, olcsó és jó a feladatra. Bascommal basicben tudod programozni, és STK programozó viszi
Hmmmm......
Ez rossz hír, a HEStore-n nem találtam Attiny-t csak nagyokat ami 600 Ft körül van. Van értelme elkezdenem foglalkozni szerintetek ezzel a 8051-es családdal vagy inkább más forrást keressek AVR-re? (na és ugye honnan lehetne szerezni olcsón?) Van ahol 300 Ft van ahol 600, ahol 300 ott sok a postaktg ahol meg 600 ott magas az ár. Ezért reménykedtem a He-ben .
8051 chipmag, nem AVR.
Bar ebbol is van ISP feluletu. Bascom-51 segitsegevel bascicul is ert. 2k belso memoria van, azert az sokmindenre eleg.....
A legegyszerűbb ATMEGA16-os kapcsolást szeretném megépíteni, de sajnos nem találtam elég infot a neten vagyis inkább túl sokat is.
Majdnem mindegyik rajzon amit találtam volt ilyen meg olyan kiegészítő dolgok. Nekem csak 2 kapcsoló és 2-3 led kéne rá és egy elemmel szeretném működtetni (9V vagy ceruzák lényeg, hogy egyszerű legyen). Tudom nem szokás kész kapcsolási rajzot kérni, de nem tudok hol elindulni. Az 555-ös tapasztalataimból kiindulva így sokkal könnyebb. Ott is megépítettem egy villogót és a mai napig nem értem pontosan mi hogy van, de nekem tökéletesen elég hobbi szintre, hogy tudom változtatni az ellenállásokat stb... és így megfelelő dolgot tudok vele létrehozni. AVR-el is valami ilyesmit szeretnék csinálni. Lesz egy KIT-em amivel fel tudom majd programozni. Ott áttöltöm a programot átrakom a chippet és a kis egyszerű nyákon meg villognak a ledek. Egy sima mezei dugdosós próbapanelen szeretném összerakni. Ha ez meglenne akkor már gondolom több ledet rárakni nem nagy dolog. A led-ek helyére tehetek 4N35-ös dolgokat innentől pedig bármit vezérelhetek vele, csak hát az első lépés mindig a legnehezebb . Előre is köszönöm a segítséget.
Külső hardver elemek (kapcsolók, nyomógombok, LED-ek) hozzáillesztése azonos a PIC-ekkel.
Erről szól a PIC-es cikkem második része: Nulláról a robotokig - PIC Mikrovezérlők II rész Csak arra a lábra tedd, ahova AVR-nél akarod. Olvasgasd.
Köszi, így már könnyebb lesz, be is raktam a kedvenceim közé .
Pontosan ezt keresem már vagy 10 éve csak akkor még nem tudtam, hogy van olyan, hogy PIC, AVR.
Néhány kérdés:
Mennyivel jön ki nagyobbra ha C-ben progamozom az AVR-t mint asm-ben? Átlag... Milyen progival tudom előállítani a pwm adatokat a wav fájlból?
Ez a programozótól is függ nagyban.
Általában egy 2-3 szoros szorzó biztos benne van a dologban. Nem mindegy hogy egy időzítésnél így számolsz vissza:
Vagy választod a jobb módszert:
Utóbbit a fordító is sokkal hatékonyabban fordítja, mert míg az elsőnél cmp meg incrementek tömegei vannak, addíg a második esetben egy rjmp és dec parancs van. És egyszerűbb zero flag-et vizsgálnia a processzornak, mint két számot összehasonlítani (for, második eleme, a feltételre gondolok itt) A Zero flag rendelkezésre áll minden művelet után, ergo hogy nulla-e nem kell külön levizsgálni a dec után összehasonlítással. És ezernyi ilyen van. Osztásnál osztasz-e /2-vel vagy egyszerűen shift-elsz egyet jobbra. Programozó tapasztaltságán sokminden múlik. Ha C-ben programozol, érdemes tudni, mit csinál egy fordító. Érdemes egy fordító szemével látni a kódot. Persze ehhez nem utolsó sorban tudni kell, mi-hogy néz ki assembly-ben is. Én azt tartom a legjobb megoldásnak, hogy általában C, majd a rendkívül kritikus lépéseket, nagy matematikai műveleteket, időzítések, comparálások. Ezeknek assembly-ben a helye. Pl: egy led-be led-ki program minden időzítés nélkül mondjuk C-ben uS, assemblyben nS. Bár azért rendkívül hatékony és dícsérendő az AVR-GCC hatékonysága. Egy-két sor után kukkants bele a "lss" fájlba. Ide teszi a fordító a C-ből ASM-re konvertált forrást. Ebben látod ASM-ben hogy is írta meg a fordító az adott feladatot.
Talán a témához tartozik az én esetem is. A múlt héten összedobtam mega88-cal egy kis próbapanelt (van rajta 6 LED, 1 nyomógomb meg egy poti), csak így ismerkedésképpen a dolgokkal. Feltelepítettem a WinAVR-t és az AVR studiót.
Korábban a tiny2313-as programozó kapcsán asm-ben már "egész jól" kitapasztaltam dolgokat (persze a korábbi MCS51-es és PIC-es tapasztalatok nagy segítségemre voltak), de most elkezdtem kicsit foglalkozni a c-vel is. Összeütöttem egy primitív progit, ami a LED-eken egy körbe-körbe futó fénypontot valósít meg, a lépések közé pedig be kívántam tenni egy olyan időzítést, ami a potméter leolvasott állásától függ. Ha azt írtam a progiba, hogy "_delay_ms(ADCW)", akkor a mega88 programtárából ~50%-ot foglalt el a programom, ha ezt helyettesítettem egy ADCW-ig elszámoló for ciklussal, aminek a magjában egyetlen "_delay_ms(1)" volt, akkor 2% lett a kódterület kihasználtsága. Éjjel 2 kor már nem volt annyi erő bennem, hogy végigbogarásszam az okát, de ahogy valamelyik fordításkor generálódó file-ba belenéztem, nekem az volt a gyanús, mintha az első esetben mindenféle lebegőpontos rutinokat is beemelt volna a linker a kódomba, holott nemigen tudom, hogy arra miért lett volna szüksége.
Igen. Ez így van, mert a _delay_ms rendszerfüggvény float vagy double változókat is felfogad, mert paraméterként a 0,1-et 100uS-ként értelmezi és le is futtatja. Pont emiatt a _delay_ms-el maximum 65,536ms-ot lehet sleep-elni. Efölött jó megoldás a u16 vagy u8-al felépített ciklus 1ms delay-jel.
Ok, értem, bár azt nem is figyeltem, hogy a _delay_ms() tud float-nyit is időzíteni. Ha tud, akkor valóban jogos lehet a float rutincsomag hozzácsapása.
Ezután már csak azt nem értem, hogy mi a különbség a konstans 1-gyel és az eleve valamilyen int típusú ADCW-vel meghívott _delay_ms közt. Ráadásul megpróbáltam még cast-olni is a paraméterátadásnál, hogy még véletlenül se gondolja float-nak, az se segített rajta. Miért kell neki a változóval történő meghíváshoz a float rutincsomag és a konstanshoz meg miért nem?
szerbusztok!
kaptam nemrég egy avres atmega32 projectet és az én igényeim szerint szeretném átirni vagyis átmodositani a programjába! a program maga bascom avr alat irodot és forditodot ! csak az a baj hogy bin fálj maga a program vagyis ez csak egy filmware! tutok vagy netán ismer valami olyan decompiler programot ami a bin fájlt átforditja bas fájla? tudom ugysem lesz tökéletes a forditás az eredeti foráskodhoz képest! de ha kod részletek látszodnak nekem azis megfelel már tökéletesen
Szervusz!
Figyelj már oda az írásra. Borzasztó olvasni és kihámozni mi kell. Rettenetes! A firmware (és nem filmware) az nem a forráskód hanem a beágyazott rendszerek és úgy komplettül a processzoros áramköröknél a processzor bináris programja. Sok esetben ez nem IntelHEX formátum, mert bootloaderrel történik a betöltés. Bin fájlt maximum assemblybe lehet kódolni. Assembly-t bas-ba már lehetetlen értelmezhető kódként. Ha egyáltalán lehet. Hozzászólásod 8 sor, abban kb. 50 helyesírási hibát vétettél. Ha segítséget szeretnél kapni, tiszteld meg a többieket az írással, nem holmi idehányt szöveggel. Ebből még azt is nehéz kiszedni, mit akarsz. Köszönöm megértésed.
Nem sokkal korábban csatolta valaki az alábbi doksit:
"AVR035 Efficient C Coding for AVR" (doc1497.pdf) Ebben is, egyéb tippek mellett említik, amit Topi ír. (dekrementálás tipp kisebb és gyorsabb kódhoz) Ajánlom mindenkinek, tanulságos dolgok vannak benne, nem hosszú, hamar átrágod rajta magad. (de angol) |
Bejelentkezés
Hirdetés |