-         

Ergebnis 1 bis 4 von 4

Thema: anfänger mit countdown broblem

  1. #1
    Neuer Benutzer
    Registriert seit
    23.11.2008
    Ort
    Berlin
    Beiträge
    3

    anfänger mit countdown broblem

    Anzeige

    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:

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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    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.

  3. #3
    Neuer Benutzer
    Registriert seit
    23.11.2008
    Ort
    Berlin
    Beiträge
    3
    Ich danke dir wkrug für deine Antwort

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

    hat jemand eventuell ein beispiel for me

  4. #4
    Neuer Benutzer
    Registriert seit
    23.11.2008
    Ort
    Berlin
    Beiträge
    3
    Ich glaube das müsste es sein

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

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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •