Forum: Mikrocontroller und Digitale Elektronik PIC16F887 + Assembler -> Timer1 + interrupt


von Simon S. (-schumi-)


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-

von eieiei (Gast)


Lesenswert?

Hallo Simon,

da kann ich dir leider nicht helfen ;-)

von Simon S. (-schumi-)


Lesenswert?

Oh mann, Kopf -> Tisch

Wenn der Timer laufen soll, ist es nützlich das Byte TMR1ON aus T1CON zu 
setzen..

-> FAIL

von chris (Gast)


Lesenswert?

Und wo schaltest du den Timer ein ? TMR1ON

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.