Guten Abend allerseits,
zuerst möchte ich darauf aufmerksam machen, dass ich
ein Anfänger in der Assembler Programmierung bin.
Leider komme ich Krankheitsbedingt nicht dazu, mich regelmäßig
mit der Assembler Programmierung zu beschäftigen. So ist es auch
nun wieder fast ein Jahr her, dass ich mein Programm bearbeitet habe.
Wie alle Anfänger habe ich ein Uhrenprogramm für ein zweizeiliges
LCD geschrieben und benutze dazu einen Atmega 8.
Soweit funtioniert alles so wie es soll. Allerdings fehlen noch
zwei Dinge:
1. Die Festlegung wieviel Tage die einzelnen Monate haben sollen
( bisher hat jeder Monat 31 Tage)
2. Die Festlegung der Schaltjahre
( um dem Monat FEB 28 oder 29 Tage zuzuordnen)
So halbwegs schwebt mir auch vor wie so etwas umzusetzen ist.
Nur finden die "Prüfungen" dieser Parameter ja in der ISR statt.
Die ISR soll ja möglichst klein gehalten werden?
Sollte man die ISR mit einem RCALL verlassen um diese Prüfungen
vorzunehmen?
Hier mal mein bisheriger Code für den maximalen Monatstag (mtmax)
Datumtag:
push temp1
mov temp1, Monat
cpi temp1, 0
breq Mon1
cpi temp1, 1
breq Mon2
cpi temp1, 2
breq Mon3
cpi temp1, 3
breq Mon4
cpi temp1, 4
breq Mon5
cpi Temp1, 5
breq Mon6
cpi temp1, 7
breq Mon7
cpi temp1, 8
breq Mon8
cpi temp1, 9
breq Mon9
cpi temp1, 10
breq Mon10
cpi temp1, 11
breq Mon11
Mon1:
ldi temp1, 31
mov mtmax, temp1
rjmp Ausstieg
Mon2:
ldi temp1, 28
mov mtmax, temp1
rjmp Ausstieg
.
.
.
.
.
Ausstieg:
pop temp1
Macht man so etwas in der ISR oder springt man mit
einem RCALL aus der ISR raus?
Peter schrieb: > Macht man so etwas in der ISR oder springt man mit > einem RCALL aus der ISR raus? eine ISR sollte nicht länger als notwendig laufen. Ob du daran eine Unterfunktion mit RCALL oder den code direkt ausführst spielt überhaupt keine Rolle. Es erhöht die Laufzeit der ISR. Aber die Berechnung der Tage sollte so schnell sein, das man sie Problemlos in der ISR machen kann. Das schnellste dürfte vermutlich eine Tabelle sein, wo zu jedem Monat die Tage gespeichert sind.
Die Theorie als C Lösung zum reinschauen hab ich mal angehängt. Ist ein Atmel Application Sheet Anhang der AVR_134.
Eine ISR ist zu lang: A: Wenn sie so lange dauert, dass sie ihren eigenen nächsten Aufruf verpasst. B: Wenn sie die zeitgerechte Bearbeitung anderer ISRs stört. C: Wenn das Hauptprogramm nicht mehr genug Zeit für seine Aufgaben hat. Daher lautet die Grundregel: ISR so kurz, wie irgend möglich. Eine ganz simple Uhr kann jede Sekunde in einer ISR den Kalender seit Cäsars Zeiten durchrechen und die aktuelle Zeit zur Anzeige bringen. - Das Hauptprogramm ist eine nutzlose Dauerschleife. Kein Problem, wenn sie kürzer, als eine Sekunde ist! Blöd ist nur, wenn du die Uhr auch bedienen willst! Und das willst du bestimmt, denn sie muss ja mal gestellt werden, oder die Weckzeit muss gestellt werden, oder, oder ... Da wäre eine ISR besser, die z.B. 100 mal pro Sekunde aufgerufen wird. In dieser ISR zählst du die 100stel-Sekunden - bei 100 zählst du einen Sekundenzähler hoch und setzt den 100stel-Sekunden- Zähler wieder auf Null. Dazu zählst du die Drückzeit von Bedientasten, etc... Im Hauptprogramm schaust du nach, ob sich der Sekundenzähler verändert hat! Wenn ja, gibst du die nächste Sekunde, oder auch die nächste Minute und Stunde zur Anzeige aus. Und wenn 23:59:59 abgelaufen ist, kümmerst du dich auch um den Kalender. Wenn das alles in wenigen µs bis einige 100stel Sekunden erledigt ist, kannst du dich noch locker und zeitnah um die Bedientasten kümmern...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.