main-c.asm


1
.include "m8def.inc" 
2
3
;Prog zum Testen der Ausgabe auf LedD LTC561G-RD(3Dig.; Gem. Anoden) 
4
.Def ArbR1= r16 ;R16 wird arbeitsregister
5
.Def ArbR2= r17 ;R17 wird arbeitsregister
6
.Def ZifR = r18 ;R17 wird Ziffernregister = welche Ziffer angewählt ist
7
.Def Dig1 = r19 ;1. Ziffer in r18
8
.Def Dig2 = r20 ;2. Ziffer in r19
9
.Def Dig3 = r21 ;3. Ziffer in r20
10
.Def ArbR3= r22
11
.Def ArbR4= r23
12
.Def TimR = r24
13
14
.org 0x00
15
  rjmp reset
16
.org OVF1addr
17
  rjmp tovf
18
19
reset:
20
;Stackpointer laden
21
  ldi ArbR1, HIGH(RAMEND)     ; HIGH-Byte der obersten RAM-Adresse
22
         out SPH, ArbR1
23
  ldi ArbR1, LOW(RAMEND)      ; LOW-Byte der obersten RAM-Adresse
24
         out SPL, ArbR1
25
26
;Timer initialisieren
27
  ldi r16, HIGH(56250)  ;Maximalwert des Counters
28
  out ICR1H, r16
29
  ldi r16, LOW(56250)
30
  out ICR1L, r16
31
  ldi r16, 0    ;Timermodus => rtfm
32
  out TCCR1A, r16
33
  ldi r16, 0b00000101
34
  out TCCR1B, r16
35
  ldi r16, 0b00000100  ;Interrupt bei TimerOverflow an
36
  out TOIE1, r16
37
  sei
38
39
;Init der IO-Register
40
        ldi ArbR1, 0xFF
41
  out DDRD, ArbR1    ;Port D wird ausgang
42
  out PortD, ArbR1    ;Port D high setzen = nichts anzeigen
43
  
44
  ldi ArbR1, 0b00000111
45
  out DDRB, ArbR1    ;Port B 0,1,2 werden Ausgang
46
        ldi ArbR1, 0b00000111
47
        out PortB, ArbR1    ;Keine Ziffer wählen
48
        
49
;Ziffern laden
50
         ldi Dig1, 0x00
51
         ldi Dig2, 0x00
52
         ldi Dig3, 0x00
53
54
;umform-sub
55
umf:    ;1.Ziffer
56
        cpi ArbR1, 0x01
57
        ldi ArbR2, 0b11010111
58
        breq umfend
59
        cpi ArbR1, 0x02
60
        ldi ArbR2, 0b01001100
61
        breq umfend
62
        cpi ArbR1, 0x03
63
        ldi ArbR2, 0b01000101
64
        breq umfend
65
        cpi ArbR1, 0x04
66
        ldi ArbR2, 0b10000111
67
        breq umfend
68
        cpi ArbR1, 0x05
69
        ldi ArbR2, 0b00100101
70
        breq umfend
71
        cpi ArbR1, 0x06
72
        ldi ArbR2, 0b00100100
73
        breq umfend
74
        cpi ArbR1, 0x07
75
        ldi ArbR2, 0b01010111
76
        breq umfend
77
        cpi ArbR1, 0x08
78
        ldi ArbR2, 0b00000100
79
        breq umfend
80
        cpi ArbR1, 0x09
81
        ldi ArbR2, 0b00000101
82
        breq umfend
83
   ldi ArbR2, 0b00010100
84
umfend:  cpi ArbR3, 1
85
  breq dig1w
86
  cpi ArbR3, 2
87
  breq dig2w
88
  cpi ArbR3, 3
89
  breq dig3w
90
  
91
;immer ausgeben
92
;immer ausgeben
93
idle:
94
  mov ArbR1, Dig1
95
  ldi ArbR3, 1
96
  rjmp umf
97
dig1w:  ldi ArbR1, 0b00000110 
98
  out PortB, ArbR1 
99
  out PortD, ArbR2  ;1.Ziffer
100
  rcall delay    ;warten
101
  
102
  mov ArbR1, Dig2
103
  ldi ArbR3, 2
104
  rjmp umf
105
dig2w:  ldi ArbR1, 0b00000101 
106
  out PortB, ArbR1 
107
  out PortD, ArbR2  ;2.Ziffer
108
  rcall delay    ;warten
109
  
110
  mov ArbR1, Dig3
111
  ldi ArbR3, 3
112
  rjmp umf
113
dig3w:  ldi ArbR1, 0b00000011 
114
  out PortB, ArbR1 
115
  out PortD, ArbR2  ;3.Ziffer
116
  rcall delay    ;warten
117
  
118
  rjmp idle
119
120
;Verzögerunssub
121
delay:                               ;5ms Pause
122
           ldi  ArbR3, $21
123
WGLOOP0:   ldi  ArbR4, $C9
124
WGLOOP1:   dec  ArbR4
125
     tst ArbR4
126
           brne WGLOOP1
127
           dec  ArbR3
128
           tst ArbR3
129
           brne WGLOOP0
130
           ret                          ;wieder zurück
131
           
132
;timers sub
133
tovf:  ;Wenn der Timer über 56250 drüberläuft...
134
  dec TimR
135
  tst TimR
136
  brne tovf_end
137
  ldi TimR, 6
138
;neue Zeit berechnen und ausgeben
139
  ldi Dig1, 0x01
140
  ;inc Dig1
141
  ;cpi Dig1, 10
142
  ;brne tovf_end
143
  ;ldi Dig1, 0
144
  ;inc Dig2
145
  ;cpi Dig1, 10
146
  ;brne tovf_end
147
  ;ldi Dig2, 0
148
  ;inc Dig3
149
  ;cpi Dig1, 10
150
  ;brne tovf_end
151
  ;ldi Dig3, 0  
152
  
153
tovf_end:    ;wieder wech von Timersub
154
  rjmp idle