Timer beim PIC 16f877

Gast #2013281
Lesenswert?

Ich bin noch ein frischling was das Programmieren bei Assembler angeht. 
ich habe mir mit mühe und not ein Programm geschrieben (es versucht. Es 
soll eigentlich ein Lauflicht werden der durch den timer gesteuert 
werden...sprich ca 0,5 sekunden bevor die LED weiter spricht. Leider 
klappt es bei mir Null.... ich danke schon einmal im voraus:

    list p=16f877                ;der Prozessortyp wird festgelegt
   include "p16f877.inc"
;  __CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC & _LVP_OFF


  udata
  countint EQU    0x23


; -----------------------------------------------------------------
; Interruptvektortabelle
; -----------------------------------------------------------------
 org 0x000               ; RESET-Vektor
    goto start
 org 0x0004             ; Interruptvektor
    goto ISR           ; Sprung zu Interruptserviceroutine
;
;  org  b'00000000'


start:

    movlw  b'00000000'      ;alle Bits Port C Ausgänge
    bsf    STATUS, RP0      ; umschalten auf Bank 1
    bcf    STATUS, RP1      ; umschalten auf Bank 1
    movwf  TRISC
    bcf   OPTION_REG,5     ; interner Clock fuer Timer0
    bcf    OPTION_REG,0     ; Vorteiler fuer Timer0 ein
    bcf   OPTION_REG,1     ; Vorteilerbit0 = 0
    bcf   OPTION_REG,0     ; Vorteilerbit1 = 0
    bsf   OPTION_REG,1     ; Vorteilerbit2 = 1
                  ; -> 1MHz : 32 : 125 = 250Hz -> 4ms

    bcf    STATUS, RP0          ;umschalten auf Bank0
    movlw D'198'         ; Vorladen des Zaelregisters Timer0
    movwf   TMR0
    movlw D'187'         ; Vorladen des Interruptzaehlers
    movwf   countint
    bsf   INTCON,2      ; Timer0 Overflow ein
    bsf   INTCON,5      ; alle Interrupts ein

    movlw  b'00000001'
    movwf  PORTC
    bcf   STATUS,C       ; loesche Carry-Flag im STATUS
                  ; Register (noetig fuer rrf)
main:
    rlf   PORTC,1        ; Rotiere links ueber Carry
    call   ISR

    goto  main        ; Ruecksprung zu main


;----------------------------------------------------------------------- 
-
ISR:
    movlw D'198'         ; Reloadwert fuer Zaelregister Timer0 nach w
    movwf   TMR0         ; w nach TMR0
    decfsz   countint,0      ; Interruptereignisse zaehlen
    goto  isr1         ; solange Interruptzaehler != 0
                  ; sonst ->
    movf   PORTC,         ; Status PORTB einlesen

    movwf   PORTC         ; Ausgabe auf PORTB
    movlw D'187'         ; Vorladen des Interruptzaehlers
    movwf   countint

isr1:
    bcf   INTCON,1      ;Iterruptflag zurücksetzen
    retfie             ; Return from Interrupt
 end                             ;das Ende des Programms
Gast #2013440
Lesenswert?

Also als erstes fällt auf, dass du in der Main die ISR aufrufst, das 
darf nicht sein. Die wird ja durch den IRQ selbst aufgerufen.
Das Bitschieben kannst du in dem Fall auch in die ISR auslagern, sonst 
schiebt er ja in der Main ständig durch.
Das wäre auch besser gelöst über eine Variable im RAM, die du schiebst 
und dann komplett auf den Ausgang schreibst.
Beachte auch, dass du das Carry durchschiebst, dessen Zustand musst du 
explizit setzen/löschen.
In deiner Main bleibt also zunächst nichts übrig.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren