Forum: Mikrocontroller und Digitale Elektronik Timer beim PIC 16f877


von PVT Paula (Gast)


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

von Holger (Gast)


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.

von usuru (Gast)


Lesenswert?

1. die Config-Bits sind auskommentiert

2. als Anfänger würde ich das erst mal ohne Interrupt machen:

loop
   Bit setzen,
   warten
   Bit schieben
   zurück zu loop

von PIC N. (eigo) Benutzerseite


Lesenswert?

In der ISR noch die Register sichern..

von PVT Paula (Gast)


Lesenswert?

soll in main auch das "goto" weggenommen werden?

von PIC N. (eigo) Benutzerseite


Lesenswert?

Ne, dann hast du ja keine Endlosschleife mehr =)

von PVT Paula (Gast)


Lesenswert?

oke ich hatte mich auch schon gewundert

von PVT PAULA (Gast)


Lesenswert?

so ich hab das mitlerweile auch hinbekommen....ich habe es zwar 
allgemein jetzt etwas anderes aufgebaut aber es funktionier auch dank 
eurer hilfe

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.