PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : anfänger mit countdown broblem



avrlehrling
22.12.2008, 16:17
hallo

hab ein kleines prob. mit meinem countdown programm.
ich währe euch sehr dankbar wenn ihr mir einen tip geben würdet wie ich es meistern kann.

ich hab mir ein platinenbelichter zusammen geschustert und bin dabei einen timer zu basteln der 2 7seg. anzeigen, 3 taster(t1=-1s, t2=+1s und t3=starten) und in der lage ist den belichter nach runterzählen aus zuschalten.

nun das prob. ist das jedes mal wenn eine 10 vorhanden ist, die 0 beibehält und die 1 dec. also hab ich statt 09 auf einmal 00.
das gleiche gillt auch wenn ich inc. will wenn zb. eine 09 vorhanden ist und ich t2 drücke hab ich eine 19 statt 10.

ich hab das noch nicht in den avr geladen und auch nicht in avr studio laufen lassen...ich habe den code stück für stück gelesen und dann ist es mir aufgefallen!
probiert hab ich auch vieles aber bin nie auf die richtige bahn gekommen!!

mein problem code:


;ZÄHLPROZEDUR
zähler-:

cpi einer, 0
breq zehnerdown
dec einer
rjmp einer_füll

zähler+:

cpi einer, 9
breq zehnerup
inc einer
rjmp einer_füll

zehnerup:

cpi zehner, 9
breq input
inc zehner
rjmp zehner_füll

zehnerdown:

cpi zehner, 0
breq input
dec zehner
rjmp zehner_füll

ganzer code:

.include "m8def.inc"

.org 0x000
rjmp start

.org ovf1addr
rjmp zähler-
start:
;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++
;DEN REGISTERN NAMEN ZUORDNEN ZUR BESSEREN ERKENNUNG
.def null = r0
.def eins = r1
.def zwei = r2
.def drei = r3
.def vier = r4
.def funf = r5
.def sechs = r6
.def sieben = r7
.def acht = r8
.def neun = r9
.def ausgabeE = r10
.def ausgabeZ = r11
.def eingabe = r15
.def einer = r16
.def zehner = r17
.def sichern = r12
.def prog = r13
.equ taster = pind
.equ t1 = 0x01 ;taster für -5s
.equ t2 = 0x02 ;taster für +5s
.equ t3 = 0x04 ;taster für das starten des programmes


;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++
;NUMMERN FÜR DIE 7SEGMENTE EINGEBEN

ldi null,

;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++
; STACK, EIN- UND AUSGÄNGE FESTLEGEN

ldi r18, high (ramend) ;stack
out sph, r18
ldi r18, low (ramend)
out spl, r18

ldi r18, oxff ;pb0 bis pb7 als ausgang
out ddrb, r18 ;für die kathoden am 7segmen

ldi r18, 0x03 ;pc0 und pc1 als ausgang
out ddrc, r18 ;für die gem. anode am 7segmend

ldi r18, 0x00 ;pd0 bis pd2 als eingang
out ddrd, r18 ;für die taster t1 bis t3

ldi r18, 0x07 ;mit den internen pull up widerständen
out portd, r18

ldi r18, (1<<cs11) | (1<<cs10) ;prescaller ist auf 1024 gesetzt für 1s
out tccr1b, r18 ;tccr1b ist für prescaller zuständig
ldi r18, (1<<toie1) ;toie1 = 1 d.h. int. ist eingeschaltet
out timsk, r18 ;timst ist für int. einstellung zusaändig

ldi prog, 0

;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++
;VOREINSTELLUNGEN NACH WAHL
;
;10s AUSWAHL
; ldi einer, 0
; ldi ausgabeE. null
; ldi zehner, 1
; ldi ausgabeZ. eins
;
5s AUSWAHL
ldi einer, 5
ldi ausgabeE, funf
ldi zehner, 0
ldi ausgabeZ, null
;
;0s AUSWAHL
; ldi einer, 0
; ldi ausgabeE. null
; ldi zehner, 0
; ldi ausgabeZ. Null
;
;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++
;TASTEN ABFRAGEN UND AUSGEBEN DER ZIFFERN

input:
rcall 5ms ;warten 5ms
cbi portc, 0 ;zehneranzeige ausschalten

sbi portc, 1 ;eineranzeige einschalten
out portb, ausgabeE ;einer anzeigen
rcall 5ms ;warten 5ms

cbi portc, 1 ;eineranzeige ausschalten
sbi portc, 0 ;zehneranzeige einschalten
out portb, ausgabeZ ;zehner anzeigen
cpi prog, 1
breq programm
;----------------------------------------------------------------------------------------

in eingabe, taster ;an portd anliegende werte einlesen
cpi eingabe, t1 ;ist t1 gedrückt?
breq zähler- ;spring zu -5s
cpi eingabe, t2 ;ist t2 gedrückt?
breq zähler+ ;spring zu +5s
cpi eingabe, t3 ;ist t3 gedrückt?
breq programm ;spring zum programm
rjmp input ;weiter einlesen

;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++
;ZÄHLPROZEDUR
zähler-:

cpi einer, 0
breq zehnerdown
dec einer
rjmp einer_füll

