Forum: Mikrocontroller und Digitale Elektronik ISR macht Newbie fertig :P


von Fusel (Gast)


Lesenswert?

Hallo zusammen,

wie im Betreff schon zugegeben: ich bin ein Newbie.

Und weil ich ein bisschen blöd und zu faul bin, mich mit dem 
Fach-Chinesisch in der Programmiersprache auseinanderzusetzen, habe ich 
mich (vorerst?) auf LunaAVR eingeschossen - da verstehe ich wenigstens 
noch so ein bisschen was ich da scripte.

Nun experimentiere ich ein wenig mit dem Timer1 herum und clonte fix das 
Script für eine Uhr.
1
const  F_CPU        = 4000000
2
const  T1_PRESCALER  = 64
3
const  T1_10MS_TICKS  = 625
4
avr.Device        = atmega32
5
avr.clock         = F_CPU
6
avr.stack        = 128
7
8
'******** Ports definieren und mit Aliasen versehen ***********************
9
#define Lcd4PinRS as portd.6
10
#define Lcd4PinE as portd.5
11
' do not connect the D0-D3 pins of Lcd
12
#define Lcd4PinD4 as portd.4
13
#define Lcd4PinD5 as portd.3
14
#define Lcd4PinD6 as portd.2
15
#define Lcd4PinD7 as portd.1
16
17
'******** Variablen definieren ********************************************
18
dim zehntels as byte
19
dim sekunden,minuten,stunden,monat,tag,wtag,modus as byte
20
dim jahr as word
21
dim jahr_berechn as single
22
dim d1,d2,d3,d4,tmr_txt,al_txt,wtagname as string
23
24
'******** Initialisieren **************************************************
25
timer1.clock = T1_PRESCALER
26
timer1.cmpa.isr = taktung
27
timer1.cmpa.value = T1_10MS_TICKS
28
timer1.cmpa.enable
29
timer1.enable
30
avr.Interrupts.Enable
31
32
Lcd4.Init()
33
tag=1
34
monat=1
35
jahr=2014
36
wtag=0
37
lcd4.cls()
38
39
Do
40
41
if zehntels > 99 then
42
zehntels=0
43
sekunden=sekunden+1
44
tag=tag+1
45
wtag=wtag+1
46
endif
47
if sekunden > 59 then
48
sekunden=0
49
minuten=minuten+1
50
endif
51
if minuten > 59 then
52
minuten=0
53
stunden=stunden+1
54
endif
55
if stunden > 23 then
56
stunden=0
57
endif
58
59
60
if modus=0 then
61
lcd4.Cursorpos(0,0)
62
lcd4.text(format("00",stunden)+":"+format("00",minuten)+":"+format("00",sekunden)+"."+format("+00",zehntels))
63
lcd4.Cursorpos(1,0)
64
lcd4.text(wtagname+", "+format("00",tag)+"."+format("00",monat)+". "+tmr_txt)
65
66
else
67
endif
68
69
Loop
70
71
72
isr taktung
73
zehntels=zehntels+1
74
Timer1.Value = 0
75
endisr
76
#include "class\lcd4.luna"
Funktioniert. Nach 2 Stunden habe ich keine auffälligen Abweichungen bei 
der Uhrzeit.

