Forum: Mikrocontroller und Digitale Elektronik PCINT timing bei steigender/fallender Flanke


von David S. (Gast)


Lesenswert?

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!

von S. Landolt (Gast)


Lesenswert?

?
Wie wäre es mit selbst ausprobieren, realiter nachmessen? Bei einer 
solchen Fragestellung ist doch sicher ein Oszilloskop vorhanden.

von David S. (Gast)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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.

von David S. (Gast)


Lesenswert?

Oh, tut mir leid, ich dachte ich hätte es im ersten Beitrag geschrieben.
Es geht um einen ATtiny25-20SU.

von Mario M. (thelonging)


Lesenswert?

Die Flankenerkennung erfolgt intern über ein XOR-Gatter. Es sollte also 
keine Rolle spielen, welche Richtung die Flanke hat. Siehe Datenblatt 
Figure 9-1.

von David S. (Gast)


Lesenswert?

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.

von Jacko (Gast)


Lesenswert?

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...

von David S. (Gast)


Lesenswert?

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:
1
  SBI DDRB, PB2
2
  CBI PORTB, PB2
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
11
  CBI DDRB, PB2 ;<-- Tick 1
12
13
  NOP           ;<-- Tick 2
14
  NOP           ;<-- Tick 3
15
                ;<-- Sprung in ISR
16
  NOP
17
  NOP

von Bastian W. (jackfrost)


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

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.

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

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

: Bearbeitet durch User
von Jacko (Gast)


Lesenswert?

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.

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

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

: Bearbeitet durch User
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.