Forum: Analoge Elektronik und Schaltungstechnik Timer generel/auslesen


von Mischi (Gast)


Lesenswert?

Hallo,

ich brauche einen Timer mit dem ich einen zeit messen kann.
Denn ich habe einen Ultraschalsensor und der gibt mir ein higt Signal 
das je nachdem wie weit der Sensor vom Gegenstand entfernt ist eine 
gewisse länge (ms)hat.
ich habe schon den entsprechenden Timer programmiert und die Abstände 
habe ich schon mit einen Oszi gemessen damit ich weiß wie viele ms 10cm 
sind.

jetzt habe ich aber das Problem das ich nicht weiß ob mein Timer 
überhaupt richtig ist und wie ich denn den Wert der im Register TCNT1 
steht auf ein LCD-Display bekomme.
und ich habe noch gelesen das ich zuerst das low bit auslesen muss und 
erst dann das higt bit oder steht das im Register als word??
[c]

void teimer_init()
{
  TCCR1B |=(1<<CS12);//Vorteiler
}


void Timer()
{
  Timer_inti();
  //cli();    //Interrupt ausschalten
  PORTB &=~(1<<PB5);// PB5 kurzzeitig auf Eingang setzen
  PORTB |=(1<<PB4);// Impuls zum Starten von dem Ultraschalsensor
  _delay_us(10);//warten
  PORTB&=~(1<<PB4);//ausschalten

  while(PIND & (1<<PD5));  //abfrage ob das signal higt ist
  TCNT1 =0;    //Teimer auf null schalten und starten
  while(!(PIND & (1<<PD5)));//abfrage ob das signal wider auf low ist.
  a = TCNT1;

  PORTB |=(1<<PB5);// Port wieder auf Ausgang schalten
  //sei();// Interrrupt ein

  S0();   //Port maping
  lcd_clear();//LCD löschen

  lcd_setcursor(1,1); //wo es ausgegeben wird.
  lcd_data(a+0x30); //was ausgegeben werden soll
}

Das ganze steht dann in einer Interrupt Rutine weil ich erst dann messen 
will wenn ich es ihm sage.

von Alex Z. (alexander_z49)


Lesenswert?

Wie sieht den dein Signal überhaupt aus?
ist der zusammenhang zwischen Abstand und High-Signal diskret oder 
kontinuierlich? Wie groß ist die Schrittweite (also wenn der Abstand 1cm 
ist z.b. 10ms und wie sieht es bei 10,1cm aus)?

Was hast du für einen µC?
Ich würde zum messen ehr einen Trigger nehmen, der auf die Signalflanken 
an einem PIN wartet und dann eine ISR aufruft, die den Timer startet und 
stoppt. dann musst du den µC nicht die ganze zeit mit der While schleife 
beschäftigen.

Alex

von Mischi (Gast)


Lesenswert?

Alex Z. schrieb:
> Wie sieht den dein Signal überhaupt aus?
wenn der Sensor einen Puls bekommt von 10us dan bekomme ich ein rechteck 
Signal ca so;_________-------_____
> ist der zusammenhang zwischen Abstand und High-Signal diskret oder
> kontinuierlich? Wie groß ist die Schrittweite (also wenn der Abstand 1cm
> ist z.b. 10ms und wie sieht es bei 10,1cm aus)?
also ich habe jeden zweiten cm gemessen und das auf einer länge von 60cm 
(3,470ms)
im Programm würde ich die abstände mit einer Schlussrechnung rechnen da 
ich dann ca. das gleiche Ergebnis bekomme.
>
> Was hast du für einen µC?
atmega 328p

> Ich würde zum messen ehr einen Trigger nehmen, der auf die Signalflanken
> an einem PIN wartet und dann eine ISR aufruft, die den Timer startet und
> stoppt. dann musst du den µC nicht die ganze zeit mit der While schleife
> beschäftigen.
das geht leider nicht da ich den Port noch für andere Dinge brauche z.b 
Motoren.
>
lg

von Mischi (Gast)


Lesenswert?

ok hab noch ein zwei fehler in meinem c-code entägt ^^
1
void Timer()
2
{
3
  
4
  //cli();    //Interrrupt auschalten
5
  PORTD &=~(1<<PD5);// PB5 kurzzeitig auf eingang setzen
6
  PORTB |=(1<<PB5);// impuls zum starten von dem Ultraschalsensor
7
  _delay_us(10);//warten
8
  PORTB &=~(1<<PB5);
9
  
10
  while(PIND & (1<<PD5));  //abfrage ob das signal higt ist
11
  TCNT1 =0;        //Teimer auf null schalten und starten
12
  while(!(PIND & (1<<PD5)));//abfrage ob das signal wider auf low ist.
13
  a = TCNT1H;
14
  
15
  PORTD |=(1<<PD5);
16
  //sei();
17
  
18
  S0();   
19
  lcd_clear();
20
  
21
  lcd_setcursor(1,1);
22
  lcd_data(a+0x30);
23
}

von Alex Z. (alexander_z49)


Lesenswert?

Gibt es einen Schaltplan dazu? Wenn du sagst, du brauchst den Port(oder 
meinst du PIN?) noch für Motoren, dann ist das doch kein Problem. Du 
kannst den PD5 als Eingang konfigurieren und mit dem PIN Change 
Interrupt 21 auswerten und den Timer starten. Beim nächsten 
Signalwechsel stopst du ihn wieder.

Alex

von Mischi (Gast)


Lesenswert?

Alex Z. schrieb:
> Gibt es einen Schaltplan dazu? Wenn du sagst, du brauchst den
> Port(oder
> meinst du PIN?) noch für Motoren, dann ist das doch kein Problem. Du
> kannst den PD5 als Eingang konfigurieren und mit dem PIN Change
> Interrupt 21 auswerten und den Timer starten.
tu ich das den nicht mit den While schleifen??

von Alex Z. (alexander_z49)


Lesenswert?

Naja, du gibst ihm arbeit. Du fragst den µC immer und immer wieder, ob 
der pin schon gesetzt ist oder nicht. In der Zeit kann der Controller 
effektiv nichts anderes machen.

Als Analogie, kann man die Kinder im Auto nehmen, die immer und immer 
wieder fragen: Sind wir schon da? Sind wir schon da? Besser ist es: 
Vater: "wir fahren jetzt los" und "So wir sind am Ziel angekommen", 
zwischenzeitlich können die Kinder im Auto was spielen und der 
Vater/Controller hat seine Ruhe in der zwischenzeit.

Das ist meine Meinung, sicher geht es mit deinem Kode auch, empfinde ich 
aber nicht als schön gelöst.

Aber um nochmal auf deine Ursprüngliche Frage zurückzukommen:

a=TCNT1; sollte so funktionieren, das lesen aus den 2 8-bit registern 
organisiert die CPU selber. aber darauf achten, dass a eine unsigned int 
ist, sonst kanns sein, dass du negative Zahlen erhälst. zu alle dem 
kannst du im datasheet auf Seite 115 nochmal anchlesen.

Versuche erstmal wenn möglich den timer ohne alles lesen und schreiben 
zu bekommen, um zu testen, ob das funktioniert, z.b. mit einer LED am 
port, die du ein und ausschaltest.

Alex

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.