Aber kaum ergänze ich die Hauptschleife noch um ein bisschen Code, macht 
sich ein deutlicher Unterschied von -1sek/Minute bemerkbar.
1
const  F_CPU        = 4000000
2
const  T1_PRESCALER  = 64
3
const  T1_10MS_TICKS  = 625
4
avr.Device        = atmega32
5
avr.clock         = F_CPU
6
avr.stack        = 128
7
8
'******** Ports definieren und mit Aliasen versehen ***********************
9
#define Taste_ok as PortA.1
10
Taste_ok.mode  = input,pullup
11
12
#define Lcd4PinRS as portd.6
13
#define Lcd4PinE as portd.5
14
' do not connect the D0-D3 pins of Lcd
15
#define Lcd4PinD4 as portd.4
16
#define Lcd4PinD5 as portd.3
17
#define Lcd4PinD6 as portd.2
18
#define Lcd4PinD7 as portd.1
19
20
'******** Variablen definieren ********************************************
21
dim zehntels as byte
22
dim sekunden,minuten,stunden,monat,tag,wtag,modus as byte
23
dim jahr as word
24
dim jahr_berechn as single
25
dim d1,d2,d3,d4,tmr_txt,al_txt,wtagname as string
26
27
'******** Initialisieren **************************************************
28
timer1.clock = T1_PRESCALER
29
timer1.cmpa.isr = taktung
30
timer1.cmpa.value = T1_10MS_TICKS
31
timer1.cmpa.enable
32
timer1.enable
33
avr.Interrupts.Enable
34
35
Lcd4.Init()
36
tag=1
37
monat=1
38
jahr=2014
39
wtag=0
40
lcd4.cls()
41
42
Do
43
44
if zehntels > 99 then
45
zehntels=0
46
sekunden=sekunden+1
47
tag=tag+1
48
wtag=wtag+1
49
endif
50
if sekunden > 59 then
51
sekunden=0
52
minuten=minuten+1
53
endif
54
if minuten > 59 then
55
minuten=0
56
stunden=stunden+1
57
endif
58
if stunden > 23 then
59
stunden=0
60
61
jahr_berechn=(jahr-2000) / 4
62
jahr_berechn=jahr_berechn - floor(jahr_berechn)
63
if monat=4 or monat=6 or monat=9 or monat=11 then
64
if tag>30 then
65
tag=1
66
monat=monat+1
67
endif
68
elseif monat=2 then
69
if jahr_berechn > 0 then
70
if tag > 28 then
71
tag=1
72
monat=monat+1
73
endif
74
else
75
if tag > 29 then
76
tag=1
77
monat=monat+1
78
endif
79
endif
80
81
else
82
if tag>31 then
83
tag=1
84
monat=monat+1
85
endif
86
endif
87
88
endif
89
if wtag>6 then
90
wtag=0
91
endif
92
93
94
if monat>12 then
95
monat=1
96
jahr=jahr+1
97
endif
98
if wtag=0 then
99
wtagname="So"
100
elseif wtag=1 then
101
wtagname="Mo"
102
elseif wtag=2 then
103
wtagname="Di"
104
elseif wtag=3 then
105
wtagname="Mi"
106
elseif wtag=4 then
107
wtagname="Do"
108
elseif wtag=5 then
109
wtagname="Fr"
110
else
111
wtagname="Sa"
112
endif
113
114
115
if modus=0 then
116
lcd4.Cursorpos(0,0)
117
lcd4.text(format("00",stunden)+":"+format("00",minuten)+":"+format("00",sekunden)+" "+al_txt+" "+format("+00",zehntels)+"'C")
118
lcd4.Cursorpos(1,0)
119
lcd4.text(wtagname+", "+format("00",tag)+"."+format("00",monat)+". "+tmr_txt)
120
'waitms 10
121
else
122
endif
123
124
125
if taste_ok=0 then
126
sekunden=0
127
minuten=0
128
stunden=0
129
zehntels=0
130
waitms 350
131
endif
132
133
Loop
134
135
136
isr taktung
137
zehntels=zehntels+1
138
Timer1.Value = 0
139
endisr
140
#include "class\lcd4.luna"

Kann mir bitte jemand in leicht verständlichen Worten erklären, worin 
hier der Fehler liegt?

Gruß
Fusel

von ich (Gast)


Lesenswert?

Wenn du jetzt noch verraten würdest, was nicht funktioniert, kann an 
vielleicht auch versuchen zu helfen.
Du schreibst einen Quelltext hin und sagst: "Wo ist der Fehler?"
Das klingt mir ein wenig nach Bilderrätsel (nur eben mit Quelltext statt 
Bild).

von Karl H. (kbuchegg)


Lesenswert?

