Hallo
Und schon wider gibz ein Problem bei dem ich nicht weiter komme.
Ich würd mir gerne eine Uhr basteln. Den programmablauf hab ich mir schon ausgedacht. nur hab ich jetzt das Problem dass das Register 16 jede Sekunde um eins herhöht werden soll. nach der Zahl 9 solls wider bei null anfangen. also praktisch so 0,1,2,3,4,5,6,7,8,9,->0,1,2,3,4,5....... (im Sekunden Tackt)
Ich hab schon gelesen dass das mit irgendwelchen Interrupts möglich ist. aber wie macht man sowas?
Der bisherige Ablauf soll dann mal so aussehen (hab ich mir vorgestellt)
Ist das Sinnvoll, bzw, würde es überhaupt funktionieren?
Gruß
Und schon wider gibz ein Problem bei dem ich nicht weiter komme.
Ich würd mir gerne eine Uhr basteln. Den programmablauf hab ich mir schon ausgedacht. nur hab ich jetzt das Problem dass das Register 16 jede Sekunde um eins herhöht werden soll. nach der Zahl 9 solls wider bei null anfangen. also praktisch so 0,1,2,3,4,5,6,7,8,9,->0,1,2,3,4,5....... (im Sekunden Tackt)
Ich hab schon gelesen dass das mit irgendwelchen Interrupts möglich ist. aber wie macht man sowas?
Der bisherige Ablauf soll dann mal so aussehen (hab ich mir vorgestellt)
Ist das Sinnvoll, bzw, würde es überhaupt funktionieren?
Gruß
Code:
.include"m8def.inc"
;Es wird ein 4,0 Mhz Quarz benutzt
rjmp Start
Start:
ldi r16,0b11111111 ;Ansteuerung der 7Segment Ziffern
out ddrd,r16
ldi r16,0b00000111
out ddrb,r16 ;Wird zum umschalten von GND der Displays benötigt
clr r16
;Sekundenstelle einer--------------------------------------------------------------------------------------------
Null:
cpi r16,0 ;Vergleiche R16
brne Eins ;Springe nach Eins wenn r16 Nicht gleich 0
ldi r17,0b11111100 ;wenn R16 = 0 dann Ziffer0 in r17Laden
Eins:
cpi r16,1 ;Vergleiche r16
brne Zwei Springe nach Zwei wenn R16 Nicht gleich 1
ldi r17,0b01100000 ;wenn R16 = 1 dann Ziffer1 in r17Laden
Zwei:
cpi r16,2
brne Drei
ldi r17,0b11011010 ;wenn R16 = 2 dann Ziffer2 in r17Laden
Drei:
cpi r16,3
brne Vier
ldi r17,0b11110010
Vier:
cpi r16,4
brne Fünf
ldi r17,0b01100110
Fünf:
cpi r16,5
brne Sechs
ldi r17,0b10110110
Sechs:
cpi r16,6
brne Sieben
ldi r17,0b10111110
Sieben:
cpi r16,7
brne Acht
ldi r17,0b11100000
Acht:
cpi r16,8
brne Neun
ldi r17,ob11111110
Neun:
cpi r16,9
brne Out ;Springe nach Out wenn R16 nicht gleich 9
ldi r17,ob11110110
inc r18 ;Wenn die neunte stelle erreicht/Überschritten wird,
Out: ;wird das register 18 um eins erhöht.
out portd,r17 ;Portd gibt den Wert r17 aus
clr r17 ;r17 wird gelöscht
;Sekundenstelle Zehner-----------------------------------------------------------------------------------------
Null1:
cpi r18,0
brne Eins1
ldi r17,0b11111100
Eins1:
cpi r18,1
brne Zwei1
ldi r17,0b01100000
Zwei1:
cpi r18,2
brne Drei1
ldi r17,0b11011010
Drei1:
cpi r18,3
brne Vier1
ldi r17,0b11110010
Vier1:
cpi r18,4
brne Fünf1
ldi r17,0b01100110
Fünf1:
cpi r18,5
brne Out1
ldi r17,0b10110110
inc r19
Out1:
out portd,r17
clr r17
;Minutenstelle einer----------------------------------------------------------------------------------------
Null2:
cpi r19,0
brne Eins2
ldi r17,0b11111100
Eins2:
cpi r19,1
brne Zwei2
ldi r17,0b01100000
Zwei2:
cpi r19,2
brne Drei2
ldi r17,0b11011010
Drei2:
cpi r19,3
brne Vier2
ldi r17,0b11110010
Vier2:
cpi r19,4
brne Fünf2
ldi r17,0b01100110
Fünf2:
cpi r19,5
brne Sechs2
ldi r17,0b10110110
Sechs2:
cpi r19,6
brne Sieben2
ldi r17,0b10111110
Sieben2:
cpi r19,7
brne Acht2
ldi r17,0b11100000
Acht2:
cpi r19,8
brne Neun2
ldi r17,ob11111110
Neun2:
cpi r19,9
brne Out2
ldi r17,ob11110110
Out2:
out portd,r17
clr r17
rjmp Null
;Fortsetzung folgt!