Fórum témák

» Több friss téma
Cikkek » Winamp vezérlő soros portra
Winamp vezérlő soros portra
Szerző: pixels, idő: Márc 18, 2008, Olvasva: 33592, Oldal olvasási idő: kb. 3 perc
Lapozás: OK   3 / 7

A firmware forráskód szerkezeti áttekintése:

A programot pic assembly nyelven írtam meg.

A PIC RAM-jában sok segédregiszter van, ezek az lcd függvényeknek, a bcd átalakításnak, a delay függvénynek vannak létrehozva. A lista végén vannak a "hasznos" adatok tárolására szolgáló regiszterek. Itt tárolom a lista hosszát, pozícióját, a zeneszám hosszát, pozícióját, a szám címének hosszát, kijelzés pozíciót, görgetést, és lejátszó állapotát. A bank0 végén 0x70 címtől is van néhány regiszter. Ezeket bármely bankból elérhetővé kellett tenni, ezért vannak a 0x70-es címen, külön a többi változótól. A zeneszám címét a belső EEPROM-ban tárolom, hiszen az indirekt címezhető, és 128 karakter befogadására képes. Ez tapasztalataim szerint bőségesen elég.

A forráskódban láthatunk még néhány állandót, ezek az adatküldés parancskódjai, a lejátszó állapotához rendelt értékek, valamint a bankváltásokhoz, lcd-hez előre definiált állandók.

A programban megszakításokat is használunk, mégpedig a TIMER0 modul, és az USART modul megszakítását. A megszakítások a 0x0004-es címről kezdődnek, ez előtti négy programszó valósítja meg az inicializálást, az LCD speciális karakterek feltöltését, és a főciklusba ugrást.

A TIMER0 megszakításban a kijelzést vezéreljük az LCD_DISPLAY, és LCD_CLEAR bittel, valamint a gombok állapotát kérjük le, és ha van változás rögtön ki is küldjük az adatokat a PC felé az USART-on. Itt térnék ki a 4 portra, ami kimenetként és bemenetként is funkcionál. Amikor az LCD-re adatot írunk, akkor az LCD_BUSY bit értéke 1, ilyenkor a portról nem szabad adatot olvasni, hiszen az LCD használja azt. A TIMER0 megszakításban először ezt ellenőrizzük. Ha az LCD felé nincs adatátvitel, akkor a portról beolvassuk a gombok állapotát. Ha az LCD felé éppen adatátvitel van folyamatban, akkor kiugrunk a megszakításból, és nem kérjük be a gombok állapotát. Ez nem okoz problémát, hiszen a gombok állapotát sűrűn ellenőrzi a firmware, viszont az LCD-t elég ritkán használja, így a reakcióidő nem csökken észrevehetően.

Az USART megszakítása meglehetősen bonyolult, itt nem részletezem annyira. Az adatok mindig parancsbájttal kezdődnek. A megszakításban ellenőrizzük a parancs kódját, és a parancs függvényében a megfelelő helyre mentjük el az adatokat.

A megszakítások után van a főciklus, ahol az LCD frissítése történik.

A főciklus után vannak elhelyezve a függvények:

  • INIT függvény: Itt minden modult beállítunk, amire a programnak szüksége van.
  • Ezután vannak a kijelzést megvalósító függvények.
  • Következnek a segédfüggvények: késleltető függvény, és a BCD számkonvertáló.
  • Az USART-ra csak egy függvény van, mégpedig ami adatot küld. A vétel a megszakításban van megvalósítva.
  • Ezek után vannak az EEPROM függvények: EEPROM írás, és olvasás.
  • És végül az LCD karakter, és parancs küldőfüggvények, az LCD inicializálására szolgáló függvény, és az LCD késleltetés függvények. Az utolsó LCD függvény tölti fel a CGRAM-ba a speciális karaktereket.

A forráskódról felépítéséről ennyi szerintem elég. Aki kíváncsi még valamire, ajánlom átnézni a forráskódot, mert fel van kommentezve.

Kijelzés testreszabása:

Ha nem sikerül 1*16-os kijelzőt szerezni, vagy több adatot akarunk megjeleníteni egy nagyobb kijelzőn, akkor meg van rá a lehetőség, hogy a kód minimális változtatásával lehet beállítani a kijelzést:

  • Meg kell keresni ezt a részt a kódban. Itt választhatjuk ki a kiírni kívánt adatokat:
      CALL DISPLAY_TRK_TITLE
      CALL
    DISPLAY_PLR_STATUS
      CALL DISPLAY_TRK_POS
    ; CALL DISPLAY_TRK_LEN
    ; CALL DISPLAY_LIST_POS
    ; CALL DISPLAY_LIST_LEN
    Amit ki akarunk íratni, az elől ki kell venni a pontosvesszőt, amit nem, azelé meg be kell tenni.
  • A kód elején adhatók meg a kijelzés helyét megadó állandók:
    DP_LIST_POS EQU .0 ; lista hossza
    DP_LIST_LEN EQU .0 ; lista pozíció
    DP_TRK_POS EQU .66 ; zeneszám pozíció
    DP_TRK_LEN EQU .0 ; zeneszám hossza
    DP_TRK_TITLE EQU .0 ; zeneszám címe
    DP_PLR_STATUS EQU .65
    ; lejátszó állapot
    A számok jelentik az LCD pozíciókat. A pontot a szám előtt ott kell hagyni. Ha van olyan adat, amit nem íratunk ki, annak a sorát nem szabad kivenni, mert hibát okoz. Ilyenkor mindegy, hogy milyen számot írunk be. Én .0-t írtam ezekre a helyekre. Aki nem tud programozni, annak ide írom, hogy a pont azt jelenti a szám előtt, hogy a fordító azt decimális számként értelmezi.
  • Szintén a kód elején adható meg, hogy a címet hány karakter szélességben írja ki:
    CN_TITLE EQU .8
    Ezt a sort sem szabad kivenni, csak a sor végén álló szám módosítható. A pontot ezen a helyen is meg kell hagyni a szám előtt.

Alapértelmezésben a szám címe 8 karakter szélességben, az eltelt idő, és a lejátszó állapot van kiíratva egy 1*16-os kijelzőn.

Egy példa, hogy az alapbeállításokkal hogy nézhet ki az LCD kijelző:

 


A cikk még nem ért véget, lapozz!
Következő: »»   3 / 7
Értékeléshez bejelentkezés szükséges!
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