PIC16F887 + Assembler -> Timer1 + interrupt

OP #2326186
Lesenswert?

Hallo zusammen,

ich versuche gerade ein Lauflicht (PORTD wird einfach nur inkrementiert) 
zu basteln. Allerdings soll es so laufen: Der Timer1 läuft vor sich hin 
und bei einem Überlauf wird ein Interrupt ausgelöst, der dann PORTD 
inkrementiert.

Leider funktioniert das nicht, ich glaube der Timer läuft nicht... (in 
der loop (ganz unten) wollte ich das überprüfen, aber am PORTB liegt 
immer nur 0b01100001 an)
1
list p=16f887          ; der Prozessortyp wird festgelegt
2
  include "p16f887.inc"    ; die include-Datei mit vielen Festlegungen wird geladen
3
                ; z.B. sind hier Standardnamen für wichtige
4
                ; Register und Bits festgelegt
5
  
6
  __CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC
7
  __CONFIG _CONFIG2, _WRT_OFF & _BOR21V
8

9
  W_TEMP      Equ    0x20  ; Backup für Arbeitsregister
10
  STATUS_TEMP    Equ    0x21  ; Backup für Statusregister 
11
  PCLATH_TEMP    Equ    0x22  ; Backup für PC
12

13
org    0x00            ; die Startadresse nach Reset ist 0, hier startet der PIC
14
  goto   main          ; Sprung zum Hauptprogramm
15

16

17
org     0x0004
18
                ; ___
19
  MOVWF   W_TEMP        ;    |
20
  SWAPF   STATUS,W      ;    |
21
  CLRF    STATUS        ;    |
22
  MOVWF   STATUS_TEMP      ;    +- Sichern der Umgebung des Hauptprogramms
23
  MOVF    PCLATH, W      ;    |
24
  MOVWF   PCLATH_TEMP      ;    |
25
  CLRF    PCLATH        ; ___|
26

27
  movlw 1            ; PORTD soll um 1 inkrementiert werden (1 ins working Register)
28
  addwf PORTD, 1        ; PORTD wird inkrementiert
29

30

31
  bcf PIR1, TMR1IF      ; "Timer1 hat interrupt ausgelöst" zurücksetzen
32
                ; ___
33
  MOVF    PCLATH_TEMP, W    ;    |
34
  MOVWF   PCLATH        ;    |
35
  SWAPF   STATUS_TEMP,W    ;    +- Umgebung des Hauptprogramms wiederherstellen
36
  MOVWF   STATUS        ;    |
37
  SWAPF   W_TEMP,F      ;    |
38
  SWAPF   W_TEMP,W       ; ___|
39

40
  retfie            ; zurück ins Programm
41

42

43
main
44
  bsf STATUS, RP0        ; In Bank 1 wechseln
45
  movlw B'00000000'       ; 0 in Working Register schreiben
46
  movwf TRISD          ; Working register (also 0) in TRISD schreiben -> Ausgang
47
  movlw B'00000000'       ; 0 in Working Register schreiben
48
  movwf TRISB          ; Working register (also 0) in TRISD schreiben -> Ausgang
49
  bcf STATUS, RP0        ; Wieder in Bank 0 wechseln
50

51
  bcf T1CON, TMR1CS      ; Timer 1: Quarz als Quelle
52

53
  bcf T1CON, T1CKPS0      ; Prescaler auf 1
54
  bcf T1CON, T1CKPS1      ; Prescaler auf 1
55

56
  bsf INTCON, PEIE      ; Interrupt für Pheripherie erlauben
57
  bsf STATUS, RP0        ; In Bank 1 wechseln
58
  bsf PIE1, TMR1IE      ; Interrupt für Timer 1 (Pheripherie) aktivieren
59
  bcf STATUS, RP0        ; Wieder in Bank 0 wechseln
60
  bsf INTCON, GIE        ; Globales enable Interrupt setzen
61

62
loop
63
  movf TMR1L, 0
64
  movwf PORTB
65
  goto loop
66

67
end                ; das Ende des Programms

Erkennt jemand den Fehler?

Viele Grüße und schon mal vielen Dank
-schumi-

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