Fórum témák

» Több friss téma
Cikkek » Nulláról a robotokig - PIC Mikrovezérlők III rész
Nulláról a robotokig - PIC Mikrovezérlők III rész
Szerző: Topi, idő: Júl 13, 2007, Olvasva: 51473, Oldal olvasási idő: kb. 1 perc
Lapozás: OK   5 / 19

Mint már megszokhattuk, az assembly nyelven íródott programok, mindig ezerszer bonyolultabbak, de viszont stabilabbak. Ebben a részben pont ezért ismertetem mindkettőt.

Ennél a megszakításnál először az OPTION_REG regisztert kell beállítani, mert mikor átlapozunk BANK1-be, akkor érhető el csak.

Először is be kell állítani az alábbi regisztert: INTEDG: Interrupt Edge Select bit
1 = Felfutó élre indul (0-áról 1 lesz)
0 = Lefutó élre indul (1-ről 0 lesz)

Mivel a mi gombunk a PIC bemenetére alapesetben 1-es szintet ad, így nekünk akkor kell jeleznie, hogyha ez 0-ás szintre esett, tehát lefutó élt kell detektálnia.

  1. LIST P=16F877
  2.  #INCLUDE "P16F877.INC"
  3.  ERRORLEVEL 0, -302  ; suppress bank selection messages
  4.  __CONFIG _XT_OSC&_CP_OFF&_WDT_OFF&_LVP_OFF
  5.  CBLOCK 0x70   ;A Minden BANK-ból látható GPR kezdőcím
  6.   W_SAVE
  7.   STATUS_SAVE
  8.  ENDC
  9.  
  10.  
  11. #include "m_bank.asm"
  12.  
  13.  
  14.  ORG 0
  15.  GOTO MAIN   ;Beugrunk a MAIN loopba
  16.  
  17.  
  18.  ORG 4
  19.  ; Elmentjük a Work és Status regisztereket
  20.  MOVWF W_SAVE   ;Először a Work regisztert
  21.  MOVFW STATUS   ;STATUS-t bele a már lementett Workbe
  22.  MOVWF STATUS_SAVE  ;Status_save-be beletölti a Worköt
  23.  
  24.  
  25.  BCF  INTCON,INTF  ;Töröljük az INTF flag bitet (Jelezzük, kezeltük a megszakítást RB0)
  26.  MOVLW B'11111111'
  27.  XORWF PORTD,F   ;XOR PORTD bitjeit
  28.  
  29.  
  30.  ; Visszatöltjük a Work és Status regisztereket
  31.  MOVFW STATUS_SAVE
  32.  MOVWF STATUS
  33.  MOVFW W_SAVE
  34.  
  35.  
  36.  RETFIE     ;Visszajövünk az interruptból
  37.  
  38.  
  39.  
  40. MAIN
  41.  BANK1     ;Unit az m_bank.asm-ben
  42.  MOVLW B'00000000'  ;Betöltjük az akksiba a TRISD-be valót
  43.  MOVWF TRISD   ;Beletöltjük (mind kimenet a nulla miatt)
  44.  MOVLW B'00000001'  ;Betöltjük az akksiba a TRISB-be valót
  45.  MOVWF TRISB   ;Beletöltjük az 0. PORTB bemenet lesz
  46.  
  47.  
  48.  BCF  OPTION_REG,INTEDG ;Lefutó élre interruptol (1 = felfutó, 0 = lefutó él)
  49.  BANK0     ;BANK0-ba visszalépünk
  50.  
  51.  
  52.  MOVLW B'01010101'  ;Betöltjük az akksiba a PORTD-be valót
  53.  MOVWF PORTD   ;Beletöltjük a PORTD-be
  54.  
  55.  
  56.  ;Beállítjuk az RB0 interruptot
  57.  BSF  INTCON,INTE   ;Engedélyezzük az interruptot az INT0-ra
  58.  BSF  INTCON,GIE   ;General Interrupt Enable bitet 1-re állítva bekapcsolunk mindent
  59.  
  60.  
  61. LOOP
  62.  NOP
  63.  GOTO LOOP     ;Vissza a végtelen ciklusba
  64.  
  65.  
  66.   END       ;Teljes program végét jelentő END

Igyekeztem mindent szépen bőbeszédűen felkommentezni. A programnak a LED-eket invertálnia kell minden gombnyomásra. Az egész program indulásakor, beállítjuk, hogy a PORTD-n 01010101 legyen, vagyis úgymond minden második LED legyen bekapcsolva. A 255-el XOR-olás hatására minden bit, az ellenkezőjére fordul.

Program forráskód, segéd rutin és lefordított hex: rb0_asm.zip

Nézzük ugyan ezt a programot C nyelven.


A cikk még nem ért véget, lapozz!
Következő: »»   5 / 19
É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