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   98 / 840
(#) Dancsi válasza HERC hozzászólására (») Jan 27, 2009 /
 
Hello!
Ilyen nincs! Én mindig csak memóriákat találok? Nagyon köszönöm a válaszokat. Meg fogom nézni azt az adatbázist, köszönöm.
Most néztem a panelt, amin volt ez a memória, és van mellette egy UA8560D (40lábas). Most nem kerestem hozzá adatlapot. Bocsi a hülye kérdésekért, de az se lehet vezérlő?
(#) HERC válasza Dancsi hozzászólására (») Jan 27, 2009 /
 
L8560 az különben egy Low-Power SLIC with Ringing
és 44 lábas PLCC tokozásban üldögél mindenféle
ISDN termiál adapterekben fellelhető cél ic.
Telefon kisközpont ..
Meg számodra van még egy jó ötletem:
AllDAtaSheet
Amit itt nem találsz az nem létezik vagy esetleg olyan
cél ic amit külön megrendelésre gyártottak és nem került közforgalomba ergo nincs adatlapja.
Aztán alul ami van egyezést fogod és bemásolod a
webforditas
-ba és megnyomod a fordít gombot.(pdfet azt hiszem még nem tudnak fordítani weben)Ebből kiderül hogy
nagyábból milyen icvel állsz szemben.
(#) Sir-Nyeteg válasza IMi hozzászólására (») Jan 27, 2009 /
 
Affene, és épp most felejtettem el arabul
Egyébként nagyon jó, köszi, elteszem ezt az oldalt!

Vettem egy atmega8-at, nem összeg, meg egy alfanumerikus kkijelzőt, csinálok a számoláshoz egy kis effektet Parasztvakítást
(#) Sir-Nyeteg hozzászólása Jan 28, 2009 /
 
Atmega8 pc6-os lábát nem bírom rávenni a működésre... Mint átírom pl a pc5-re, egyből megy a program. Kimenetként szerepel, mint a többi is.
Ez miért lehet?
Több procival is próbálkoztam
(#) Hooligan01 válasza Sir-Nyeteg hozzászólására (») Jan 28, 2009 /
 
Azért mert az a Reset láb is egyben...

Ha a fusebiteknél beállítod, máris használhatod I/O-nak, de ezzel a lépéssel megszűnik az ISP programozási lehetőség.
Ezután csak párhuzamos programozóval tudod programozni a kontrollert. (persze ha visszaállítod a fusebitet, ismét működik majd ISP módban is.)
(#) Dancsi válasza HERC hozzászólására (») Jan 28, 2009 /
 
Hello!
Ebből nem sokat értettem, de annyit kivettem, hogy ez se jó semmire. (max a szekrény lába alá, hogy ne billegjen ). Köszi azt az adatlapos oldalt, el is mentettem...
"amit itt nem találsz az nem létezik" ez jó, ezt megjegyzem.
Webfordítást szoktam használni, jó oldal.
Már csak egyet szeretnék kérdezni. (ha nem baj) Ilyen AVR-t, vagy PIC-et lehet találni bármilyen bontott elektronikai alkatrészben? Vagy csak rendelni lehet ezeket? Mert ha nem, akkor asszem egy ideig nem fogok álmodozni az égetésről, meg hogy vezérelni fogok valamit...
Köszi , üdv: JĐ
(#) HERC válasza Dancsi hozzászólására (») Jan 28, 2009 /
 
szerintem kisebb elektronikai boltban is pár száz
forintért lehet már kapni
(#) Sir-Nyeteg válasza Hooligan01 hozzászólására (») Jan 28, 2009 /
 
Köszönöm, ezt jó tudni. Erre nem gondoltam volna
Még egy Atmega8-as kérdés: programozás előtt be kell állítani AVRStudióban a frekvenciát, majd meg kell adni a processzornak is, hogy belső X megahertzes oszcillátort használjon. Én beállítottam mindkettőre 1MHZ-t, de ekkor egy 10ms-os időzítés 1másodpercként hat. Ez miért van, illetve hogyan állíthatom be, hogy ~valós delay-t kapjak?
Köszi!
(#) ATtiny válasza Sir-Nyeteg hozzászólására (») Jan 29, 2009 /
 
Gyárilag az Atmega8 1Mhz -es RC Oszcillátorra van konfigutrlálva, így ezzel nem sok tennivaló van. Ami szerintem neked elrontja az időzítéseket, az a kód optimazálás. Kapcsold a kód optimalizálást a projekt tulajdonságoknál "-O0" -ra. Ez minden optimalizálást kikapcsol. Ezáltal ha ciklusokkal akarsz késlelteni, akkor valóban anyi lesz e delay, amit előzőleg kiszámoltál. Bár jobban belegondolva, az optimalizáció általában röviditi a program futási idejét, így a szépen kiszámolt delayek rövidülni szoktak. Nállad meg hosszabb lett a delay... Mindenesetre egy próbát megér.
(#) Sir-Nyeteg válasza ATtiny hozzászólására (») Jan 29, 2009 /
 
Ahhá, köszönöm, ezt nem is tudtam, hogy mire való. Sajnos csak "-Os" optimalizációval fér bele a program az atmega8-ba
Kicsit túlbonyolítottam. Alfanumerikus kijelzőn minden egyes segmenst definiáltam egy kimenethez, és minden egyes betűt-számot definiáltam az előzőleg definiált segmensekkel.
Lehet ezt egyszerűbben is?
Tömbökre gondoltam, de azt nem tudom hogyan kell, pedig azt lehetne léptetni is for ciklussal is, és nem kéne mindet beírni, amit meg akarok jeleníteni
Ha valaki nagyon ráér, belekukkanthatna.
Egyedül az időzítés lenne a lényeg. ami jelenleg minden lefordításnál kicsit változik, illetve csak saccolható, és utólag kell "kalibrálni".

alpha.c
    
(#) ATtiny válasza Sir-Nyeteg hozzászólására (») Jan 29, 2009 /
 
Valóban nagyon túl bonyolítottad, mivel egyenként kapcsolod be minden egyes szegmentet. Ezt úgy kéne megoldanod, hogy az 1 Porthoz tartozó szegmenseket egyszerre kapcsolod be. Mivel B,C,D portot is használod, így 1db karakter eltárolásához kell 3db byte ha jólszámoltam 34 különféle karaktered van így összesen 34 * 3 byte = 102 byte kell az összes karakter eltárolásához. Mivel minden karakterhez 3 byte tartozik, így könyen tömbbe lehet őket rendezni és csak azt kell tudnod, hogy az adott karakterhez melyik az első byte. Akár az EEPromban is lehet ez a táblázat és akkor nem foglal semmi helyet a flash-böl.
(#) Sir-Nyeteg válasza ATtiny hozzászólására (») Jan 29, 2009 /
 
Portos megjelenítésre gondoltam én is, jelenleg csak 1.0 jelleggel ment a dolog, viszont jelenleg epromhoz még nem kostoltam hozzá, így az még sok-sok olvasást vár el tőlem. Na meg a tömbök is.
Jól hangzik amit írtál, meg egyszerűnek, remélem hétvégére már meg is értem majd
(#) ATtiny válasza Sir-Nyeteg hozzászólására (») Jan 29, 2009 /
 
Valami ilyesmire gondoltam:

  1. // Az egyes karakterek adatai
  2. //          PORTB,PORTC,PORTD
  3. #define S0D 0x00, 0x12, 0x30
  4. #define S1D 0x01, 0x12, 0x30
  5. #define S2D 0x05, 0x12, 0x30
  6. stb...
  7.  
  8. // Az egyes karakterek kezdő poziciói a tömbben
  9. #define S0  0
  10. #define S1  3
  11. #define S2  6
  12. stb...
  13.  
  14. #define MAXCHAR 34 //max karakter szám
  15.  
  16. void char_put(uint_8 char_id)
  17. {
  18.  uint_8 karaktertomb[3*MAXCHAR] = {S0D,S1D,S2D,stb...};
  19.  
  20.  PORTB = karaktertomb[char_id];
  21.  PORTC = karaktertomb[char_id+1];
  22.  PORTD = karaktertomb[char_id+2];
  23. }
  24.  
  25. int main(void)
  26. {
  27.  char_put(S0);
  28.  m_delay_10ms(10);
  29.  char_put(S1);
  30.  m_delay_10ms(10);
  31.  char_put(S2);
  32.  stb...
  33. }
(#) Sir-Nyeteg válasza ATtiny hozzászólására (») Jan 29, 2009 /
 
Ez nagyon jó
Köszönöm!
(#) Lucifer hozzászólása Jan 29, 2009 /
 
Nem tudja valaki véletlenül, hogy az AVRDUDE-al hogyan lehetne úgy programozni a FLASH memóriát, hogy mellette ne törölje az EEPROM-ot. A -D azaz a törlés megakadályozása esetén nem töröl semmit, így csak akkor jó, ha a program nagyobb. Azaz jónak lehet jó, csak nem tudhatom pontosra hogy sikerült e a programozás.
(#) szilva válasza Lucifer hozzászólására (») Jan 29, 2009 /
 
Nem az AVR-ben lévő egyik fuse bit mondja azt az AVR-nek, hogy a törlés az EEPROM-ra ne vonatkozzon?
(#) Ricsi89 hozzászólása Jan 29, 2009 /
 
Helló!Megcsináltam Topi cikkében lévő villogót, de nem igazán úgy megy, ahogy kellene. Villogni villog, de vagy 5 másodpercenként vált a led. Ez mitől van? Mindent úgy csináltam, ahogy a cikkben van.
(#) gerry válasza szilva hozzászólására (») Jan 29, 2009 /
 
Dehogynem, a "Fusebit High G" .
Ha "0", akkor megörzi az eeprom tartalmat.
Ha "1", akkor törli.
(#) Ricsi89 válasza Ricsi89 hozzászólására (») Jan 29, 2009 /
 
Megoldottam! A ponyprogban a config biteknél a clkdiv8-ból kivettem a pipát és megy is rendesen. Gondoltam, hogy valami az időzítéseknél lesz, de a lényeg, hogy rájöttem.
(#) Topi válasza Ricsi89 hozzászólására (») Jan 29, 2009 /
 
Pedig írva vagyon, hogy azt ki kell venni... Dehát hiába
(#) kavkar hozzászólása Jan 30, 2009 /
 
Üdv.
Volna egy kérdésem, hátha valaki látott már ilyet.
Egy vezeték nélküli szobatermosztáton ügyködök, haladgat a dolog de most kicsit megakadtam. atmega8.
az időmérés egy 32.768khz-s kvarcról megy, mégpedig a timer 2 asynchronous módjában, másodpercenként összegyűlik egy interrupt, közbe meg power save módban alszik az uc.
Az lene a gondom, hogy ha a timer 2 interruptot kikapcsolom akkor nagyon szépen bealszik és uAeket vesz csak fel.
ha a sleep módot kiveszem akkor nagyon szépen méri az időt, ahogyazt kell.
viszont ha bekapcsolom a sleep-et is meg a timer 2 interruptot is akkor megbolondul.. ekkor az áramfelvétel szerint nem altatja el magát, illetve még annyira jöttem rá hogy egyszer belép az interruptba, aztán utána "semmit" nem csinál, mintha megfagyna, nem reagál nyomkodós interrupra sem, semmi..
Valakinek vmi tippje?
csatolom a forrást, hátha az segít.
(#) Sir-Nyeteg hozzászólása Jan 30, 2009 /
 
Üdv!
Kérdés: hogyan lehetne megoldani a rövid-hosszú gomblenyomás szétválasztását egyetlen nyomógomb esetén?
Próbálkozok jelenleg is egy kóddal, de még nincs kész, esetleg van már valaki, aki próbált ilyet?
(#) kavkar válasza Sir-Nyeteg hozzászólására (») Jan 30, 2009 /
 
hát én valahogy így csinálnám, lehet h fapados, de akkor majd írnak jobbat
  1. unsigned char s=0;
  2. if (PORTX & (1<<PXY) == 0) //ha lenyomtak a gombot
  3. {
  4. while(1)
  5. {if (s == 40) //ettol fuggoen h mennyi a hosszu
  6.        { valami1(); break;}
  7.  else
  8.        {if (PORTX & (1<<PXY) == 0) {++s; _delay_ms(10);}
  9.          else {valami2(); break;}
  10.        }
  11.          
  12. }
  13. }
(#) kavkar válasza kavkar hozzászólására (») Jan 30, 2009 /
 
Válasz magamnak :
Az interrupt eljárás a program optimalizálatlansága miatt túl hosszú ideig fut, hosszabb ideig mint 2 interrupt meghívása közti idő, így sosem tudott elaludni és mindíg az interrupt közben jött az újabb interrupt.
(#) kavkar válasza kavkar hozzászólására (») Jan 30, 2009 /
 
Nah úgy tűnik korai volt az örömöm
félreértelmeztem a jelenségeket, nem a timer2 és a power save volt a fő felelős, hanem a power save és a i2c busz. most hogy visszaraktam az i2c-s hőmérést megint ugyanúgy megáll az élete.
ha nincs power save-be lépés akkor megy rendesen az i2c,
ha nincs i2c kommunikáció akkor megy rendesen a Pow. s.,
viszont ha elmegy aludni és utána vmikor kiszeretnék olvasni egy hőt az i2c-n akkor vége a dalnak.
Esetleg valaki ilyennel találkozott?
(#) kavkar válasza kavkar hozzászólására (») Jan 30, 2009 /
 
Válasz magamnak :
Úgy tűnik ez egy bug az avr i2c-jében. ha valaki hasonlót tapasztalna a megoldás a következő linken van:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=22549
(legalsó hozzászólás)
idemásolva brberie hozzászólását:

I reported this problem to ATMEL..
Taylor Cox
ATMEL AVR Technical Support
-------------------------------------------------------------------------------
AVR Support E-Mail mailto:avr@atmel.com
My solution is:
  1. TWCR &= ~(( 1 << TWSTO ) + ( 1 << TWEN ));
  2.   TWCR |= ( 1 << TWEN );


----
ergó ezt minden sleep mode után el kell játszani.
(ez volt 2004-be, úgy tűnik azóta se sikerült javítaniuk atmeléknek ezt a bugot. eh)
(#) ATtiny válasza Sir-Nyeteg hozzászólására (») Jan 30, 2009 /
 
Nagyon egyszerü kell egy timer ami mondjuk 100msec -enként lép 1-et. A program ciklikusan lekérdezi a gombot és ha az le van nyomva akkor elindítja a timert. Ha már fut a timer és lenyomva van a gomb akkor nem indítja ujra el a timert. Viszont ha fut a timer és nincs lenyomva a gomb, akkor a program leállítja a timer-t. A timer értéke fogja tartalmazni hogy hányszor 100msec ideig volt lenyomva a gomb. És azt már a te döntöd el milyen timer érték fölött számítod hosszú gombnyomásnak az eseményt. Remélem értehtő volt.
(#) Lucifer válasza szilva hozzászólására (») Jan 30, 2009 /
 
Köszönöm válaszaitokat, ez gyógyír problémámra.
Öröm boldogság
(#) icserny válasza ATtiny hozzászólására (») Jan 30, 2009 /
 
Nem lenne egyszerűbb így csinálni?
1. A timer mindig jár, s minden órainterruptnál ránéz a nyomógombra.
2. Ha a gomb le van nyomva, akkor megnövel egy számlálót.
Ha pedig fel van engedve, és a számláló nm nulla, akkor nullázzuk a számlálót.

3. Nullázás előtt azonban megnézzük, hogy mennyi is a számláló értéke, s ennek megfelelően küldünk egy eseményjelzőt (vagy beállítunk egy jelzőt) a főprogram számára, ami tugadtja, hogy rövid vagy hosszú nyomás történt. (A rövid nyomásnak is kellene egy limitet szabni, aminél rövidebb nyomás pergésnek számít és eldobandó)

4. A főprogram pedig figyeli az eseményjelzőket, s teszi, amit tennie kell.

(#) ATtiny válasza icserny hozzászólására (») Jan 30, 2009 /
 
Természetesen amit leirtam, az csak az alap elv. A te megoldásod már egy jobban kidolgozott koncepció. Ha én fognék neki a konkrét megvalósításához valószínű én is megszakításos rendszerben csinálnám, hogy a főprogramnak minél kevesebb gondja legyen ezzel.
Következő: »»   98 / 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