zähler+:

cpi einer, 9
breq zehnerup
inc einer
rjmp einer_füll

zehnerup:

cpi zehner, 9
breq input
inc zehner
rjmp zehner_füll

zehnerdown:

cpi zehner, 0
breq input
dec zehner
rjmp zehner_füll
;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++
;ZEHNERREGISTER MIT DEN ZAHLEN FÜLLEN
zehner_füll:
cpi zehner, 0
breq zehnernull
cpi zehner, 1
breq zehnereins
cpi zehner, 2
breq zehnerzwei
cpi zehner, 3
breq zehnerdrei
cpi zehner, 4
breq zehnervier
cpi zehner, 5
breq zehnerfunf
cpi zehner, 6
breq zehnersechs
cpi zehner, 7
breq zehnersieben
cpi zehner,8
breq zehneracht
cpi zehner, 9
breq zehnerneun
;-----------------------------------------
zehnernull:
ldi ausgabeZ, null
rjmp input
zehnereins:
ldi ausgabeZ, eins
rjmp input
zehnerzwei:
ldi ausgabeZ, zwei
rjmp input
zehnerdrei:
ldi ausgabeZ, drei
rjmp input
zehnervier:
ldi ausgabeZ, vier
rjmp input
zehnerfunf:
ldi ausgabeZ, funf
rjmp input
zehnersechs:
ldi ausgabeZ, sechs
rjmp input
zehnersieben:
ldi ausgabeZ, sieben
rjmp input
zehneracht:
ldi ausgabeZ, acht
rjmp input
zehnerneun:
ldi ausgabeZ, neun
rjmp input
;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++
;EINERREGISTEN MIT DEN ZAHLEN FüLLEN
einer_füll:
cpi einer, 0
breq einernull
cpi einer, 1
breq einereins
cpi einer, 2
breq einerzwei
cpi einer, 3
breq einerdrei
cpi einer, 4
breq einervier
cpi einer, 5
breq einerfunf
cpi einer, 6
breq einersechs
cpi einer, 7
breq einersieben
cpi einer, 8
breq eineracht
cpi einer, 9
breq einerneun
;-----------------------------------------
einernull:
ldi ausgabeE, null
rjmp input
einereins:
ldi ausgabeE, eins
rjmp input
einerzwei:
ldi ausgabeE, zwei
rjmp input
einerdrei:
ldi ausgabeE, drei
rjmp input
einervier:
ldi ausgabeE, vier
rjmp input
einerfunf:
ldi ausgabeE, funf
rjmp input
einersechs:
ldi ausgabeE, sechs
rjmp input
einersieben:
ldi ausgabeE, sieben
rjmp input
eineracht:
ldi ausgabeE, acht
rjmp input
einerneun:
ldi ausgabeE, neun
rjmp input
;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++
;HAUPTPROGRAMM
programm:
ldi sichern, sreg
push sichern
ldi prog, 1
sei
sbi portb, 7


ende:

cli
cbi portb, 7
ldi prog, 0
pop sichern
ldi sreg, sichern
rjmp input

;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++
;WARTEZEIT FÜR DIE ANZEIGE
5ms:
ldi r30, 0x21
loop0: ldi r31, 0xC9
loop1: dec r31
brne loop1
dec r30
brne loop0
ret

wkrug
22.12.2008, 19:08
Das kann auch gar nicht anders sein.

Du dekrementierst die einer.
Dann vergleichst Du mit 0 und springst dann aus der Routine raus.

Also bei 0 wird die Routine dec zehner angesprungen.
Wenn die Zehner vorher 1 waren weden sie durch die dec zener Routine auf 0 gesetzt, die einer waren ja schon 0 und Du bekommst als Ergebnis 00 Ausgegeben.

Eventuell wär es sinnvoller mit BRMI zu verzweigen, wenn der Zähler dann 255 hat und in der dec zener Routine den Wert bei bedarf wieder auf 9 oder 0 zu setzen.

avrlehrling
22.12.2008, 19:56
Ich danke dir wkrug für deine Antwort

Genau das ist mein prob. was ich schon erwähnt hab:wink:
Das mit BRMI werd ich mal ausprobieren.

hat jemand eventuell ein beispiel for me :)

avrlehrling
22.12.2008, 23:42
Ich glaube das müsste es sein :mrgreen:

Sollte ich was falsches hingeschmiert haben, bezieht sich auf meinen ganzen Code, währe ich immer noch dankbar für verbesserungsvorschläge.


zähler-:
dec einer
brmi füll9
rjmp einer_füll
füll9:
ldi einer, 9
ldi ausgabeE, neun
rjmp zehnerdown
zehnerdown:
cpi zehner, 0
breq error
dec zehner
rjmp zehner_füll
error0:
ldi einer, 0
ldi ausgabeE, 0
rjmp input
zähler+:
cpi einer, 9
breq füll0
inc einer
rjmp einer_füll
füll0:
ldi einer, 0
ldi ausgabeE, null
rjmp zehnerup
zehner up:
cpi zehner, 9
breq error9
inc zehner
rjmp zehner_füll
error9:
ldi einer, 9
ldi ausgabeE, neun
rjmp input