Forum: Mikrocontroller und Digitale Elektronik Count_Down programmieren


von Kriechtier (Gast)


Lesenswert?

Hallo zusammen,

ich bin gerade an einem kleinen Projekt tätig in dem ich nicht mehr 
weiter komme und nun Hilfe suche.
Folgendes Problem ich versuche mit dem Controller AT89C5131 und einem 
12Mhz Quarz in Assembler einen Count Down Timer zu programmieren.
Die Werte des Counters sollen über 4 Taster eingestellt werden können 
Min/sek/zehntel sek und dann noch 1 Taster für den Start.
Das Problem ist, dass mein Interrupt auslöst aber irrend wie startet der 
Rückwärtslaufen nicht. Die werte für den counter lassen sich einwandfrei 
über port 2 einstellen.
Bitte um Hilfe und Denkanstöße :)

Kriechtier

hier mein Programm
1
$nomod51               ;Standartdatei abschalten
2
#include <AT89C5131.h>     ;Spezielle Includedatei (Registerwerte) einbinden
3
;******** Start *****************************************************  
4
org  0000h
5
6
ljmp   init      ;hinter die Interrupt-Einsprung-Adressen
7
    
8
org 000BH
9
10
;******* Interrupt-Service-Routine **************************************
11
12
ISRtimer0:  mov  TL0,#HIGH(65536-10000)    
13
            mov   TH0,#LOW(65536-10000)
14
            cjne  R6,#0FFh,haupt 
15
            Dec   R5
16
            mov   R4,A
17
            mov   A, R5
18
            djnz  R5,Zaehler
19
M6:         mov   TL0,#HIGH(65536-10000)    
20
            mov   TH0,#LOW(65536-10000)    
21
            mov   a,R4
22
            reti
23
;******* Initialisierung ***********************::::*******************
24
25
26
27
28
init:    mov   TMOD,#0000001b   
29
         mov   TL0,#HIGH(65536-10000)   
30
         mov   TH0,#LOW(65536-10000)    
31
         setb  TR0              ;Timerinterrupt 0 ein       
32
         setb   ET0              ;Enable Timer0 Interrupt (IEN0.1)
33
         setb   EA              ;Interrupts freigeben
34
      
35
         mov   R6,#00h
36
         mov   R7,#0ffh
37
         mov   R5,#26
38
         mov    R0,#00h
39
         mov    R1,#00h
40
         mov    R2,#00h
41
         mov    R3,#00h
42
         mov     dptr,#Tabelle
43
      
44
45
46
;******** Einlesen der Werte von Tasterplatine ****************************
47
48
haupt:       jnb   P2.0,M1   ;Abfrage des Ports 2 zum Einlesen der Werte
49
             jnb     P2.1,M2  ;Werte werden über Port 2 Pin 0-3 eingestellt
50
             jnb    P2.2,M3             
51
             jnb    P2.3,M4
52
             jnb    P2.4,M5
53
             acall   ausgabe
54
             jmp  haupt          ;Warten auf Interrupts          
55
56
M1:   inc   R0          ;Register 0 wird um 1 erhöht       
57
      cjne    R0,#10,M7 ;Überprüfe ob R0 = 9 ist wenn nein springe M5
58
      mov   R0,#0        ;Ist R0 = 9 schreibe 0 in R0
59
M7:   acall  time
60
      
61
62
M2:   inc   R1          ;Register 1 wird um 1 erhöht
63
      cjne    R1,#10,M8  ;Überprüfe ob R0 = 9 ist wenn nein springe M5
64
      mov   R1,#0        ;Ist R0 = 9 schreibe 0 in R0
65
M8:   acall  time
66
67
68
M3:   inc   R2
69
      cjne    R2,#6,M9    ;Überprüfe ob R0 = 9 ist wenn nein springe M5
70
      mov   R2,#0        ;Ist R0 = 9 schreibe 0 in R0
71
M9:   acall  time
72
      
73
    
74
M4:   inc   R3
75
      cjne    R3,#10,M10  ;Überprüfe ob R0 = 9 ist wenn nein springe M5
76
      mov   R3,#0        ;Ist R0 = 9 schreibe 0 in R0
77
M10:  acall  time
78
      
79
  
80
M5:   mov    R6,#0FFh
81
      jmp    haupt
82
  
83
  
84
;******** Counter ***************************************************
85
Zaehler:  mov   R5,#26
86
        
87
      djnz   R0,m1      
88
      mov    R0,#10                  
89
      
90
      djnz   R1,m1
91
      mov    R1,#10  
92
          
93
      djnz   R2,m1
94
      mov    R2,#5
95
      
96
      djnz   R3,m1
97
      mov    R3,#10
98
      
99
            jmp     M6
100
      
101
;******** Ausgabe zu 7-Segment-Anzeige *****************************
102
103
104
Ausgabe:  mov     A,R0    
105
      movc    A,@A+dptr    ;Hole 7-Segment-Code aus Tabelle
106
      mov     P0,A        ;Ausgabe des 7-Segment-Codes in Port 0
107
      clr     P1.0        ;Schalte erste von vier 7-Seg-Anzeige ein
108
      setb    P1.0        ;Schalter erste von vier 7-Seg-Anzeigen aus
109
      
110
111
      mov     A,R1  
112
      movc    A,@A+dptr        ;Hole 7-Segment-Code aus Tabelle
113
      mov     P0,A        ;Ausgabe des 7-Segment-Codes in Port 0
114
      clr     P1.1        ;Schalte zweite von vier 7-Seg-Anzeige ein
115
      setb    P1.1        ;Schalter zweite von vier 7-Seg-Anzeigen aus
116
      
117
118
      mov     A,R2
119
      movc    A,@A+dptr
120
      mov     P0,A
121
      clr      P1.2
122
      setb    P1.2
123
      
124
125
      mov     A,R3
126
      movc    A,@A+dptr
127
      mov     P0,A
128
      clr      P1.3
129
      setb    P1.3
130
      
131
      reti 
132
      
133
      
134
135
time:       acall   Ausgabe
136
            djnz   R7,time        ;Verringere R7 um 1 und springe zu time
137
            mov   R7,#0ffh
138
            jmp    haupt        ;Rücksprung aus Unterprogramm
139
140
                
141
142
143
;********* Tabelle mit passenden 7-Segement-Code**************************
144
145
Tabelle: 
146
147
      ;     0           1           2           3           4           5           6           7           8           9        0
148
    db    00111111b , 00000110b , 01011011b , 01001111b , 01100110b , 01101101b , 01111101b , 00000111b , 01111111b , 01101111b , 00111111b
149
150
151
End

: Bearbeitet durch User
von mknoelke (Gast)


Lesenswert?

Sorry, da quäl ich mich so im Detail (fast) nicht durch.

In der IRQ springst du zu zähler, der springt zu, der springt zu etc. 
pp.
Im Endeffekt arbeitest du so in der irq das ganze programm ab und die 
irq ist während dessen totgelegt für weitere auslösungen.

Nachdem das alles durchgerattert wurde setzt du den timer nochmal neu 
(m6).
D.h. die Bearbeitungszeit deines Programmes addiert sich zur timer zeit 
(10ms).

Besser:
Der Timer irq setzt alle 10 auslösungen ein flag (100ms flag), setzt den 
timer neu und ende.
Im hauptprg. wird das flag ausgewertet.

Arbeite am besten mit pin debugging + oszi um Fehler im ablauf zu 
finden.

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.