Forum: Mikrocontroller und Digitale Elektronik Zeit stoppen mit Attiny 24a


von Dirk L. (dilei)


Lesenswert?

Hi zusammen,
ich bin langsam am verzweifeln.. :D ich möchte an einem Attiny 24 die 
Dauer eines Signals messen. Jedesmal wenn sich der Pegel am Pin A0 
ändert, soll der aktuelle Zählerstand im Timer/Counter 0 ausgelesen 
werden und in einer Variable gespeichert werden.
Der Pinchange-Interrupt funktioniert... Der Counter liefert jedoch immer 
scheinbar zufällige Werte..
Ich hoffe einer von euch kann mir helfen und ich kann mich dann schön 
ärgern, was es für ein dummer Fehler war :D
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
void main(void)
5
{  
6
  DDRA &= ~(1<<PINA0);    //Pin A0 is an input
7
  PORTA |= (1<<PINA0);    //Pull-up on Pin A0
8
  
9
  DDRA |= (1<<PINA1);      //Pin A0 is output
10
  
11
  //Trigger Interrupt
12
  GIMSK |= (1<<PCIE0);    //Turns on PCINT0
13
  PCMSK0 |= (1<<PCINT0);    //PCINT0
14
  
15
//Prescaler 8
16
  TCCR0B |= (1<<CS01);
17
  
18
  sei();
19
  
20
  while(1)
21
  {
22
    
23
  }
24
  
25
}
26
27
ISR(PCINT0_vect)
28
{
29
  uint8_t time = (uint8_t) TCNT0;
30
  if(time > 120 || time < 80)
31
  {
32
    PORTA |= (1<<PINA1);
33
  } else
34
  {
35
    PORTA &= ~(1<<PINA1);
36
  }
37
  
38
  TCNT0 = 0x00;
39
}

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Dirk L. schrieb:
> Der Pinchange-Interrupt funktioniert... Der Counter liefert jedoch immer
> scheinbar zufällige Werte..
> Ich hoffe einer von euch kann mir helfen und ich kann mich dann schön
> ärgern, was es für ein dummer Fehler war :D

 LOL.
 Was erwartest du von einem 8-bit Zähler und 1-2MHz Zählerfrequenz ?

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Also das Programm stoppt die Zeit seit dem letzten Flankenwechsel - ist 
das so beabsichtigt? Das ist nicht das, was ich unter
> Dauer eines Signals messen
verstehen würde. Und der Timer0 läuft bei 256 über, aber scheint ja klar 
zu sein ("uint8_t").

von Dirk L. (dilei)


Lesenswert?

Bei einer Taktfrequenz von 8 Mhz und einem Prescaler von 8 sollte der 
Counter doch eine Zählfrequenz von 1 Mhz haben? Das Signal, das ich 
auslesen will hat einen Pegelwechsel alle 100 us. Der Timer sollte doch 
dann in 100 us bis zu einem Wert um die 100 gezählt haben?

von Osca (Gast)


Lesenswert?

Was er erwartet hat er gar nicht beschrieben.

Was erwartet der Herr denn, resp. welches Signal möchte er messen?

von Dirk L. (dilei)


Lesenswert?

S. Landolt schrieb:
> Also das Programm stoppt die Zeit seit dem letzten Flankenwechsel - ist
> das so beabsichtigt? Das ist nicht das, was ich unter
>> Dauer eines Signals messen
> verstehen würde. Und der Timer0 läuft bei 256 über, aber scheint ja klar
> zu sein ("uint8_t").

Vielleicht habe ich mich etwas unklar ausgedrückt.. ich versuche die 
Zeit zwischen zwei Flankenwechseln zu messen.

von S. Landolt (Gast)


Lesenswert?

Das heißt, das Signal hat etwa 10 kHz und ungefähr Tastgrad 0.5?

von Dirk L. (dilei)


Angehängte Dateien:

Lesenswert?

S. Landolt schrieb:
> Das heißt, das Signal hat etwa 10 kHz und ungefähr Tastgrad 0.5?

Das Signal hat 5 kHz, Tastgrad 0.5, 100 us low <-> 100 us high, 
Periodendauer 200 us.

: Bearbeitet durch User
Beitrag #5508065 wurde vom Autor gelöscht.
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Dirk L. schrieb:
> Das Signal hat 5 kHz, Tastgrad 0.5, 100 us low <-> 100 us high,
> Periodendauer 200 us.

 Wie stabil ist das Ganze (Rise, Spikes) ?

Dirk L. schrieb:
> Der Pinchange-Interrupt funktioniert... Der Counter liefert jedoch immer
> scheinbar zufällige Werte..

 Woher weisst du das ?

 Wird nirgendwo ausgegeben und dass du Portwechsel mit bloßem Auge
 beobachten kannst, bezweifle ich...

von Dirk L. (dilei)


Angehängte Dateien:

Lesenswert?

Osca schrieb:
>welches Signal möchte er messen?

Die blau markierten Bereiche im Anhang sollen gemessen werden. Diese 
sind, wenn das Signal anliegt, immer 100 us land. Wenn das Signal nicht 
anliegt möchte ich das in der if Abfrage feststellen können.
1
if(time > 120 || time < 80)
2
  {
3
    PORTA |= (1<<PINA1);
4
  } else
5
  {
6
    PORTA &= ~(1<<PINA1);
7
  }

von Dirk L. (dilei)


Lesenswert?

Marc V. schrieb:
>  Wie stabil ist das Ganze (Rise, Spikes) ?

