Forum: Mikrocontroller und Digitale Elektronik Frage zu PD Entprellung


von Paul (Gast)


Lesenswert?

1
#define F_CPU 10000000
2
ISR( TIMER0_OVF_vect )                            // every 10ms
3
{
4
  static uint8_t ct0, ct1, rpt;
5
  uint8_t i;
6
 
7
  TCNT0 = (uint8_t)(int16_t)-(F_CPU / 1024 * 10e-3 + 0.5);  // preload for 10ms

Was genau wird in den Zählregister reingeschrieben?
Negative Werte ergeben doch kein Sinn, wenn der Register an sich von 0 
bis 255 hochzählt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Paul schrieb:
> Negative Werte ergeben doch kein Sinn, wenn der Register an sich von 0
> bis 255 hochzählt.
Der Zählerüberlauf kommt beim 256. Takt, also beim Überlauf 255->0.

> Was genau wird in den Zählregister reingeschrieben?
Für 100 Zählschritte muss also eigentlich ein Wert von 256-100=156 
eingetragen werden, wenn 100 Takte gezählt werden soll. Weil aber bei 8 
Bit 256=0 ist, kann statt 256-100 auch 0-100 eingetragen werden. Oder 
eben gleich -100. Nimm mal ein Blatt Papier und zeichne dir das auf. Es 
ist wichtig... ;-)

von Paul (Gast)


Lesenswert?

Klingt sinnvoll, allerdings benutzt er den Timer0 also mit 8Bit und 
einen Vorteiler von 1024.
Sprich ((2^8)*1024)/10MHz ergibt bei mir 0.0262144 Sekunden.
Sprich alle 26.2 ms wird der Zähler um TCNT0 um eins erhöht....

von Paul (Gast)


Lesenswert?

Sprich nach 100 Takten wären dann schon 2.6sekunden um ?

von Karl H. (kbuchegg)


Lesenswert?

Paul schrieb:
> Klingt sinnvoll, allerdings benutzt er den Timer0 also mit 8Bit und
> einen Vorteiler von 1024.
> Sprich ((2^8)*1024)/10MHz ergibt bei mir 0.0262144 Sekunden.

> Sprich alle 26.2 ms wird der Zähler um TCNT0 um eins erhöht....

Nö. Dieser Timer mit 10Mhz und einem Vorteiler von 1024 würde in 26.2 
einmal von 0 bis 255 zählen. Um 1 erhöht wird er alle 0.0001024 
Sekunden.

von Paul (Gast)


Lesenswert?

Karl Heinz schrieb:
> Nö. Dieser Timer mit 10Mhz und einem Vorteiler von 1024 würde in 26.2
> einmal von 0 bis 255 zählen.

Ah da ist der Denkfehler. Danke :).

von Paul (Gast)


Lesenswert?

Dann versteh ich allerdings nicht warum PD nicht TCNT0 nur 98 Takte für 
ein Interrupt laufen lässt. Denn dann käme 10.0352 ms exakt raus anstatt 
bei 100 Takten 10.24 ms. (Abgesehen von der Toleranz des Quarzes.)

von Karl H. (kbuchegg)


Lesenswert?

Paul schrieb:
> Dann versteh ich allerdings nicht warum PD nicht TCNT0 nur 98 Takte für
> ein Interrupt laufen lässt. Denn dann käme 10.0352 ms exakt raus anstatt
> bei 100 Takten 10.24 ms. (Abgesehen von der Toleranz des Quarzes.)

weil die Genauigkeit der 10ms keinen wirklich interessiert.
Die Zeit ist nicht kritisch. Alles zwischen ca. 5ms und ca 30ms würde 
funktionieren. Es geht hier um die ungefähre Größenordnung und nicht um 
den einzelnen Taktzyklus. Da gibt es einen riesigen Toleranzbereich.

(ich schmeiss meistens das Nachladen des Timers komplett raus)

von Paul (Gast)


Lesenswert?

Wenn der Mikrocontroller die Befehle aus der ISR abarbeitet, wird 
während dessen der Zähler intern weiter hochgezählt?