Fusel schrieb:

> Kann mir bitte jemand in leicht verständlichen Worten erklären, worin
> hier der Fehler liegt?

Sieh das Hochzählen der Uhr als eine unteilbare Einheit an.
Sprich: Das Hochzählen der Uhr muss ZUR GÄNZE innerhalb  der ISR 
durchgeführt werden.

So wie du das jetzt machst, bist du davon abhängig, dass ein Durchlauf 
durch deine Hauptschleife im Hauptprogramm nicht länger als 1/10 Sekunde 
dauert. Das kann bei Aufwändigeren OPerationen, wie zb dem Aufbereiten 
für eine Anzeige schon mal der Fall sein, das das länger dauert. DEINE 
Uhr funktioniert nur dann richtig, wenn das nicht der Fall ist.

So rum
1
isr taktung
2
3
  Timer1.Value = 0
4
5
  zehntels=zehntels+1
6
  if zehntels > 99 then
7
    zehntels = 0
8
    sekunden = sekunden+1
9
    if sekunden > 59 then
10
      sekunden = 0
11
      minuten = minuten+1
12
      if minuten > 59 then
13
        minuten = 0
14
        stunden = stunden+1
15
        if stunden > 23 then
16
          stunden = 0
17
          tag = tag+1
18
          wtag = wtag+1
19
        endif
20
      endif
21
    endif
22
  endif
23
24
endisr

ist es egal, wie lange dein Hauptprogramm für einen Durchlauf benötigt. 
Die Uhr zählt im Zehntelsekundentakt korrekt und ununterbrechbar hoch. 
Solange die Interrupts aktiviert sind, verlierst du keine Zeit.
Du magst zwar an der Anzeige eventuell dann eine Zeiterhöhung nicht 
sehen, intern wird sie aber registriert und korrekt bearbeitet.

Die Uhrzeit ist ein 'Objekt', welches in seiner Gesamtheit zu betrachten 
ist. Sekunden, Minuten, Stunden, etc. gehören zusammen. Behandle sie 
auch als solche und vor allen Dingen 'in einem Rutsch'.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

PS:
Wenn du ein Datum mitführst, dann muss natürlich auch das innerhalb der 
ISR behandelt werden und mit hochgezählt werden. Deinen schlimmsten ISR 
Fall hast du daher am 31. Dezember xxxx um 23:59:59 und 9 
Zehntelsekunden, wenn sich mit der nächsten Zehntelsekunde dann auch 
tatsächlich alle Einzelvariablen ändern. Aber da dies alles in der ISR 
geschieht, hast du die Gewissheit, dass  da nichts verloren geht und die 
interne Zeit auch korrekt weiter läuft. Denn immerhin hast du für die 
komplette Operation 1/10 Sekunden Zeit. Mehr als genug Zeit um ein paar 
Variablen um jeweils 1 weiter zu stellen.

von Karl H. (kbuchegg)


Lesenswert?

PS2:

Wieso
1
  zehntels=zehntels+1
2
  if zehntels > 99 then

heisst das eigentlich zehentels. Offenbar handelt es sich hier gar nicht 
um Zehntel-Sekunden sondern um Hunderstel.
Mit irreführenden Variablennamen hat sich schon so mancher ins Knie 
geschossen.

Ändert aber nichts am Prinzip. Auch 1 Hunderstel-Sekunde ist immer noch 
mehr als genug Zeit um 7 Variablen gegebenenfalls um jeweils 1 weiter zu 
zählen.

: Bearbeitet durch User
von Fusel (Gast)


Lesenswert?

@ich:

ich schrieb:
> Wenn du jetzt noch verraten würdest, was nicht funktioniert, kann an
> vielleicht auch versuchen zu helfen.
> Du schreibst einen Quelltext hin und sagst: "Wo ist der Fehler?"

Hatte ich. Ich muss aber zugeben das vor lauter Quelltext die Frage 
schwer zu erkennen war.

