Forum: Mikrocontroller und Digitale Elektronik Frage zur ISR - (Asm Atmega8)


von Peter (Gast)


Lesenswert?

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?

von Peter II (Gast)


Lesenswert?

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.

von Philipp K. (philipp_k59)


Angehängte Dateien:

Lesenswert?

Die Theorie als C Lösung zum reinschauen hab ich mal angehängt.

Ist ein Atmel Application Sheet Anhang der AVR_134.

von Jakob (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.