Das Signal wird von einem anderen uC generiert. Kann davon ausgehen, 
dass es sehr stabil ist (mit Oszi gemessen).

> Dirk L. schrieb:
>> Der Pinchange-Interrupt funktioniert... Der Counter liefert jedoch immer
>> scheinbar zufällige Werte..
>
>  Woher weisst du das ?
>
>  Wird nirgendwo ausgegeben und dass du Portwechsel mit bloßem Auge
>  beobachten kannst, bezweifle ich...

Habe vorher einen Pin toggeln lassen, wenn der Interrupt ausgelöst 
wurde, das hat man auf dem Oszi schön gesehen.
Die Werte des Counters habe ich über den Debugger ausgelesen, das deckt 
sich auch mit dem, was ich auf dem Oszi sehen kann.

von S. Landolt (Gast)


Lesenswert?

Tja, ich habe das jetzt mal fliegend aufgebaut, speise ich 5 kHz mit 50 
% ein, leuchtet die LED, bei deutlich anderer Frequenz bleibt sie aus. 
Jetzt weiß ich nicht weiter.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Dirk L. schrieb:
> Habe vorher einen Pin toggeln lassen, wenn der Interrupt ausgelöst
> wurde, das hat man auf dem Oszi schön gesehen.

 Ja und warum schliesst du den Oszi nicht auch auf PortA.0 und
 vergleichst die zwei Signale ?

: Bearbeitet durch User
von Dirk L. (dilei)


Lesenswert?

Marc V. schrieb:
> Dirk L. schrieb:
>> Habe vorher einen Pin toggeln lassen, wenn der Interrupt ausgelöst
>> wurde, das hat man auf dem Oszi schön gesehen.
>
>  Ja und warum schliesst du den Oszi nicht auch auf PortA.0 und
>  vergleichst die zwei Signale ?

Genau das habe ich ja gemacht. Das Signal vom Attiny lief etwas nach war 
aber ansonsten identisch, weshalb ich darauf geschlossen habe, dass der 
Pinchange-Interrupt funktionieren muss.

von S. Landolt (Gast)


Lesenswert?

Vielleicht läuft es ja mit abgehängtem Debugger?

von Dirk L. (dilei)


Lesenswert?

S. Landolt schrieb:
> Tja, ich habe das jetzt mal fliegend aufgebaut, speise ich 5 kHz mit 50
> % ein, leuchtet die LED, bei deutlich anderer Frequenz bleibt sie aus.
> Jetzt weiß ich nicht weiter.

Vielen Dank für deine Mühe! Hast du die LED high- oder low aktiv? Am Pin 
sollte ja eine 1 anliegen, wenn der Pegel länger als 120 us oder kürzer 
als 80 us war, demnach müsste bei korrektem Signal dann eine 0 anliegen.

von Dirk L. (dilei)


Lesenswert?

S. Landolt schrieb:
> Vielleicht läuft es ja mit abgehängtem Debugger?

Da ändert sich leider nichts.. habe es jetzt mit drei verschiedenen 
Chips probiert...

von S. Landolt (Gast)


Lesenswert?

Bei mir ist die LED ist zwischen PA1 und Vcc angeschlossen, also das 
Verhalten ist korrekt.

von Dirk L. (dilei)


Lesenswert?

S. Landolt schrieb:
> Bei mir ist die LED ist zwischen PA1 und Vcc angeschlossen, also das
> Verhalten ist korrekt.

Okay..  und du verwendest auch eine ATtiny 24?

von S. Landolt (Gast)


Lesenswert?

Der ATtiny24A läuft tatsächlich mit 8 MHz, nicht mit 1 MHz wie 
geliefert?

von Route_66 H. (route_66)


Lesenswert?

Dirk L. schrieb:
> TCNT0 = 0x00;

Das Rücksetzen des Zählers am Ende der INT-Routine versaut dir das 
Messergebnis. Timer immer durchlaufen lassen.

Wenn du bei einem 10000m-Läufer nach jeder 400m-Runde die Stoppuhr 
drückst, dann die Rundenzeit abliest und aufschreibst, dann die Stoppuhr 
auf Null stellst und neu startest, dann kommt Murks raus.

von S. Landolt (Gast)


Lesenswert?

> Das Rücksetzen des Zählers ...

Schon richtig, aber bei mir läuft es ja.

von Dirk L. (dilei)


Lesenswert?

S. Landolt schrieb:
> Der ATtiny24A läuft tatsächlich mit 8 MHz, nicht mit 1 MHz wie
> geliefert?

Ohje es ist wohl echt zu warm... Habe das beim ersten Chip umgestellt, 
bei dem scheint tatsächlich der Timer kaputt zu sein. Bei den anderen 
beiden habe ich es dann natürlich vergessen.
1000 Dank und sorry für den ganzen Aufwand.

von Dirk L. (dilei)


Lesenswert?

Route 6. schrieb:
> Dirk L. schrieb:
>> TCNT0 = 0x00;
>
> Timer immer durchlaufen lassen.

Ein guter Punkt. Danke dafür!

von S. Landolt (Gast)


Lesenswert?

> 1000 Dank und sorry für den ganzen Aufwand.

Keine Ursache, gern geschehen - gegenüber dem, was derzeit im Unterforum 
'Webseite' läuft, war das hier geradezu erfrischend.


Übrigens:
> Timer kaputt
habe ich in rund 20 Jahren AVR8 noch nicht gesehen.

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.