@Karl Heinz:
Stimmt, Variablennamen sollten schon eindeutig sein ... ich kenne dies 
aus PHP. Versuche ich mir auch hier mal anzugewöhnen.

Danke schon einmal für den ersten Denkansatz. :-)
Hm ... wenn ich Dich richtig verstanden habe, dann muss ich eigentlich 
alles, was rechnerisch mit meiner "Uhrzeit" zu tun hat, in die ISR 
packen, um keine Zeitsprünge zu erhalten. Aber Auswertungen wie z.B. den 
Wochentagen einen Namen zu geben oder eventuell für eine Alarmfunktion 
kommt dann in die Hauptschleife?
Wenn ja, dann habe ich die Infos im Netz, die ISR inhaltlich so kurz wie 
möglich zu halten, wohl falsch verstanden.
Funktions-Aufrufe sollte ich lieber auch nicht in die ISR setzen, oder?

Gruß
Fusel

von Karl H. (kbuchegg)


Lesenswert?

Fusel schrieb:

> Wenn ja, dann habe ich die Infos im Netz, die ISR inhaltlich so kurz wie
> möglich zu halten, wohl falsch verstanden.

so kurz wie möglich bedeutet nicht, dass man gar nichts machen darf.
In deinem Fall ist es vital, dass die Uhrzeit zur rechten Zeit und 
vollständig weiter gezählt wird.

von Fusel (Gast)


Lesenswert?

Moin,

nun, ich habe mal mehrere Szenarien durchprobiert und komme noch immer 
auf keinen grünen Zweig.
1: Alles zeitrechnerisch relevante für die Uhr und das Datum 1:1 in die 
ISR verschoben. Die Uhr geht nach wie vor nach bei 
-0,010897sek/echtzeitsekunde.
2: Alles in der ISR, was mit dem Datum zu tun hat, auskommentiert. 
Wieder geht die Uhr um -0,006111sek/echtzeitsekunde nach.
3: den ISR-Code mit dem Code ersetzt, der hier gestern um 17:55 gepostet 
wurde. Meine Atmega-Uhr geht um -0,009333sek/echtzeitsekunde nach.

Natürlich habe ich die Variable "Zehntel" auch umbenannt in 
"Hundertstel", da sich darin ja schliesslich die Hundertstel Sekunden 
befinden.

Jetzt bin ich mit meinem Latein aber sowas vom am Ende.
Vielleicht die Fuses? Ich habe an dem Atmega32 einen 4Mhz-Quarz (mit 
22pF Kondensatoren) entsprechend der Tuts angeschlossen. Beschrieben 
wird der µC mit myAVR ProgTool, da sich alles andere nicht wirklich mit 
meinem SelfMade-ISP-Adapter verträgt. Und da sind die 
Einstellmöglichkeiten aufgrund der riesen Auswahl verwirrend.
Die Fuses sind wie folgt gesetzt:
LowFuse: 0x3F (00111111)
HighFuse: 0xD9 (11011001)
Lockbits: Lasse ich die Griffel von. :P

Gruß
Fusel

von Gästle (Gast)


Lesenswert?

Das hier ist doch wohl falsch!

Do

if zehntels > 99 then
zehntels=0
sekunden=sekunden+1
                            tag=tag+1
                            wtag=wtag+1
endif
if sekunden > 59 then
sekunden=0
minuten=minuten+1
endif
if minuten > 59 then
minuten=0
stunden=stunden+1
endif
if stunden > 23 then
stunden=0


der Tag zählt jede sekunde hoch!

von Karl H. (kbuchegg)


Lesenswert?

Fusel schrieb:

> Jetzt bin ich mit meinem Latein aber sowas vom am Ende.

Kannst du dein Luna Basic dazu nötigen, den Assembler Code der erzeugten 
ISR auszugeben?

Obwohl: so unperformant kann das gar nicht sein, dass ein Inkrementieren 
von 7 Variablen derart lange daueren würde.

von Route_66 H. (route_66)


Lesenswert?

Fusel schrieb:
> if zehntels > 99 then
> zehntels=0
> sekunden=sekunden+1
> tag=tag+1
> wtag=wtag+1
> endif

Warum Du bei vollen Hundertsteln gleich noch Datum und Wochentag 
hochzählst, musst Du mal ertklären.

Fusel schrieb:
> isr taktung
> zehntels=zehntels+1
> Timer1.Value = 0
> endisr

Wenn du in der ISR bei Timer.1Value= 0 setzt, hat der Timer eigentlich 
schon einige Takte weiter gezählt und Du holst ihn wieder auf Null 
zurück. Damit entsteht der Fehler, denn bis zum nächsten INT vergehen 
dadurch mehr als 625 Timerticks.

von Karl H. (kbuchegg)


Lesenswert?

Route 66 schrieb:

> Warum Du bei vollen Hundertsteln gleich noch Datum und
> Wochentag hochzählst, musst Du mal ertklären.

Ich denke mal, das war ein Test, damit er sieht ob seine Ausgabe 
funktioniert, ohne dazu jedesmal einen ganzen Tag warten zu müssen :-)



> Wenn du in der ISR bei Timer.1Value= 0 setzt, hat der Timer eigentlich
> schon einige Takte weiter gezählt und Du holst ihn wieder auf Null
> zurück. Damit entsteht der Fehler, denn bis zum nächsten INT vergehen
> dadurch mehr als 625 Timerticks.

Kommt drauf an, ob sein Luna Basic auch den Teiler des Prescalers zurück 
setzt oder nicht.

: Bearbeitet durch User
von Route_66 H. (route_66)


Lesenswert?

Karl Heinz schrieb:
> Kommt drauf an, ob sein Luna Basic auch den Teiler des Prescalers zurück
> setzt oder nicht.

Kann er ja einfach ausprobieren, wenn er einen Autoreload programmiert, 
und den Timer nuicht selbst setzt.

von Peter D. (peda)


Lesenswert?

Route 66 schrieb:
> Wenn du in der ISR bei Timer.1Value= 0 setzt, hat der Timer eigentlich
> schon einige Takte weiter gezählt

Daher ist der Clear-On-Compare Modus das Mittel der Wahl.
Oder den Wert bis zum nächsten Compare-Interrupt auf das 
Compare-Register addieren.

von Fusel (Gast)


Angehängte Dateien:

Lesenswert?

Also ... das die Wochentage und Tage jede Sekunde mitgezählt werden, war 
aus Testzwecken. Habe ich natürlich noch gestern Abend rausgenommen den 
Unfug. :-)

Karl Heinz schrieb:
> Kannst du dein Luna Basic dazu nötigen, den Assembler Code der erzeugten
> ISR auszugeben?

Ich habe mal eine Datei angehangen. Scheint so, als wäre es die 
Assembler-Datei von Luna. Allerdings vom gesamten "Script".

Route 66 schrieb:
> Wenn du in der ISR bei Timer.1Value= 0 setzt, hat der Timer eigentlich
> schon einige Takte weiter gezählt und Du holst ihn wieder auf Null
> zurück.

Und wie umgeht man das? Wie gesagt: Ich bin Newbie ... aber lerne gerne 
hinzu.

Gruß
Fusel

von Fusel (Gast)


Lesenswert?

Sorry für den Nachtrag. Aber ich bemühe mich ja auch und will mir nicht 
nur alles vorkauen lassen.

Demnach könnte meine Lösung sein, in dem ich in der ISR
Timer1.Value = 0
rausnehme und stattdessen
Timer1.CmpA.Clear.Enable (Automatisches Nullsetzen des Zählers bei 
Gleichheit)
nach der Timer-Inititialisierung notiere?

von Karl H. (kbuchegg)


Lesenswert?

Fusel schrieb:
> Sorry für den Nachtrag. Aber ich bemühe mich ja auch und will mir nicht
> nur alles vorkauen lassen.
>
> Demnach könnte meine Lösung sein, in dem ich in der ISR
> Timer1.Value = 0
> rausnehme und stattdessen
> Timer1.CmpA.Clear.Enable (Automatisches Nullsetzen des Zählers bei
> Gleichheit)
> nach der Timer-Inititialisierung notiere?