Und wie sähe das aus wenn ich zwei unterschiedliche Timer0 und Timer1 
nutzen würde. Wird der Zähler zb. von Timer1 weiter erhöht während die 
Befehle beim Interrupt des Timer0 abgearbeitet werden?

Ich muss ein MRT Signal immitieren und dies auf paar ms genau. Während 
dessen werden ADC ausgelesen und ggf. über USB Signale übertragen.
Daher die Frage in wieweit ich das MRT während ich ADC einlese 
zuverlässig mit einem Mikrocontroller immitieren kann.

von Karl H. (kbuchegg)


Lesenswert?

Paul schrieb:
> Wenn der Mikrocontroller die Befehle aus der ISR abarbeitet, wird
> während dessen der Zähler intern weiter hochgezählt?

Ja natürlich.

FAQ: Timer

> Und wie sähe das aus wenn ich zwei unterschiedliche Timer0 und Timer1
> nutzen würde. Wird der Zähler zb. von Timer1 weiter erhöht während die
> Befehle beim Interrupt des Timer0 abgearbeitet werden?

Die Timer laufen unabhängig von der CPU weiter. Sie sind unabhängige 
Hardware. Solange sie einen Takt am Eingang haben, laufen sie.

> Ich muss ein MRT Signal immitieren und dies auf paar ms genau.

Dann such dir einen Timer aus, der einen CTC Modus hat. Dieses 
Timer-Nachladen ist sowieso ein Graus. Im Entprellungsartikel nur 
deswegen genutzt, damit dort der Timer 0 benutzt werden kann, der auf 
einigen AVRs keinen CTC Modus unterstützt und weil es bei der 
Entprellung völlig unkritisch ist, ob die ISR mal ein paar Takte zu spät 
kommt oder nicht. Da kann man den Timer nehmen, der am wenigsten 'weh 
tut', wenn man ihn auf eine ISR-Aufruffrequenz einpegelt, die man sonst 
nirgends im System brauchen kann.


FAQ: Timer

von Paul (Gast)


Lesenswert?

Dazu folgen Tasteingaben, die entprellt werden und zusätzlich Ausgaben 
an LCD Displays... usw. Daher relativ komplex viele Aufgaben, allerdings 
muss nur das MRT Signal exakt immitiert werden können und der rest ist 
zweirangig.

von Karl H. (kbuchegg)


Lesenswert?

Paul schrieb:
> Dazu folgen Tasteingaben, die entprellt werden

kann ruhig mit in den MRT Timer INterrupt mit hinein. Das ist ja das 
bestechende an der PeDa Entprellung: die paar Taktzyklen, die für die 
Entprellung draufgehen, kann man problemlos in jeder anderen ISR 
unterbringen, sofern nur die Aufrufhäufigkeit ungefähr passt.

> und zusätzlich Ausgaben
> an LCD Displays...

die haben in der ISR sowieso nichts verloren und gehören da auch nicht 
hin

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:
> Paul schrieb:
>> Dazu folgen Tasteingaben, die entprellt werden
>
> kann ruhig mit in den MRT Timer INterrupt mit hinein. Das ist ja das
> bestechende an der PeDa Entprellung: die paar Taktzyklen, die für die
> Entprellung draufgehen, kann man problemlos in jeder anderen ISR
> unterbringen, sofern nur die Aufrufhäufigkeit ungefähr passt.

Um es noch mal klar anzusprechen:

Du richtest dich NICHT nach der Entprellung!
Du hast einen Timer Interrupt (aus anderen Gründen), der eine ISR 
Aufrufzeit im Bereich von 5ms bis 30ms hat (d.h. die Zeit ist natürlich 
fix, sollte sich aber in diesem Bereich bewegen), dann passt das 
perfekt: Der Entprellcode da mit rein (ohne Timer nachladen) und gut 
ists.

Der Entprellcode richtet sich nach den restlichen Anforderungen und 
nicht umgekehrt. Ob der Entprellcode alle 10ms augerufen wird oder alle 
12 oder alle 7 oder ... spielt keine Rolle. Wenn dein MRT Code alle 5ms 
aufgerufen werden muss, dann wird eben die Entprellung auch alle 5ms 
mitgemacht. Das ist der Entprellung sowas von egal.

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.