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.
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
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
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 | }
|
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
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??
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.