Ja, könntest du machen.
Wenn es da nicht ein Problem gäbe.

Auch das 0-Setzen des Timers ist eine Zählaktion.
Wenn du also einen Compare Match alle zb 180 Timer-Taktzyklen willst, 
dann musst du 179 ins Compare Register laden, denn der Schritt von 179 
auf 0 ist ja auch eine Zählaktion.
Das geht aber insofern nicht, weil du ja einen Vorteiler von 64 benutzt. 
d.h. wenn du einen um 1 kleineren Wert ins Compare Register lädst, dann 
verkürzt du den zeitlichen Abstand um 64 Quarz-Takte und nicht nur um 
einen.

Gut, das ist jetzt insofern egal, weil dein Quarz ganz sicher nicht 
exakt 4000000 Schwingungen pro Sekunde macht, sondern ein wenig mehr 
oder weniger.

Allerdings ist eine Abweichung von 1 Hunderstel pro Sekunde viel zu viel 
um damit erklärt zu werden. Da stimmt noch was anderes nicht. 0.0093 
Sekunden ist um Größenordnungen daneben.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Da T1 16bittig ist, kann man den Vorteiler ruhig auf 1 setzen.

von Karl H. (kbuchegg)


Lesenswert?

Gibt es im Luna Basic einen Optimizer, den man aktivieren kann?

So richtig berühmt ist das nicht gerade, was der Compiler da draus 
macht. Da hat er viel ungenutzt liegen gelassen.
1
ISR_classAvrTaktung:
2
  push    ZH
3
  push    ZL
4
  in    ZH,SREG
5
  push    ZH
6
  push    R0
7
  ldi    ZL,1  ; 0b00000001 0x01 1
8
  clr    ZH
9
__PushAllLoop60:
10
  ld    R0,Z+
11
  push    R0
12
  cpi    ZL,30  ; 0b00011110 0x1E 30
13
  brne    __PushAllLoop60
14
  ;{180}{ hundertstel = hundertstel+1 } ----------------------------------
15
  lds    _HA0,dVarClassAvrHundertstel
16
  subi    _HA0,-1  ; 0b11111111 0xFF -1
17
  sts    dVarClassAvrHundertstel,_HA0
18
  ;{181}{ Timer1.Value = 0 } ---------------------------------------------
19
  ldi    _HA0,0x00  ; 0b00000000 0x00 0
20
  ldi    _HA1,0x00  ; 0b00000000 0x00 0
21
  out    TCNT1H,_HA1
22
  out    TCNT1L,_HA0
23
  ;{182}{ if hundertstel > 9 then } --------------------------------------
24
_if3:
25
  lds    _HA0,dVarClassAvrHundertstel
26
  cpi    _HA0,0x09  ; 0b00001001 0x09 9
27
  brlo    _if3endif
28
  breq    _if3endif
29
_if3endif__brx8:
30
  ;{183}{ hundertstel = 0 } ----------------------------------------------
31
  ldi    _HA0,0x00  ; 0b00000000 0x00 0
32
  sts    dVarClassAvrHundertstel,_HA0
33
  ;{184}{ sekunden = sekunden+1 } ----------------------------------------
34
  lds    _HA0,dVarClassAvrSekunden
35
  subi    _HA0,-1  ; 0b11111111 0xFF -1
36
  sts    dVarClassAvrSekunden,_HA0
37
  ;{185}{ if sekunden > 59 then } ----------------------------------------
38
_if4:
39
  lds    _HA0,dVarClassAvrSekunden
40
  cpi    _HA0,0x3B  ; 0b00111011 0x3B 59
41
  brlo    _if4endif
42
  breq    _if4endif
43
_if4endif__brx9:
44
  ;{186}{ sekunden = 0 } -------------------------------------------------
