Zeit stoppen mit Attiny 24a

OP #5507970
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
}
Gast #5508031
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").
OP #5508032
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?
OP #5508039
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.
Beitrag #5508065 wurde von einem Moderator gelöscht.
(Firma: Vescomp) #5508067
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...
OP #5508068
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
  }
Angehängte Dateien:
OP #5508075
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.
OP #5508106
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.
OP #5508123
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.
Gast #5508152
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren