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   523 / 839
(#) tursaba válasza csdominik hozzászólására (») Márc 5, 2013 /
 
Attól még nem biztos, hogy jó a 2 x 47pF !.
Az IC. adatlapja sem mond többet 22pF-nél, 16MHz esetén.
2 db fix 22pF-el ki kellene próbálni.
(#) zombee válasza csdominik hozzászólására (») Márc 5, 2013 /
 
Trimmer??? Mióta?
47pF már "megfogja" a kristályt, nem tud berezegni.
Nézd csak meg jobban az adatlapot, vagy keress rá guglin hogy kell bekötni a 2x22pF kondikat!
(#) eyess válasza csdominik hozzászólására (») Márc 6, 2013 /
 
Ez csak frissítés kérdése bármely Atmega típusú processzor gyári adatait be lehet írni a műveletet végző jelen esetbe Atmega8 ba , és ettől kezdve tudni fogja azt is.
De egyébként volt rá példa , hogy az említett órajel generátor sem segített , de a fuse bit doktor igen .
(#) sikolymester válasza csdominik hozzászólására (») Márc 6, 2013 /
 
Tévedsz.
Támogatja. HVPP fusebit doctor
(#) kiborg hozzászólása Márc 6, 2013 /
 
Sziasztok!
Van egy 128x64-es kijelzőm. Szeretném tárolni a kijelző képet egy Mega16 memóriájában, elméletileg ugye az SRAM pont elég is lenne a célra. Viszont ugye elég nagy probléma, hogy az SRAM végén tárolja a visszatárási címeket. Milyen megoldás lehetséges arra, hogy mégis elérhető legyen a teljes 1024 byte-nyi memória, de mégis lehessen használni is a megszakításokat, szubrutinhívásokat, stb...
Lehetőleg nem szeretnék külső memóriát használni.
A programmemóriát lehet ilyen tárolási célra használni? Tudja írni/olvasni a saját programmemóriáját?
Kiborg
A hozzászólás módosítva: Márc 6, 2013
(#) sikolymester válasza kiborg hozzászólására (») Márc 6, 2013 /
 
Gondolom nem tükrözni szeretnéd a kijelző képpontjait az SRAM-ba, hanem előre elmentett képeket akarsz kitenni AVR-ről a kijelzőre. Ha az utóbbi igaz, akkor nézz itt körül: Progmem
A hozzászólás módosítva: Márc 6, 2013
(#) kiborg válasza sikolymester hozzászólására (») Márc 6, 2013 /
 
Az lenne a célom, hogy adott képet megrajzolok gyorsan a memóriában, (pl: sok vonal, kör, stb), majd egyszerre kirajzolom a kijelzőre (tehát tükör lenne) , mivel egy-egy gyorsan megvan, de egy alakzatnak viszont sok pontja vagy, így sok időbe kerül, amíg ki tudom rajzolni. Remélem érthetően fejeztem ki magam.
ui: közben meg rájöttem, hogy ilyenre a program memória nem használható a véges írási ciklusszám miatt, tehát maradna az SRAM, de hát ott meg a verem....
A hozzászólás módosítva: Márc 6, 2013
(#) sikolymester válasza kiborg hozzászólására (») Márc 6, 2013 /
 
Hát igen, a programmemóriát hamar lerongyolnád.
Ha jól értem, akkor 1024 byte SRAM -od van összesen, és minden byte-ra szükséged lenne, hogy grafikát generálj benne.

Röviden: Lehetetlen.

Hosszabban: Ha a linker scriptet átírod, nem használsz egyáltalán függvényhívásokat, akkor esetleg megoldható. Persze assemblyben kellene megírnod a programod.
(#) kiborg válasza sikolymester hozzászólására (») Márc 6, 2013 /
 
Akkor jól gondoltam sajnos.
Assemblyben nyomom, szóval el nem gond. Na de hogy ne használjak függvényhívást, ne legyen szubrutinom, és MEGSZAKÍTÁSOM sem, az már viszont túl sok áldozat
Valami kici occó SPI-s memóriát tudsz ajánlani ?
(úgy néz ki, hogy nincs más megoldás)
(#) csabeszq válasza kiborg hozzászólására (») Márc 6, 2013 /
 
Nem érdemes LCD kijelző tartalmat az SRAM-ban tárolni.

Én az SRAM-ban nem a tartalmat tárolom, hanem hogy hogyan kell azt reprodukálni.
Vannak callback függvények, amik egymás után meghívódnak és felépítenek egy 8x8-as cellát.

Ha kiraksz egy sprite-ot/szövegdobozt/keretet valahova, akkor az összes 8x8-as cella, ami érintve van, újra lesz számolva.

Több callback is van: az egyik grafikát rak ki, a másik keretet, a harmadik szöveget,...
Ha érvénytelenítesz egy cellát, akkor az összes callback egyesével meghívódik.

Kb. 0 memóriafogyasztással csináltam ablakozást.

A program memóriára 10.000 írás van garantálva, az EEPROM-ra 100.000. Relatíve gyorsan haza fogod vágni, ha erre használod. És arról még nem is beszéltünk, hogy ez mennyire lassú lenne...
A hozzászólás módosítva: Márc 6, 2013
(#) csabeszq válasza csabeszq hozzászólására (») Márc 6, 2013 /
 
Egyébként a Mega32 pin kompatibilis a Mega16-tal és 2k memóriája van. Elfér benne 128x64 és még 1k marad is.
(#) kiborg válasza csabeszq hozzászólására (») Márc 6, 2013 /
 
Szia!
Ez is megoldás, bár sajnos ilyen chipem nincs itthon
Az a gond, hogy a kijelzőn nem egyesével lehet kapcsolni a pontokat, hanem 16-osával. Ergó ha csak egy pontot kapcsolok be (mondjuk a 15.-t a többi meg 0) és be szeretném kapcsolni a 12. pontot, akkor tudnom kell, hogy a 15. is be van kapcsolva, ezt vagy kiolvasom a kijelző memóriájából(ami sok idő) vagy csak memóriában írom át (így megspórolok egy olvasást).
Egyébként egy ST7290-es vezérlővel dolgozom. Nem túl gyors jószág
(#) csabeszq válasza kiborg hozzászólására (») Márc 6, 2013 /
 
Ha van olyan része a képnek, ami mindig ugyanaz, akkor azt nem kell letárolnod (logo, üres rész,...). Ezzel nyersz annyit, amennyi a stacknek elég lesz. A globális változókat meg regiszterekben tárold.

Az r2-r15-ig lehet regisztereket használni változónak, r2-től indulj felfelé.

  1. register uint8_t var asm("r2");
  2.  
  3. void add_to(uint8_t local)
  4. {
  5.    var += local;
  6. }
(#) kiborg válasza csabeszq hozzászólására (») Márc 6, 2013 /
 
Univerzálisat szeretnék, amit csak egyszer kell jól megírni, a teljes területet lefedi.
ASM-ben programozok, mindent regiszterekben tárolok
Tudsz esetleg valami jó kis RAM-ot, ami kici occó 5V-os és SPI-s.
Elég kritérium
(#) csabeszq válasza kiborg hozzászólására (») Márc 6, 2013 /
 
Most univerzális, vagy egyedi megoldást akarsz?

Ha univerzálisat, akkor felejtsd el az Atmega16-ot. Ha egyedit, akkor meg Atmega16-ra optimalizáld szét az egészet, hogy 1k-ba beférjen 1k + stack.

Atmega16 (DIP-16Mhz) - 1225 Ft
Atmega32 (DIP-16Mhz) - 1525 Ft

A teljes különbség DIP esetén árban 300Ft, más tokozásnál még ennél is kevesebb!
Ha már vásárolni kell, akkor az Atmega32 legyen RAM helyett, legalábbis szerintem.
A hozzászólás módosítva: Márc 6, 2013
(#) Csépe Zoltán hozzászólása Márc 6, 2013 /
 
Mitől lehet, hogy winavr-rel az alábbi hiba üzenetet kapom, úgy hogy minden h fájl be van includolva?

main.c: In function 'main':
main.c:10: error: 'DDRA' undeclared (first use in this function)
main.c:10: error: (Each undeclared identifier is reported only once
main.c:10: error: for each function it appears in.)
main.c:11: error: 'PORTA' undeclared (first use in this function)
make.exe: *** [main.o] Error 1

Process Exit Code: 2
(#) sikolymester válasza Csépe Zoltán hozzászólására (») Márc 6, 2013 /
 
Rossz MCU define van valahol, valszeg a makefileban. Emiatt nincsen DDRA, mivel olyan ioxxx.h filet includeolt a precompiler, amiben nincsen DDRA.
(#) Csépe Zoltán válasza sikolymester hozzászólására (») Márc 6, 2013 /
 
Az mcu jól van beállítva, olyan mintha egyáltalán nem látna h fájlokat.
(#) inci88 hozzászólása Márc 6, 2013 /
 
Sziasztok!

Adott egy attiny2313 ami felprogramozásra került, és a fusebit-ek úgy lettek beállítva, hogy külső kvarcról kapjon órajelet.

Ez azt jelenti, hogy kvarc nélkül nem tudom újraprogramozni, sem pedig a "chip id"-jét kiolvasni a programozómmal?

(A régi kapcsolás, panel már nincs meg, szeretném másra használni a uC-t.)
(#) sikolymester válasza inci88 hozzászólására (») Márc 6, 2013 /
 
Igen, azt jelenti.
(#) inci88 válasza sikolymester hozzászólására (») Márc 6, 2013 /
 
És ha sejtelmem sincs, hogy mekkora kvarc volt eredetileg, akkor mekkorát tehetek oda biztonsággal?
(#) sikolymester válasza inci88 hozzászólására (») Márc 6, 2013 /
 
Legegyszerűbb ha betartod amit az adatlap mond.
Szerintem 1Hz -től 16MHz -ig mehet minden.
A hozzászólás módosítva: Márc 6, 2013
(#) inci88 válasza sikolymester hozzászólására (») Márc 6, 2013 /
 
Köszönöm a segítséget, működésre bírtam! (5Mhz kvarc/10p kondikkal)
(#) sikolymester válasza Csépe Zoltán hozzászólására (») Márc 6, 2013 /
 
Akkor valami elérési gond lesz.
PATH meg lett adva helyesen?
Szóköz van a WINAVR telepítési útvonalában?
(#) szdani hozzászólása Márc 6, 2013 /
 
Hali,
írtam egy olyan programot amiben egy atmega 168 3 pwm csatornáját szabályozom, és kiírom egy 3310-es kijelzőre. Proteusz szimulátorban tökéletesen működik, de a megépített hardverben nem csinál semmit. A hardver tuti működik, ha kitörlöm a progiból a másik 2 csatorna szabályozását akkor jó. Mi lehet a hiba?

rgbdriver.zip
    
(#) Csépe Zoltán válasza sikolymester hozzászólására (») Márc 6, 2013 /
 
Igen az elérési út volt a gond. Köszönöm a segítséget.
(#) icserny hozzászólása Márc 7, 2013 /
 
Az E-bay kínálatában figyeltem fel a Meduino Nano Enhancement kártyára, amely dugaszolós próbapanelhez ideális. Van ATMega 168 és 328-as változata is (természetesen benne van a bootloader).

Jellemzői közül kiemelésre érdemes, hogy 3,3 V és 5 V között átkapcsolható. Van az alján egy FTDI USB-UART protokol konverter is, amellyel a programletöltés egy kattintással végezhető (az #RTS kimenet egy 100 nF-os kondival rá van kötve a RESET lábra, így nem kell nyomkodni a RESET gombot.) A PWR, RX, TX ledek mellett a D13-as lábra is csatlakozik egy negyedik LED. Kezdéshez szerintem kitünő (és viszonylag olcsó) eszköz. Arduino IDE beállításánál "Arduino Nano" nevet kell kiválasztani a Tools/Board menüben.
A hozzászólás módosítva: Márc 7, 2013
(#) csabeszq hozzászólása Márc 8, 2013 /
 
Egy avr-gcc kérdésem lenne:

Logikai jelanalizátoron dolgozom és minden órajelciklus számít. Minél gyorsabban fut le az interrupt, annál gyorsabb jelváltozásokat is észlelni tudok. A jelenlegi interrupt 32 ciklus alatt lefut, amiből 7 ciklus az interrupt meghívása.

4 ciklus az interrupt hívás, amit egy 3 ciklusos JMP követ (atmega328P) az interrupt táblában. Ha ez JMP helyett RJMP lenne, akkor nyernék egy órajelet. A kérdés, hogy el lehet-e érni, hogy a fordító az interrupt táblában RJMP-t használjon JMP helyett?
(#) zombee válasza csabeszq hozzászólására (») Márc 8, 2013 /
 
ahova a jmp megy, oda tégy rjmp-t, és utána egy nop-ot.
(#) csabeszq válasza zombee hozzászólására (») Márc 9, 2013 /
 
Az elvet én is tudom, csak ezt az avr-gcc-nek eddig nem sikerült elmagyaráznom.



Ha bővebben ki tudod fejteni, hogy az interrupt vektor tábla allokálását hogyan vehetem át a C-től, jó lenne.
A hozzászólás módosítva: Márc 9, 2013
Következő: »»   523 / 839
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