Wenn ich mein Programm simuliere, wo ich eine ADC Auswertung vom ADC
habe:
1
StartADConChanel0_8Bit:
2
push r16
3
in r16, ADMUX
4
andi r16,0b11110000 ;Maskierung
5
ori r16, 0b00000000 ;Maskierung
6
out ADMUX, r16
7
pop r16
8
9
sbi ADCSRA, ADSC ;Starte ADC durch setzen des Bits ADSC
10
ABC0: sbis ADCSRA, ADSC ;Warte bis Messung fertig ist
11
ret ;dann zurück
12
rjmp ABC0 ;ansonsten schau nach bis sie fertig is
Wenn ich dieses Unterprogramm aufrufe, dann braucht das im Asembler
55,75 us, jetzt frage ich mich aber ob das im richtigen Programm auch si
ist, weil wenn ich das ADSC Bit auch händisch setzen kann und dann aus
der Schleife komme, und vielleicht ist das auch so bei meiner richtigen
Messung.
Oder ist das das maximale was mein UP brauchen darf, damit er aufgibt
ohne das ADSC als Rückmeldung zu bekommen?
lg andy
Hi
>damit er aufgibt ohne das ADSC als Rückmeldung zu bekommen?
Wer soll hier aufgeben? Das UP wartet bis der ADC fertig ist. Und das
ist er normalerweise nach 13 ADC-Takten.
MfG Spess
Hi
>das hier passiert im AVR Sim nicht von allein, soweit ich weiß
Das ADSC gelöscht wird, kann ich jetzt nicht 100%-ig beschwören. Aber
der ADC-Complete-Interrupt wird ausgelöst (sofern freigegeben). Und das
hängt beides zusammen.
Mach doch einfach mal einen Breakpoint in die Zeile: 'ret ;dann zurück',
und lass den Simulator laufen. Aber bitte etwas länger warten. Der
Simulator ist um einiges langsamer als der reale AVR.
MfG Spess
spess53 schrieb:> Mach doch einfach mal einen Breakpoint in die Zeile: 'ret ;dann zurück',> und lass den Simulator laufen. Aber bitte etwas länger warten. Der> Simulator ist um einiges langsamer als der reale AVR.
hab ich gemacht, und ich bekomme 27,88 us raus, aber was bringt mir das
jetzt?
>ich hoffe, dein µC-Takt in der Simulation stimmt mit dem später real>eingesetzten überein?
nein das tut er nicht, aber ich berücksichtige das indem ich die Zeit
durch 2 Rechne.
lg andy
Hi
>hab ich gemacht, und ich bekomme 27,88 us raus, aber was bringt mir das>jetzt?
Ich dachte du wolltest wissen, wie lang dein UP dauert?
Wenn du
1. Die Taktfrequenz für deine Simulation richtig eingestellt und
2. den Cycle Counter am Anfang des UP auf Null gestellt hast
entspricht der angezeigte Wert der Laufzeit im realen AVR.
MfG Spess
spess53 schrieb:> 1. Die Taktfrequenz für deine Simulation richtig eingestellt und> 2. den Cycle Counter am Anfang des UP auf Null gestellt hast>> entspricht der angezeigte Wert der Laufzeit im realen AVR.
habe ich gemacht, das UP selbst dauert wenn ich in der ersten Zeile bin
und alles auf 0 ist und ich dann auf Step out gehe, dann kriege ich die
55,75 us. Der letzte Schritt dauert aber mehr als nur 13 Zyklen, wenn
ich händisch durchgehe, und das war dann meine Frage.
lg andy
Hi
>normale zyklen != adc zyklen
Richtig. Du musst den Prescaler des ADC berücksichtigen. Also, wenn du
einen Prescaler von 128 eingestellt hast, dauert ein ADC-Takt 128
Controller-Takte. Und das mal 13 ergibt die Wandlungszeit.
MfG Spess
>2. den Cycle Counter am Anfang des UP auf Null gestellt hastbbb schrieb:> normale zyklen != adc zyklen
laut Spess schon,
wie kann ich denn in ADC Zyklen umrechnen?
was stimmt jetzt?
lg andy
Hi
>laut Spess schon,
Wieso. Ich habe in meinem ersten Post geschrieben:
'normalerweise nach 13 ADC-Takten'.
Das dir der Unterschied nicht geläufig war, habe ich nicht geahnt.
Sorry.
MfG Spess
ok, jetzt stimmt es überein. Und diese 200 Taktzyklen braucht er jetzt
tatsächlich im Controller?
Weil in einem Tutorial habe ich gelesen, dass man nicht unbedingt auf
die Rückmeldung warten muss, sondern 3 nop auch reinmachen kann und es
auch funktionieren könnte, deshalb die Unsicherheit.
lg andy
Hi
>Weil in einem Tutorial habe ich gelesen, dass man nicht unbedingt auf>die Rückmeldung warten muss, sondern 3 nop auch reinmachen kann und es>auch funktionieren könnte, deshalb die Unsicherheit.
Wer schreibt denn solchen Unsinn? Nur wenn du den ADC-Complete-Interrupt
benutzt, brauchst du nicht warten. Und dann noch nicht mal ein NOP. Im
Zweifelsfall solltest du dich einfach am Datenblatt orientieren.
MfG Spess