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
|
|