Hallo,
ich sitze gerade an einem Programm, bei dem das Timing der Sample & Hold
des ADC kritisch ist. Um genau zu sein muss es immer 3,7us nach einem
Pegelwechsel an einem Pin stattfinden.
Das reguläre starten des ADC per ADSC fällt damit flach, da der S&H
Zeitpunkt irgendwann zwischen 1,5 und 1,9999 ADC Ticks nach ADSC
stattfinden kann, was selbst bei einem recht schnellen ADC mit 600kHz
immer noch ca. 800ns aus macht.
Daher muss ein zuverlässiges Timing geschaffen werden, was nur durch den
Autotrigger möglich ist. Hier sind mir wiederum die Hände gebunden was
die Quellen des Triggers angeht und ich kann nur den PCINT benützen und
per SW auslösen.
Um dessen Timing nun herauszufinden habe ich ein recht einfaches
Programm geschrieben und im Simulator vom AVRStudio 7 simuliert:
1
SBI PCMSK, PCINT2
2
LDI tmp, (1<<PCIE)
3
STO GIMSK, tmp
4
5
SEI
6
7
MAIN:
8
SBI DDRB, PB2
9
CBI PORTB, PB2
10
11
NOP
12
NOP
13
NOP
14
NOP
15
<-- Sprung in ISR
16
17
SBI PORTB, PB2
18
CBI DDRB, PB2
19
20
NOP
21
NOP
22
<-- Sprung in ISR
23
NOP
24
NOP
25
26
RJMP MAIN
27
28
PCINT0_ISR:
29
RETI
Markiert sind die Zeitpunkte in denen in die ISR gesprungen wird.
Anhand dessen wird recht klar ersichtlich, dass bei einer fallen Flanke
4 Ticks vergehen, bis in die ISR gesprungen wird, bei steigender Flanke
jedoch nur 3 Ticks.
Aus dem Datenblatt des Tiny ist dies nicht ersichtlich.
Daher stelle ich mir nun die Frage, ob das ein Bug im Simulator ist,
oder sich der Tiny wirklich so verhält.
Falls jemand mir diese Frage beantworten könnte, wäre mir sehr geholfen.
Recht herzlichen Dank!
S. Landolt schrieb:> ?> Wie wäre es mit selbst ausprobieren, realiter nachmessen? Bei einer> solchen Fragestellung ist doch sicher ein Oszilloskop vorhanden.
Eben leider zur Zeit nicht. Das DSO ist zerlegt und beim alte Tektronix
314 streikt der Trigger.
Sonst wäre das schon übers Oszi gelaufen.
Vielleicht findet sich ja jemand, der das beantworten kann.
Andernfalls könnte ich morgen mal nachsehen, vorausgesetzt, Sie
verraten den genauen Typ des Tiny und es ist keiner der neueren.
Die Flankenerkennung erfolgt intern über ein XOR-Gatter. Es sollte also
keine Rolle spielen, welche Richtung die Flanke hat. Siehe Datenblatt
Figure 9-1.
Mario M. schrieb:> Die Flankenerkennung erfolgt intern über ein XOR-Gatter. Es sollte also> keine Rolle spielen, welche Richtung die Flanke hat. Siehe Datenblatt> Figure 9-1.
Die Zeichnung ist mir bekannt und beschreibt das Verhalten, welches bei
steigender Flanke beobachtet werden kann (nach drei Ticks ist das Signal
durch die D-FF durch, steht an PCIF an und beim nächsten Tick springt
der AVR in die ISR).
Jedoch verhält es sich bei fallender Flanke im Simulator eben anders und
ich möchte eruieren, ob die Schemazeichnung eben nur ein Schema ist,
oder ob der Simulator eben einen weiteren Bug hat.
Bei 3,7us ist der eine Tick unterschied durchaus problematisch, wenn man
nicht mit voller Taktrate läuft.
Ich benutze zwar den älteren Simulator von v4.18, aber da ist
schon mal zu beobachten, dass die Zeitzählung zu Beginn immer
einen Takt 'verschluckt'. Danach nicht mehr.
Keine Ahnung, ob der Fehler bei v.7.. schon raus ist
und ob er dein Problem erklärt.
Da hilft nur die Hardware-Messung.
Ansonsten hast du in ECHTEN ATTiny-Programmen IMMER das Problem,
dass Interruptroutinen erst nach der Ausführung des aktuellen
Befehls starten.
Wie du im Datenblatt sehen kannst, gibt es mindestens 1- und 2-
cycle-Befehle, womit du GRUNDSÄTZLICH eine Unsicherheit von
1 Tick hast. Bei 20 MHz ungefähr genau 50 ns.
Desweiteren ist mir nicht klar,
- warum du vor jeder Flanke am DDRB rumschaltest und
- warum der Unterschied von NOP-NOP-NOP-NOP und NOP-NOP gerade
ein Tick sein soll. Jedes NOP dauert genau einen Tick...
Jacko schrieb:> Wie du im Datenblatt sehen kannst, gibt es mindestens 1- und 2-> cycle-Befehle, womit du GRUNDSÄTZLICH eine Unsicherheit von> 1 Tick hast.
Da ich aktiv steuere wann der PCINT stattfindet, kann ich auch steuern
welche Befehle danach stattfinden. Insofern besteht die Unsicherheit
nicht.
> Desweiteren ist mir nicht klar,> - warum du vor jeder Flanke am DDRB rumschaltest und
Der Pin ist regulär als Eingang in Verwendung. Angeschlossen ist ein
Taster gegen Masse. Daher muss das DDR Register umgeschaltet werden um
den PCINT vom uC aus kontrollieren zu können.
Dies muss vor dem setzen des PORT Registers stattfinden, sonst würde der
Pin mit dem Setzen von DDR floaten und könnte dort schon einen Interrupt
auslösen.
> - warum der Unterschied von NOP-NOP-NOP-NOP und NOP-NOP gerade> ein Tick sein soll. Jedes NOP dauert genau einen Tick...
Der Pegelwechsel findet mit dem Setzen des PORT Registers statt. Es
vergehen daher jeweils drei bis vier 1 Tick Befehle nach dem Setzen:
Ich hab keinen Attiny25 zuhause , kann dir aber mit einem Attiny13
messen ob bei beiden Wechseln die Zeiten gleich oder unterschiedlich
sind. Bringt dir das was ?
Gruß JackFrost
Bei einem ATtiny85 ist die Latenz, gemessen aus idle-sleep heraus,
dieselbe bei positiver und negativer Flanke; natürlich kommt noch eine
variable Latenz von 1 Takt hinzu.
David S. schrieb:> Der Pegelwechsel findet mit dem Setzen des PORT Registers statt. Es> vergehen daher jeweils drei bis vier 1 Tick Befehle nach dem Setzen:>
1
SBI DDRB, PB2
2
CBI PORTB, PB2 ;#Ab hier wird die negative Flanke erzeugt
3
4
NOP ;<-- Tick 1
5
NOP ;<-- Tick 2
6
NOP ;<-- Tick 3
7
NOP ;<-- Tick 4
8
;<-- Sprung in ISR
9
10
SBI PORTB, PB2 ;#Ab hier wird die positive Flanke erzeugt
11
CBI DDRB, PB2 ;<-- Tick 1 #<= Nein 2 Ticks
12
13
NOP ;<-- Tick 2
14
NOP ;<-- Tick 3
15
;<-- Sprung in ISR
16
NOP
17
NOP
Ich versuche zwar immer "Gästen" nicht zu schreiben, da man später
nichts mehr von ihnen liest, aber...
Ich habe mal meine Kommentare im Programm durch # kenntlich gemacht.
Ich denke der Fehler liegt daran, das der CBI-Befehl zwei Takte benötigt
und nicht wie von dir gedacht einen.
Somit sehe ich da keine Unsymetrie ( CBI-Befehls 2T + 2x NOP = 4 Takte
).
Bernd_Stein
Die DDR-Bit-Fummelei (ist ja besonders in einem Testprogramm
nötig ...)
Und dann noch die blauäugige Annahme, dass man Einfluss auf
die Befehlsausführungsdauer hat, weil die ja erst nach dem
Interrupt auftreten kann...
Realitätsverweigerern ist schwer zu helfen, ... besonders
wenn sie bei Unbelehrbarkeit jeden Ur-Opa übertreffen.
Also: Gute Nacht.
Um mal wieder was hilfreiches zu posten :
Dieser µC-Typ unterstützt sogar die PIN-Togglefunktion.
10.2.2
Toggling the Pin
Writing a logic one to PINxn toggles the value of PORTxn
, independent on the value of DDRxn. Note that the SBI
instruction can be used to toggle one single bit in a port.
Guten Morgen.
Bernd_Stein