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   399 / 840
(#) zsozsoX válasza sikolymester hozzászólására (») Jan 9, 2012 /
 
A harmadik állás a kikapcsolt állapot lenne. A zéneres megoldást össze raktam 10k ellenállással igaz nem volt rajta még a kontroller de így 5v alatt mértem a feszültséget. Egy órát akarok ami egyik állásban előre másik állásban vissza felé jár.
(#) sikolymester válasza zsozsoX hozzászólására (») Jan 9, 2012 /
 
Értem, de felhívom a figyelmed, hogy a bemenetek binárisak, így csak 2 állapotot tud értelmezni, tehetsz mögé bármilyen furfangos dolgokat is.

Kettőnél több állapot olvasására AD bemenet kell neked. Természetesen lehet trükközni azzal, hogy hogyan tudsz egy digitális bemenettel is több állapotot értelmezni (kondenzátor kisütés ideje pl.).

Azért kérdeztem, hogy mit szeretnél csinálni, mert gondoltam hátha tudunk mondani egy már általunk sikeresen használt dolgot erre.

Az óra az a végeredménye az egész projektnek, ha jól értem.

A 3 állású kapcsoló funkciója mi lenne pontosan (már persze azon kívűl, hogy 3 állása van és az állapotokat olvasni akarod valahogy)? Arra vagy kíváncsi, hogy milyen feszültségről üzemel éppen? Mert ha jól rémlik, az a kapcsoló egyben valami táp IC-t babrált.
(#) sikolymester válasza norbigal hozzászólására (») Jan 9, 2012 /
 
Nos, érdekesnek tűnik a tényállás. Ez a doksi azt állítja, hogy az ispmk2 kompatibilis a AT89S52 -vel, ráadásul az AVRStudio4 -ből. Ellenben az én Studio4.18 SP3 -ban nem szerepel a helpben az ispmk2 támogatott eszközei között.

Ez a doksi szintén utal arra, hogy képes programozni az AT89S52 mikrokontrollert, csak megjegyzi, hogy annak aktív magas a resete, ami egy bizonyos paranccsal állítható.

Ami a reset problémáját illeti: odateszel egy invertáló tranzisztort, aztán csókolom.

Ami azt illeti, hogy akkor hogyan tudod programozni. Nos én feltételezem, hogy az ATMEL annyival fúrta fel a kvázi szabványos 8051-est, hogy van benne egy flash progamozási felület az AVR-eknél is látott MOSI MISO SCK RESET felállással.
Én úgy vélem, hogy ha van egy helyes .hex-ed, amit már csak be kellene varázsolni az AT89 -esedbe, akkor az édes mindegy az ISPMK2-nek, hogy mi van a túlsó végén a zsinornak. Szépen elküldi rá az adatot, ahogy az illik.
Egy gond lehet, mégpedig, hogy a törlés parancs vajon mi?

Összefoglalva: Elméletileg a hardvered képes arra, hogy felprogramozza a 8051-esed. Szoftvert kellene találni hozzá. A Reset lábát invertáld.

Szerintem 8051-esre nem fordítasz programot AVRStudioval. Az ATMEL addig rendben van, hogy kiadott 8051-est, csak abban nem AVR core van. Az AVRStudio a nevével egyből elárulja, hogy nem erre van.

Én is a Keilt javaslom. Szerintem nekik van rá fordítójuk. De ha már 8051, akkor a Silabs ebben nagyágyú. Van olcsó debuggerük, ami elég penge. Inkább velük 8051-eznék én.
(#) szdani hozzászólása Jan 9, 2012 /
 
Ha belső rc-t használok ATTiny45 nél akkor a fuse biteken kell valamit állítani?
(#) sgt válasza szdani hozzászólására (») Jan 9, 2012 /
 
Alapból a belső rc-t használod . Lehetőséged van 1, 2, 4, és 8 MHz között választani.
(#) szdani válasza sgt hozzászólására (») Jan 10, 2012 /
 
Köszönöm a segítséget
(#) Kovidivi hozzászólása Jan 10, 2012 /
 
Sziasztok!
Életem első AVR-jét szeretném a napokban beégetni. USB-s infravevő lesz, Girder programhoz. Vettem AT90S2313-at. Beégetni a fenti link alapján szeretném, az oldal alján van egy leírás. Írt az oldal szerzője egy programot, amit elindítva, az AVR-t az LPT portra így csatlakoztatva, beégeti egymagában. Zoli-tól megtudtam másik topicban, hogy 6V-nál többet nem tolerál az AVR. Az LPT portról biztosan nem fog 5V-nál nagyobb feszültséget kapni? Esetleg jobban járnék, ha külső tápról adnék a VCC lábra +5V-ot? Szerintetek megbízható ez a módszer? Mármint arra gondolok, hogy ha elsőre nem is sikerül beprogramozni, kapok-e még esélyt, ugyan annál az AVR-nél? Köszönöm a válaszokat!
(#) sikolymester válasza Kovidivi hozzászólására (») Jan 10, 2012 /
 
Szerintem építsd meg az stk200 -at. Az széleskörűen támogatott programozó. A linken láthatót az oldal írója dobta össze és írt egy programot hozzá. Szerintem, ha már építesz egy ltp programozót, akkor az stk200-zal jársz a legjobban, mert akkor később rengeteg ISP-s AVR-hez lesz programozód.

Az stk200 működik AVRdude-dal, vagy esetleg a chipblasterrel is (ennek az ingyenes változata kódkorlátos, de ez a girder hex file például a limit alatt van). Mindkettő rengeteg AVR-t támogat az stk200-zal.

Korábban volt linkelve egy stk200-as itt a fórumon. Létezik bufferelt változata, ehhez kell egy IC, illetve van olyan, ahol csak ellenállások vannak a kapcsolásban.
(#) norbigal válasza sikolymester hozzászólására (») Jan 10, 2012 /
 
Zombee és sikolymester!
Köszi a válaszokat. Kitudakoltam, hogy a programozóm ismeri az AT89S52-höz szükséges reset láb vezérlést, szóval ilyennel szerencsére nem lesz gondom. Hétvégén szerintem bepróbálkozom egy XE251 környezetben írt assembly programmal és az AVR Studio-n keresztüli beégetéssel. Majd csak kisül belőle valami használható...
(#) Kovidivi válasza sikolymester hozzászólására (») Jan 10, 2012 /
 
Köszi.
Gondolkodtam már azon, hogy építek égetőt, és a Topi féle USB-set nagyon jónak találtam. Csakhogy fél éven belül biztosan nem fogok égetni másik AVR-t. A legnagyobb gond, hogy még nem rágtam magam bele a program beállításokba, a fuse bit-ek jelentőségébe, stb. . Így ha elkészítem az STK200-at (megnéztem, nagyon egyszerű kapcsolás), akkor annak is utána kellene néznem, hogy milyen beállításokkal égessem az AVR-t (plusz egy hibalehetőség, ahol elronthatom). Viszont erre nem lustaság miatt, de sajnos nem lesz időm (egy labortáp is összerakásra vár).
Szerintem megpróbálom égetőprogram nélkül, ahogy a szerző ajánlja, aztán ha nem sikerül, akkor STK200 lesz belőle, valami égetőprogrammal. De szurkoljatok, hogy az első verzió sikerüljön! Szeretném a programmal való égetést valami jó HE-s cikk alapján próbálgatni a későbbiekben
(#) alex01 hozzászólása Jan 10, 2012 /
 
Sziasztok!szeretnék,egy pde-fájlt beleírni,egy atmega 328-ba.milyen programozó kell hozzá?
(#) Tomi_Bp hozzászólása Jan 10, 2012 /
 
Sziasztok! Volna egy problémám, amin már agyalok egy ideje, de sajnos egyedül úgy néz ki, nem fogom tudni megoldani belátható időn belül.
Van egy ATMega32-esem és van mellette egy DS1307-es RTC, aminek van elvileg "56-byte nonvolatile (NV)
RAM for data storage" nem felejtő memóriája. Az adatlapból jól látszik, hogy ez a memőria a 0x00H - 0x07H -ig terjedő RTC regiszterek mögött kapott helyet 0x08h -tól ox3fh -ig.
Olvastam valahol, hogy sokaknak nem volt írható a 0x08 regiszter (ismeretlen ok miatt, de ez most nem is fontos).

A probléma (még mindig a régi) a következő:
Szeretnék egy számlálót (001-től 255-ig is elég lenne már, csak működne) ami a program elején, még a végtelen ciklus elött beolvassa az értéket (az új verzió szerint már) az RTC memóriájából, hozzá ad egyet és elmenti a növelt értéket.
Valami miatt (nyilván azért, mert hülye vagyok, de) nem sikerül kiviteleznem.
Én így szerettem volna:
  1. i2c_start();
  2.    i2c_sendAddress(DS1307_W);  //0 b 1101 0000
  3.    i2c_sendData(0x09);  //ahová szeretném menteni a számlálóm értékét
  4.    i2c_sendData(data_w);  //a számláló
  5.    i2c_stop();


És kiolvasni:

  1. i2c_start();
  2.    i2c_sendAddress(DS1307_W);  //0 b 1101 0000
  3.    i2c_sendData(0x09);
  4.    i2c_repeatStart();
  5.    i2c_sendAddress(DS1307_R);  //0 b 1101 0001
  6.    data_r = i2c_receiveData_NACK();
  7.    i2c_stop();


  1. TX_NEWLINE;
  2.   transmitString(data_r);
  3.   if(data_r == data_w)
  4.   {
  5.     TX_NEWLINE;
  6.     transmitString_F(PSTR("counter RW OK..."));
  7.     TX_NEWLINE;
  8.   }
  9.   else
  10.   {
  11.     TX_NEWLINE;
  12.     transmitString_F(PSTR("counter RW FAILURED..."));
  13.     TX_NEWLINE;
  14.   }

Nyilván megint valami fatális félreértés következtében valami nagyot hibáztam, de mit is? Előre is köszi a segítséget!
(#) lokátoros válasza Tomi_Bp hozzászólására (») Jan 10, 2012 /
 
Szia,
Lehet akár táp probléma is. Ha nincs elem a Vbat bemeneten, (vagy gyenge) a RAM elfelejti a tartalmát, ha van elem, de Vcc < 1.25 * Vbat akkor a RAM irás- olvasás tiltva van.>
(#) Tomi_Bp válasza lokátoros hozzászólására (») Jan 10, 2012 /
 
Jelenleg nincs rajta elem (de a tápellátás folyamatos) mivel még nincs készen a cucc. Az RTC a fő funkcióját tökéletesen ellátja (be tudom állítani a dátumot, időt, le is tudom kérdezni, nem is késik nem is siet, csak valamiért nem megy a memóriájában való adat tárolás)
(#) lokátoros válasza Tomi_Bp hozzászólására (») Jan 10, 2012 /
 
Nem biztos hogy köze van hozzá de a
transmitString(data_r);
egy kicsit gyanúsnak tűnik. Gondolom karakter pointert vár, a data_r tipusa pedig char vagy int.
A fordító nem reklamált miatta?
(#) zombee válasza sikolymester hozzászólására (») Jan 10, 2012 /
 
Szerintem nem kell invertálni, az AVRISP-mkII beépítve tartalmazza a RESET láb polaritás választását.
A polaritást az égetőprogram(pl. AVR Studio 4) határozza meg amikor kiadja a parancsot(ENTER PROG. MODE).

Párszor már átnéztem a teljes LUFA forrást, látom ott is hogy a RESET polaritása bizony nem mindig a föld(GND),
bár egy jó darabig(egészen eddig) nem is értettem hogy mi a jó csudára való az a beállítás, most már tudom...
(#) sikolymester válasza zombee hozzászólására (») Jan 10, 2012 /
 
Tiszta sor, igazából ezt arra írtam, hogyha a klón nem támogatja a dolgot, vagy ha kicsit hekkelt üzemmódban akarja járatni (tehát pl avrstudio 4.18 alól teszem azt atmega8 -t beállítva, mivel úgy tűnik, hogy kivették a támogatást a 8051 esek programozását illetően).
(#) zsozsoX válasza sikolymester hozzászólására (») Jan 10, 2012 /
 
A három állású kapcsoló ilyen lenne Bővebben: Link, középen kikapcsolt állapot, egyik irányba és a másik irányba is zár. Úgyhogy lényegében nekem csak két állapot kell a egy bemeneten,azért hogy tudja az avr hogy előre számoljon, mert az egyes állásban van a kapcsoló. Vagy vissza felé, mert a kettes állásban van a kapcsoló.
(#) sikolymester válasza zsozsoX hozzászólására (») Jan 11, 2012 /
 
Ááá, így már érthető a kapcsoló.
(#) TavIR-AVR válasza alex01 hozzászólására (») Jan 11, 2012 /
 
Ez egy arduino forráskód.
www.arduino.cc oldalon a fordító.
(#) cirpo hozzászólása Jan 13, 2012 /
 
Hali!
ATmega8-at programozok kezdő szinten. Egy régi Nokia 3410-es kijelzőjével játszadozom itthon. Van egy kis programom ami bmp képeket átkonvertál hexa kóddá. Egy kép (102*65 pixeles) meg is tölti a 8K memóriát. Memória IC-t szeretnék az AVR mellé tenni és beleégetni a képek kódjait.
Adatot égetni a külső eeprom-ba (vagy flash-be) lehet az avr studio-n keresztül?
AVR-Doper, USB-s ISP programozóm van és AVR studio 5-öt használok.
(#) sgt válasza cirpo hozzászólására (») Jan 13, 2012 /
 
Azt nem tudom, de mi van akkor ha először egy olyan programot írsz, ami a külső eepromot tölti fel? Majd pedig ráégeted az eredeti programot.
(#) cirpo válasza sgt hozzászólására (») Jan 13, 2012 /
 
Mekkora ötlet!!! Ez nekem eszembe nem jutott volna...
Köszi!
Már csak szereznem kell egy eepromot és meg kell tanulnom használni.
Esetleg valaki tudna hozzá egy kis anyagot szolgáltatni....?
Vagy a legegyszerűbb az lenne ha vennék egy 64K-s ATmegát....
(#) zombee válasza cirpo hozzászólására (») Jan 13, 2012 /
 
Hello!

Egy kép ha 102x65, akkor az 6632 pixel, ami valóban megtölt 8K memóriát ha BIT-ben számolod. Bájtban ez már jóval kevesebb, 1K EEPROM-ba bőségesen belefér. Egy ATMega32 vagy ATMega328(ez utóbbi lábkompatíbilis az ATMEga8-al) 1K EEPROM-ot tartalmaz, tehát egy kép biztosan elfér bennük.

De én mondok mást: a képeket a programmemóriában(flash) is eltárolhatod ha nem akarod túl sűrűn cserélni őket! Ezt úgy teheted meg hogy ugye van a HEX kód, ezt egy jónagy tömbbe kell beletenned a kódban.
Ez AVR GCC esetén úgy néz ki hogy egy pgmspace(lásd: pgmspace.h) tömbváltozóba másolod(copy-paste), Assemblernél pedig a ".db"-t használd, de lehetőleg a programmemőria végére kerüljön és az utasításvégrehajtás ne fusson rá! Ja és vesszők is kellenek a hexa bájtok közé, esetleg 30-40 bájtonként sorokra tagolhatod. C-ben az egész kapcsos zárójelek közé kerüljön!
(#) cirpo válasza zombee hozzászólására (») Jan 13, 2012 /
 
Amit leírtál az nekem pont úgy van megcsinálva. Küldök egy .h-t a képről ami már tömbben van. Ez foglal sok helyet. Én nem tudom hogy most bájtba vagy bitbe számolja-e? Majd valaki eldönti.
(Ez csak a program egy kis része. Magát a programot innen valamelyik fórumból töltöttem le. )

main.h
    
(#) zombee válasza cirpo hozzászólására (») Jan 13, 2012 /
 
Hát ez "csak" 16x38x8 = 4864 pixel, valami még lemaradt mert 102x35-nek ez kb. a háromnegyede...
(#) ATtiny válasza cirpo hozzászólására (») Jan 14, 2012 /
 
Megnéztem a .h fájlt a képedről. Ha kevés a hely tömörítsed a képet. Nem egy bonyolult dolog írni egy nagyon egyszerű kitömörítőt. A képedben sok az üres pixel (0x00) ezzel még a legegyszerűbb RLE algoritmus is jó eredményeket ér el. De akár te is kitalálhatsz nagyon egyszerű tömörítést. Pl. ötlet: a képed adatai között nincsen 0xff -es bájt. Ezt a byte-ot felhasználhatod jelző byte -nak a következő módon:

pl: nyers adat:

0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x12

tömörített adat:

0xff, 0x00, 0x05, 0x10, 0x12

magyarázat:
A jelző bájt (0xff) utáni byte (0x00) a rákövetkező byte (0x05) -szor ismétlődik. Tehát 5db 0x00 után jön egy 0x10 majd 0x12

Remélem érthető mire gondoltam.
(#) zombee válasza ATtiny hozzászólására (») Jan 14, 2012 /
 
Ha jól emlékszem, a fax-oknál használt tömörítés az ideális(és egyszerű) az egyszínű pontmátrixos képhez.
(#) pogany.tamas hozzászólása Jan 14, 2012 /
 
Sziasztok,

Attiny2313-assal szeretnék egy szenzort kiolvasni (DHT22), ehhez mikroszekundumos várakozási időre lenne szükségem. Az Arduino forrásában találtam ilyet, kihajítottam belőle a 16 bites részt, most így néz ki:
  1. void delayMicroseconds(unsigned int us)
  2. {
  3. if (--us == 0)
  4. return;
  5. if (--us == 0)
  6. return;
  7. us <<= 1;
  8.  
  9. __asm__ __volatile__ (
  10. "1: sbiw %0,1" "\n\t" // 2 cycles
  11. "brne 1b" : "=w" (us) : "0" (us) // 2 cycles
  12. );
  13. }


Teszt alapján úgy tűnik, hogy a kód nem x, hanem x*10 mikroszekundumot vár, konkrétan ha mondjuk egy ledet bekapcsolok, és egy for ciklusban 1000 alkalommal várok 1000 mikroszekundumot, akkor 10 másodpercig ég a led. Mi lehet ennek az oka?
(#) Reggie válasza pogany.tamas hozzászólására (») Jan 14, 2012 /
 
Fuse biteknel a CKDIV8 be van kapcsolva.
Következő: »»   399 / 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