Variable um 1 erhöhen + ausgeben mit variablen

Gast #47872
Lesenswert?
• ▲
▼
tach!!

ich meld mich mal wieder mit fragen:

wie ihr vielleicht schon wisst hab ich vor eine digitaluhr zu bauen.
ich realisiere die mit schieberegistern. da ich 6 stellen hab (2 für
stunden, 2 für minuten und 2 für sekunden) benötige ich für jede
anzeige ein 8-bit schieberegister. wenn alle schieberegister
angeschlossen sind, habe ich also ein 48-bit schieberegistern.
die ausgabe erfolgt über PD4, 5 und 6. PD4 ist clock, PD5 ist data und
PD 6 ist strobe. momentan ist jede ziffer in einer variablen
gespeichert. eine eins sieht z.b. so aus:

eins:   sbi PORTD, 4                ;der punkt
  cbi PORTD, 4

  sbi PORTD, 4                  ;segment g
  cbi PORTD, 4

  sbi PORTD, 4                  ;segment f
  cbi PORTD, 4

  sbi PORTD, 4                  ;segment e
  cbi PORTD, 4

  sbi PORTD, 4                   ;segment d
  cbi PORTD, 4

  sbi PORTD, 5                   ;data wird auf 1 gesetzt
  sbi PORTD, 4                   ;segment c (leuchtet)
  cbi PORTD, 4

  sbi PORTD, 4                  ; segment b
  cbi PORTD, 4
  cbi PORTD, 5                  ; data wieder auf null

  sbi PORTD, 4                  ;segment a (leuchtet nicht)
  cbi PORTD, 4

        sbi PORTD, 6                  ;strobe (die 8 bits
        cbi PORTD, 6                   werden gesetzt


nun brauche ich einen "counter" der die variable "sekunde" um 1
erhöht (vojn 0 auf 1 auf2 auf 3 auf 4 auf 5 auf 6.....) ein zweites
sub-programm soll dann zur passenden variable der ziffer springen (bei
6 zu sechs bei 7 zu sieben) wenn nun die zahl 0 wieder erricht wird,
soll die variable "zehnersekunden" auf 1 gesetzt werden... und so
weiter bis stunden....
wichtig ist, das immer alle 48bis ausgegeben werde... um z.b. 00:00:03
darzustellen muss ich 5 mal die null und dann die eins ins
schieberegister eingeben. das ist aber unwichtig.. ich brauche eher
diesen "counter" und die "auswerte" routine...
Gast #47873
Lesenswert?
• ▲
▼
Und wo ist, von der unschlagbaren Umständlichkeit des Programms einmal
abgesehen, das Problem? Du bist doch aufm richtigen Weg.

sekunden_einer inkrementieren
wenn sekunden_einer=10 dann sekunden_einer=0 und sekunden_zehner
inkrementieren...
wenn sekunden_zehner=6 dann sekunden_zehner=0 und minuten_einer
inkrementieren
usw..
Gast #47874
Lesenswert?
• ▲
▼
ja, das ist natürlich klar... aber wie gehen die befehle dazu??? ich hab
AVR studio 5.6. und da in den "help topics" stehen irgendwo auch die
verschiedenen befehle, wobei ich mit denen net weit gekommen binn, weil
die beispiele beschissen sind. klann ich das so wie in basic
schreiben?? also sekunden_einer = sekunden_einer + 1??

zum thema umständlichkeit: wie gehts denn einfacher??
Gast #47875
Lesenswert?
• ▲
▼
Guckst Du http://www.avr-asm-tutorial.net/avr_de/beginner/index.html ,
mit den Befehlen cp, cpi, breq und brne kommst Du wahrscheinlich aus.
Aber les Dir ruhig mal den Rest durch... kann nicht schaden...

Und weniger umständlich wärs wenn Du für alle Zeichen die Du auf den
Anzeigen darstellen willst einen Lookup-Table einrichtest der die
entsprechenden Bitmuster enthält; dann kannst Du die Sekunden-Einer,
Zehner usw zur indirekten Adressierung benutzen. Guckst Du
http://www.avr-asm-tutorial.net/avr_de/beginner/register.html#Pointer

Have phun!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren