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   63 / 840
(#) huba válasza Topi hozzászólására (») Aug 10, 2008 /
 
Jó ötlet. Bár a bemenet ha illesztve van kondenzátorral akkor nemtudom hogy marad meg magas szinten, ki fogom próbálni.
(#) vicsys válasza huba hozzászólására (») Aug 10, 2008 /
 
Bővebben: Link
Ez nem az véletlenül? Nem megy jól a német, sajna.
(#) szilva hozzászólása Aug 11, 2008 /
 
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
(#) fecus válasza fecus hozzászólására (») Aug 11, 2008 /
 
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?
(#) geniuszf hozzászólása Aug 11, 2008 /
 
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ó.
(#) ft0mi hozzászólása Aug 13, 2008 /
 
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…
(#) Sallala hozzászólása Aug 13, 2008 /
 
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!
>>>>>>>>>>>>>>>>
(#) matrix64 válasza ft0mi hozzászólására (») Aug 13, 2008 /
 
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.
(#) matrix64 válasza matrix64 hozzászólására (») Aug 13, 2008 /
 
(#) tibi0531 hozzászólása Aug 13, 2008 /
 
Sziasztok!

Azt szeretném megkérdezni, hogy miért nem működik a
  1. #define P_WIDTH_1   (0.000625*F_CPU)       // 625us
definíció F_CPU=16MHz esetén, WinAVR 2007.01.22 alatt? Ha úgy definiálom, hogy
  1. #define P_WIDTH_1   10000       // 625us
akkor működik.
(#) Topi válasza tibi0531 hozzászólására (») Aug 14, 2008 /
 
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:
  1. #define P_WIDTH_1 ((F_CPU*625)/1000/1000)
(#) matrix64 válasza matrix64 hozzászólására (») Aug 14, 2008 /
 
itt a pontos megoldás,a struct bits-nél+ a macro

MYDEFS.H
    
(#) tibi0531 válasza Topi hozzászólására (») Aug 14, 2008 /
 
Köszönöm szépen a segítséget, így már működik.
(#) wg_kezdo hozzászólása Aug 15, 2008 /
 
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
(#) MaSTeRFoXX válasza wg_kezdo hozzászólására (») Aug 15, 2008 /
 
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
(#) wg_kezdo válasza MaSTeRFoXX hozzászólására (») Aug 15, 2008 /
 
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 .



(#) TavIR-AVR válasza wg_kezdo hozzászólására (») Aug 15, 2008 /
 
8051 chipmag, nem AVR.
Bar ebbol is van ISP feluletu. Bascom-51 segitsegevel bascicul is ert.

2k belso memoria van, azert az sokmindenre eleg.....
(#) wg_kezdo hozzászólása Aug 17, 2008 /
 
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.
(#) Topi válasza wg_kezdo hozzászólására (») Aug 17, 2008 /
 
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.
(#) Dudus válasza wg_kezdo hozzászólására (») Aug 17, 2008 /
 
Nézz itt szét.

Sokan kezdenek demo panellel és ezek nem rosszak.
(#) wg_kezdo válasza Topi hozzászólására (») Aug 18, 2008 /
 
Köszi, így már könnyebb lesz, be is raktam a kedvenceim közé .
(#) wg_kezdo válasza Dudus hozzászólására (») Aug 18, 2008 /
 
Pontosan ezt keresem már vagy 10 éve csak akkor még nem tudtam, hogy van olyan, hogy PIC, AVR.
(#) fecus hozzászólása Aug 18, 2008 /
 
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?
(#) Topi válasza fecus hozzászólására (») Aug 18, 2008 /
 
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:
  1. void my_delay(uint8_t del) {
  2.   uint8_t i;
  3.   for(i=0;i<del;i++) {
  4.     _delay_ms(1);
  5.   }
  6. }


Vagy választod a jobb módszert:

  1. void my_delay(uint8_t del) {
  2.   while(del--) _delay_ms(1);
  3. }


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.
(#) szilva válasza Topi hozzászólására (») Aug 18, 2008 /
 
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.
(#) Topi válasza szilva hozzászólására (») Aug 18, 2008 /
 
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.
(#) szilva válasza Topi hozzászólására (») Aug 18, 2008 /
 
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?
(#) 987654321 hozzászólása Aug 18, 2008 /
 
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
(#) Topi válasza 987654321 hozzászólására (») Aug 18, 2008 /
 
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.
(#) Sallala válasza Topi hozzászólására (») Aug 18, 2008 /
 
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)
Következő: »»   63 / 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