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   403 / 840
(#) neogeo2 válasza possim hozzászólására (») Jan 30, 2012 /
 
(#) szdani hozzászólása Jan 30, 2012 /
 
Sziasztok!
Egy olyan kapcsolást szeretnék létrehozni hogy az AVR-em olvassa a memóriakártyáról az adatot és megjeleníti egy alfanumeratikus kijelzőn.(csak szöveget) Ezt hogy tudom létrehozni mert nemigazán találtam ilyet. De van 3310-es kijezőm is. valaki tudna benne segíteni hogy merre nézzek körül?
(#) kiborg hozzászólása Jan 30, 2012 /
 
Hali!
AVRStudio 4.14-et használok, asm-ben programozok.
Fordítás után dob egy ilyen hibaüzenetet hogy : warning: .cseg .db misalignment - padding zero byte miért csinálja? Tudom, hogy mi az oka.De hogy lehet kiküszöbölni? A programmemóriában(code segment) hoztam létre egy adatbázist a .db direktívával. Ha ezeket kiszedem nincs hiba, vagy ha az adatmemóriában(data segment), akkor sincs hiba, csak akkor nekem kelle manuálisan léptetni a számlálót, meg kiszámolni, hogy hogy és mint, így viszont:
  1. ldi ZL, low(2*D68464_data)
  2. ldi ZH, high(2*D68464_data)
  3. D68464_data:
  4. .db "D68468  3100 RPM",0

Megadja a táblázat elejét és elég a következő elemre hivatkoznom.
Üdv Kiborg
(#) zolee1209 válasza kiborg hozzászólására (») Jan 30, 2012 /
 
Az idézőjelek között 16 karakter van, miért kell utána a nulla?

szerk.: Szerintem a nulla nem kell, azt kitörölve nincs warning...
(#) kiborg válasza zolee1209 hozzászólására (») Jan 30, 2012 /
 
Mert az LCD több soros és így jelzem, hogy adott sornak vége.(tudom lehetne úgy is, hogy 16ig számolom a karaktereket, de így elsőre egyszerűbbnek tünt) Meg másrészt van olyan is, ahol nem 16 karaktert íratok ki.
Jelzőbyte
Másrészt, ha 1 re cserélem, akkor is reklamál ugyanazzal az üzenettel.
(#) zolee1209 válasza kiborg hozzászólására (») Jan 30, 2012 /
 
Persze, hogy reklamál, mivel a code segment-be csak páros számú bájtot írhatsz be.

Ha tudod, mi az oka, akkor ki is tudod küszöbölni: Írsz utána még egy bájtot...
(#) kiborg válasza zolee1209 hozzászólására (») Jan 30, 2012 /
 
Igen, köszi
Közben már én is rájöttem
Csak már nem lehet módosítanom az előző hozzászólást.

If the DB directive is given in a Code Segment and the expressionlist contains more than one expression, the expressions are packed so that two bytes are placed in each program memory word. If the expressionlist contains an odd number of expressions, the last expression will be placed in a program memory word of its own, even if the next line in the assemby code contains a DB directive. The unused half of the program word is set to zero. A warning is given, in order to notify the user that an extra zero byte is added to the .DB statement.

Magyarul 2 bájtosan van tárolva és a figyelmeztetés azért van, hogy ő automatikusan feltöltötte az utolsó helyet 0-val.
Mi mindenre képes a súgó

Annyira triviális volt a megoldás, hogy nem esett le elsőre.
(#) blackdog hozzászólása Jan 30, 2012 /
 
Sziasztok!

Most ismerked az AVR-el.
Bővebben: Link
Ezt a programot próbáltam ki igaz Atmega168-on, de működik nem is ezzel van a gondom.
A készítő nem fűzött hozzá túl részletes leírást és én a következő sorokat nem értem pontosan, hogy miért, mihez, honnan az érték.

  1. void Init(void) {
  2.  
  3. //----------------------------------------------------
  4.  
  5.            TCCR0B |=  (0<<CS02)  
  6.                         |  (0<<CS01)
  7.                         |  (1<<CS00);
  8.  
  9.           TIMSK0     |= (1<<TOIE0)

Valamint:
  1. //----------------------------------------------------
  2.  
  3. SIGNAL(SIG_OVERFLOW0) {
  4.  
  5. //----------------------------------------------------
  6.  
  7.            TimerCounter--;
  8.  
  9.            if(TimerCounter==0) {  
  10.  
  11.                R_counter = R_duty;
  12.                G_counter = G_duty;
  13.                B_counter = B_duty;
  14.      
  15.                PORTB     |= (1<<PINB0)
  16.                           |     (1<<PINB1)
  17.                         |    (1<<PINB2);
  18.            }    
  19.  
  20.            if(R_counter) R_counter--;
  21.            if(G_counter) G_counter--;
  22.            if(B_counter) B_counter--;
  23.  
  24.             if(R_counter==0) PORTB &= ~(1<<PINB0);
  25.            if(G_counter==0) PORTB &= ~(1<<PINB1);
  26.            if(B_counter==0) PORTB &= ~(1<<PINB2);
  27. }
(#) kiborg válasza blackdog hozzászólására (») Jan 30, 2012 /
 
Szia!

A TCCR0B és a TIMSK egy egy regiszter(annak hívják?) ami tárolja, hogy az adott periféria hogyan működjön. Ezek az időzítőkre vonatkoznak. Ha megnézed az adatlapot, látni fogod, hogy a TCCR0B-ben van CS02,CS01 és CS00 bit, ami az órajelforrását/előosztást állítja be. A TIMSK meg interrupt engedélyezés talán.
A többi meg adódik a C nyelvből.
Konrétan melyik értékre vagy még kíváncsi,mert az alsó kódrészletben legalább 7 változót számoltam meg.
Üdv Kiborg
(#) kiborg válasza kiborg hozzászólására (») Jan 30, 2012 /
 
Akkor viszont újfent egy kérdés:
Miért kell oda a kétszeres szorzó a tábla neve elé?
Kiborg
(#) blackdog válasza kiborg hozzászólására (») Jan 30, 2012 /
 
Megnéztem az adatlapot és megtaláltam az időzítés leírását csak nem tiszta teljesen.
(#) Dudus válasza kiborg hozzászólására (») Jan 30, 2012 /
 
A kétszeres szorzás nem más mint balra léptetés 1 helyiértékkel. Miért kell ez? Mert az adatok 16 biten tárolódnak. A Z-be beolvasott címet el kell balra egyel tolni és a legkisebb helyiértékü biten lévő 1 vagy 0 jelzi, hogy a 16 bit alsó vagy felső 8 bitjét akarod - e beolvasni. Kb. fogd úgy fel, hogy a cím az 1-15 -ig biteken van és a 0. bit a cím alsó és felső 8 bitjét címzi.

"
Idézet:
„The program memory is organized in 16 bit words while the Z pointer is a byte address. Thus, the least significant bit of the Z pointer selects either low byte (ZLSB = 0) or high byte (ZLSB = 1).”
"
(#) blackdog válasza Dudus hozzászólására (») Jan 30, 2012 /
 
Őszintén szólva nem sokat értek abból amit írtál. Főleg azt nem, hogy honnan látod benne a 2x szorzást.
Bocs, de abszolút kezdő vagyok.
(#) sikolymester válasza possim hozzászólására (») Jan 30, 2012 /
 
Ez egy 8051-es mikrokontroller. A WinAVR nem fog segíteni rajta. Az AT89s52 egy atmel termék, de nem AVR. Ha szigorúan nézzük, akkor ez a topik sem neked való sajna.

Hacsak nem kiadott feladat, akkor szerintem használj inkább AVR-eket.
(#) Dudus válasza blackdog hozzászólására (») Jan 30, 2012 /
 
@kiborg ( bocsánat, neked akartam írni! Ezt a katyvaszt! Elnézést mindenkitől!)

Akkor nehéz dolgunk van

Nézd meg ezt az oldalt...

Láthatod, hogy amit a Z regiszterrel megcímzel az nem egyetlen bájt hanem egy szó ( 16 bit ), te innen olvasol be egy 8 bites regiszterbe.

Hogyan lehet ezt megtenni?

Úgy hogy a címet elmozgatod 1 helyiértékkel balra, így a 0. bit felszabadul. Ezzel a legkisebb helyiértékű, 0. bittel ki tudod választani, hogy az 1-15 -ös helyiértékkel megcímzett memóriaterületen lévő 16 bit hosszú szónak az alsó vagy a felső 8 bitjét olvasod be a memóriából egy regiszterbe.

Az a baj, hogy nem tudom máshogy elmagyarázni....próbáld ki, úgy talán szemléletesebb.
(#) kiborg válasza blackdog hozzászólására (») Jan 30, 2012 /
 
Szia!
Dudus azt nekem szánta
mondd el, hogy mi a nem tiszta és ha tudunk segítünk, csak tedd fel a kérdésed.

Dudus köszi a magyarázatot. Már értem.

Kiborg

Dudus te is kevered már a kérdezőket blackdog teljesen mást nem ért.
(#) blackdog válasza Dudus hozzászólására (») Jan 30, 2012 /
 
Igen. Elsőre nehéz felfogni, de minden kezdet nehéz. És, ha 13 évesen annó megtanultam Commoder64-en programozni akkor ez is menni fog. Igaz eltelt egy kis idő.
AvrStudio 5-t használok. Egyenlőre azzal is bírkózóm mert jó lenne, ha látnám debug közben a változók/regiszterek értékének módosulásait és ezek hatását.
Keresgéltem a neten ennél egyszerűbb kódot RGB led-re, de nem találtam csak jóval komplexebbeket.
(#) blackdog válasza kiborg hozzászólására (») Jan 30, 2012 /
 
Bakker
Hát ezért nem értettem, hogy hol lát nálam Z regiszter-t.
Szeretném sorról sorra pontosan megérteni annak a kódnak a működését.

És elnézést, de én kevertem össze a hozzászólásokat. Rosszra válaszoltam!
(#) kiborg válasza blackdog hozzászólására (») Jan 30, 2012 /
 
Szia!

A második rész akkor hajtódik végre, amikor a számlálód túlcsordul, azaz eléri a 255-t és átvált 0-ba. Ez generál egy megszakítást.
Csökkenti TimerCounter értékét és ellenőrzi, hogy TimerCounter értéke egyenlő-e nullával, ha igen, akkor a színekhez tartozó számlálót alaphelyzetbe hozza és a kimeneteket beállítja. HA NEM egyenlő 0-val, akkor a színekhez tartozó értéket is csökkenti és ha az adott színhez tartozó számláló eléri a 0-t, akkor azt a színt lekapcsolja.
Kb ennyi. Remélem érthető.
Üdv Kiborg

Jut eszembe, milyen AVR-t is használsz és milyen programozóval ?
(#) blackdog válasza kiborg hozzászólására (») Jan 30, 2012 /
 
Atmega168.
STK500 programozóm van, de nem azt használom, hanem AVR-Duino panelen tesztelgetek.

Jut eszeme:
Ha én ebből kész nyákot készítek akkor mi a gyakorlat az IC felprogramozásánál?
Tüskékkel vezessem ki a programozó lábakat és úgy töltsem fel a szoftvert vagy jó az is, ha próba panelen felprogramozom és csak beültetem a végleges helyére?
(#) kiborg válasza blackdog hozzászólására (») Jan 30, 2012 /
 
Szia!
Ezt csak debug-wire-val lehet debugolni, STK500 nem alkalmas debugra,csak programletöltésre.
Sorry a hírért,de ez van.
Én JTAG-on dolgozom, és jelenleg Mega16-ot nyúzok.
Üdv kiborg
(#) blackdog válasza kiborg hozzászólására (») Jan 30, 2012 /
 
Én szoftveres debug-ra gondolok. Futtatni a programot és figyelni a változók/portok értékének a módosulását. Ezt nem találom az AvrStudio-ban.
(#) blackdog válasza blackdog hozzászólására (») Jan 30, 2012 /
 
Nos ahogyan olvasgatok meg amit mondtatok és kisérletezés alapján kezdem felfogni. Már csak a lényeget nem értem:
A PINB3-4-5 honnan tudja, hogy az ő értékük az R_ G_ B_ duty?
(#) kiborg válasza blackdog hozzászólására (») Jan 30, 2012 /
 
Szia!

Ők onnan tudják, hogy amikor if(TimerCounter==0) feltétel teljesül, akkor 1-re állítja a kimenetet ÉS feltölti az R,G,B_duty változókat !!!
Amikor a változó R,G,B duty eléri a 0-t, akkor billenti 0-ba a kimenetet.
Érthető ?

Ja, mostmár értem a kérdésed !
Nézd meg ezt a rész az EREDETI programban:
  1. void Init(void) {
  2. //----------------------------------------------------
  3.            TCCR0B |=  (0<<CS02)  //64-as előosztás timer 0-re
  4.                    |  (0<<CS01)
  5.                    |  (1<<CS00);
  6.  
  7.            TIMSK0     |= (1<<TOIE0) ;  //enable interrupt
  8.  
  9.            sei();
  10.  
  11.            DDRB     |= (1<<PINB0)     //kimeneteink
  12.                    |  (1<<PINB1)
  13.                    |  (1<<PINB2);


Az utolsó 3 sor vonatkozik a portra.B port 0,1,2 bitje a kimenet.

ja jut eszembe, ha nem sorozatgyártást csinálsz(vagy később biztos nem akarod fejleszteni), bőven jó, ha próbapanelen felprogizod és utána meg beülteted.
(#) sikolymester válasza blackdog hozzászólására (») Jan 30, 2012 /
 
Én 10 pines szalagkábel csatlakozót szoktam tenni minden nyákomra. Az atmel a 6 pines ISP csatakozót kívánja de facto atmel szabványra emelni, de én nem használom, mivel többszörös az ára a 6 pines csatinak, mint a 10-nek.
(#) gabi20 hozzászólása Jan 30, 2012 /
 
Sziasztok az AVR AREF lábát szabad terhelni? Éppen kapóra jönne nekem a 2,56V referencia. Csak néhány tized mA - ról volna szó.
(#) zombee válasza blackdog hozzászólására (») Jan 30, 2012 /
 
Szerintem a szimulátorra gondolsz, az be van építve. De az AVR Studio szimulátora a timereket rosszul kezeli.
Én nem használok szimulátort, úgy debuggolok hogy a kód futását állítom meg(beteszek egy while(1) ; -et).
Előtte pedig valami fondosabb(akár 1-bites) értéket megjelenítek egyszerű esetben a portlábakon,
ha meg már van valami féligkész rendszerem USART-al vagy LCD-vel akkor azon...
(#) sikolymester válasza gabi20 hozzászólására (») Jan 30, 2012 /
 
Fejemet rá, hogy nem szabad. De az adatlap hátha említi. Amúgy, hogyha nem akarod használni ADC -re, akkor talán nagy gond nem lehet, ha tényleg nano Amperekről van szó.
(#) zombee válasza gabi20 hozzászólására (») Jan 30, 2012 /
 
Ha terhelhető lenne akkor nem kellene rá kondi. Persze egy próbát megér, hátha mégis adja.
(#) zombee válasza zombee hozzászólására (») Jan 30, 2012 /
 
Ha van valami olcsó műverősítőd akkor én arra kötném ezt a 2.56V-ot(impedanciaillesztésnek hívják).
Ja, és van rá egy söröm hogy az a 2.56V sem pont annyi amennyinek most én itt leírom.
Következő: »»   403 / 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