45
  ldi    _HA0,0x00  ; 0b00000000 0x00 0
46
  sts    dVarClassAvrSekunden,_HA0
47
  ;{187}{ minuten = minuten+1 } ------------------------------------------
48
  lds    _HA0,dVarClassAvrMinuten
49
  subi    _HA0,-1  ; 0b11111111 0xFF -1
50
  sts    dVarClassAvrMinuten,_HA0
51
  ;{188}{ if minuten > 59 then } -----------------------------------------
52
_if5:
53
  lds    _HA0,dVarClassAvrMinuten
54
  cpi    _HA0,0x3B  ; 0b00111011 0x3B 59
55
  brlo    _if5endif
56
  breq    _if5endif
57
_if5endif__brx10:
58
  ;{189}{ minuten = 0 } --------------------------------------------------
59
  ldi    _HA0,0x00  ; 0b00000000 0x00 0
60
  sts    dVarClassAvrMinuten,_HA0
61
  ;{190}{ stunden = stunden+1 } ------------------------------------------
62
  lds    _HA0,dVarClassAvrStunden
63
  subi    _HA0,-1  ; 0b11111111 0xFF -1
64
  sts    dVarClassAvrStunden,_HA0
65
  ;{191}{ if stunden > 23 then } -----------------------------------------
66
_if6:
67
  lds    _HA0,dVarClassAvrStunden
68
  cpi    _HA0,0x17  ; 0b00010111 0x17 23
69
  brlo    _if6endif
70
  breq    _if6endif
71
_if6endif__brx11:
72
  ;{192}{ stunden = 0 } --------------------------------------------------
73
  ldi    _HA0,0x00  ; 0b00000000 0x00 0
74
  sts    dVarClassAvrStunden,_HA0
75
  ;{195}{ endif } --------------------------------------------------------
76
_if6endif:
77
  ;{196}{ endif } --------------------------------------------------------
78
_if5endif:
79
  ;{197}{ endif } --------------------------------------------------------
80
_if4endif:
81
  ;{198}{ endif } --------------------------------------------------------
82
_if3endif:
83
  ;{233}{ endisr } -------------------------------------------------------
84
_isr_classAvrTaktungReturn:
85
  ldi    ZL,30  ; 0b00011110 0x1E 30
86
  clr    ZH
87
__PopAllLoop63:
88
  pop    R0
89
  st    -Z,R0
90
  cpi    Z,1  ; 0b00000001 0x01 1
91
  brne    __PopAllLoop63
92
  pop    R0
93
  pop    ZH
94
  out    SREG,ZH
95
  pop    ZL
96
  pop    ZH
97
  reti

allerdings: über den Daumen bist du da von 1 Millisekunde immer noch 
weit entfernt. Das dürfte alles kein Problem sein.

: Bearbeitet durch User
von Fusel (Gast)


Lesenswert?

Ich schreibe jetzt erstmal den Compare-mach-null da rein und laß die uhr 
auf ein neues laufen. ich müsste dann ja eine trotzdem sehr geringe 
zeitabweichung haben.

Im vorliegendem Falle habe ich einen 4Mhz-Quarz. der mit einem Prescaler 
von 64 betrieben. Also ergäbe das nach Adam-Riese 62500 Ticks/Sekunde. 
Das ganze durch 100 um auf meine Hundertsel Sekunden zu kommen.

Damit würde ich regulär den Compare-Interrupt auf 625 setzen, wenn ich 
den Fehler machen wollen würde, den ich jetzt ohnehin im Code habe. Also 
setze ich ihn auf 624, damit clear-on-compare seinen einen Tick bekommt, 
um das "selbstständige" Zurücksetzen zu ermöglichen ... soweit habe ich 
es im theoretischem richtig verstanden?

Karl Heinz schrieb:
> Gibt es im Luna Basic einen Optimizer, den man aktivieren kann?

Ich sehe zwar immer, das er etwas optimiert, aber heissen soll das ja 
noch lange nix.^^

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.