Untitled

 avatar
unknown
plain_text
2 years ago
2.2 kB
5
Indexable
; Program włącza diody w kolejności 3, 2, 1 co 10 ms, wykorzystując
; moduł Timer2, tablice i rezonator kwarcowy o częstotliwości 4 MHz.

list C=160, N=80, ST=OFF, MM=OFF
#include "P16F74.INC"
__config ( _CP_OFF & _PWRTE_ON & _XT_OSC & _WDT_OFF & _BODEN_OFF )
errorlevel -302

Freq	equ	4
Bank0RAM	equ	H'20'
MaksLicz	equ	5 ; liczba pętli wymaganych dla czasu 10 ms.
Dioda3	equ	B'00000001'

cblock	Bank0RAM
    W_TEMP
    STATUS_TEMP
    SKALER
    LICZPETLE
endc

org	H'000'
    goto    ProgramGlowny

org	H'004'
    goto    ProcObsPrzerwan

TablicaPrzelacz
    movf    PORTD, W
    andlw   B'00000111'
    addwf   PCL, F
    retlw   B'00000001'
    retlw   B'00000011'
    retlw   B'00000110'
    retlw   B'00000010'
    retlw   B'00000101'
    retlw   B'00000100'
    retlw   B'00000111'
    retlw   B'00000110'

ProgramGlowny
    call    Inicjalizacja

PetlaGlowna
    call    Przelacz
    call    Opoznienie
    goto    PetlaGlowna

Inicjalizacja
    movlw   MaksLicz
    movwf   LICZPETLE
    movlw   Dioda3
    movwf   PORTD
    movlw   (4*Freq) - 3
    movwf   T2CON
    movlw   2 ; Wart. pocz. zmiennej SKALER zmieniona na 2, bo teraz potrzebujemy 10 ms.
    movwf   SKALER
    bsf	    INTCON, PEIE

    bsf	    STATUS, RP0
    clrf    TRISD
    
    movlw   124 ; Inicjalizacja rejestru PR2 (124 -> PR2), główny skaler ma wartość 125
    movwf   PR2
    bsf	    PIE1, TMR2IE

    bcf	    STATUS, RP0
    bsf	    INTCON, GIE
    return

Przelacz
    decfsz  LICZPETLE, F
    goto    PrzelaczKoniec
    movlw   MaksLicz
    movwf   LICZPETLE
    call    TablicaPrzelacz
    xorwf   PORTD, F

PrzelaczKoniec
    return

Opoznienie
    btfss   SKALER, 7
    goto    Opoznienie
    movlw   2
    addwf   SKALER, F
    return 

ProcObsPrzerwan
    movwf   W_TEMP
    swapf   STATUS, W

assembly
    movwf   STATUS_TEMP
    btfsc   PIR1, TMR2IF
    call    Timer2
    swapf   STATUS_TEMP, W
    movwf   STATUS
    swapf   W_TEMP, F
    swapf   W_TEMP, W
    retfie

Timer2
    bcf	    PIR1, TMR2IF
    decf    SKALER, F
    return

end
Editor is loading...