Forum: Mikrocontroller und Digitale Elektronik Pulslänge messen mit ATMega48 und Bascom


von Mr.Unklar (Gast)


Lesenswert?

Hallo,
ich möchte die max. Geschwindigkeit eines Autos auf der Carrera-Bahn 
messen mittels zweier Lichtschranken. Der Impuls ist ca. 0,15s - 0,22s 
lang.
Dieser geht auf den Eingang PD.0 vom ATMega48 mit einem LCD-Display.
Habe mir dann dazu ein kleines Programm in Bascom gebastelt. Leider 
funktioniert es so nicht und ich finde meinen Denkfehler nicht.
Zur Funktion:
Timer wird bei der pos. Flanke (1. IF-Anweisung) auf null gesetzt und 
läuft dann los. Hilfsmerker ist dann 1!
Timer wird bei der neg. Flanke (2. IF-Anweisung) ausgelesen und 
Hilfsmerker ist wieder 0!
Wenn Hilfsmerker Null ist läuft auch der Timer nicht (3. IF-Anweisung)!
Interrupt-Routine ist nur da, dass LED leuchtet wenn Timer überläuft 
(Auto zu langsam = Fehlmessung).

Hier das vorläufige Programm:
'***************************************************************
'Test Pulsmessung >> 1 Kanal mit Timer
'Chip type           : ATMega48V
'***************************************************************

$regfile = "m48def.dat"             'ATMega48V
$crystal = 8000000                  'intern Osz. 8MHz, DivClock=Off

Config Lcdpin = Pin , DB4 = Portb.0 , DB5 = Portb.1 , DB6 = Portb.2
Config Lcdpin = Pin , DB7 = Portb.3 , E = Portb.5 , RS = Portb.4
Config Lcd = 16x2                   'configure lcd screen

DDRD =&B00100000                     'PortB.5-Ausgang, Rest-Eingang
PortD = &B11011111                   'PullUp an den Eingängen

Dim Puls1 As  Word
Dim Puls2 As  Word
Dim HM1 As  Bit

LED Alias Portd.5

Config Timer1 = Timer, Prescale = 64
On Timer1 T1_Sub
Enable TIMER1
Enable Interrupts

Cursor off
Cls

LED = 0

Waitms 200

Do

If PinD.0 = 1 And HM1 = 0 Then
   HM1 = 1
   Timer1 = 0
   LED = 0
End IF

If PinD.0 = 0 And HM1 = 1 Then
   HM1 = 0
   Puls1 = Timer1
End IF

If HM1 = 0 Then
   Timer1 = 0
End IF

Locate 1, 1
LCD Puls1
LCD " "

Loop
End

T1_Sub:
LED = 1
Return

Vielleicht liegt es auch an dem LCD-Display?

Danke
Maik

von lesestolperer (Gast)


Lesenswert?

Mr.Unklar schrieb:
> mit einem LCD-Display

Also einem Liquid Crystal Display Display, sozusagen
ein Display im Display. Schicke Sache das ....

Mr.Unklar schrieb:
> Vielleicht liegt es auch an dem LCD-Display?

Ja vielleicht schon.

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


Lesenswert?

Mr.Unklar schrieb:
> Der Impuls ist ca. 0,15s - 0,22s lang.
Dann solltest du nicht während dieser Messzeit am Display 
herumschrauben, denn die Zugriffe darauf können sich ganz hübsch in die 
Länge ziehen...

> Leider funktioniert es so nicht
Was davon funktioniert denn nicht?

Was passiert, wenn du mal das probierst:
1
:
2
:
3
Do
4
5
If PinD.0 = 1 And HM1 = 0 Then  'steigende Flanke
6
   HM1 = 1
7
   Timer1 = 0
8
   LED = 0
9
End IF
10
11
If PinD.0 = 0 And HM1 = 1 Then  'fallende Flanke
12
   HM1 = 0
13
   Locate 1, 1
14
   LCD Timer1
15
   LCD " "
16
End IF
17
18
Loop
19
End
20
:
21
:

Zur Fehlersuche ürde ich mal sowas probieren:
1
:
2
:
3
Do
4
5
If PinD.0 = 1 And HM1 = 0 Then  'steigende Flanke
6
   HM1 = 1
7
   LED = 1                      '-> LED an
8
End IF
9
10
If PinD.0 = 0 And HM1 = 1 Then  'fallende Flanke
11
   HM1 = 0
12
   LED = 0                      '-> LED aus
13
End IF
14
15
Loop
16
End
17
:
18
:
Dann könnte ich an der LED sehen, ob wenigstens der Portpin richtig im 
Programm ankommt.

: Bearbeitet durch Moderator
von Peter D. (peda)


Lesenswert?

Mr.Unklar schrieb:
> Leider
> funktioniert es so nicht

Da freut sich aber der Monteur in der Autowerkstatt, weil er 1000% 
aufschlagen kann. Er muß ja erstmal alles gründlich untersuchen, was 
denn nun nicht funktionieren soll.
Wenn man aber konkret sagen würde, Rückfahrlicht geht nicht, müßte er 
nur die Sicherung wechseln und könnte nur wenige € berechnen.

Da es im Forum aber keine € gibt, hat man bei absolut nichtssagender 
Fehlerbeschreibung schlechte Karten.

Allgemein: Ständig sich überschreibende LCD-Ausgaben kann man nicht 
erkennen. Man sollte schon Pausen fürs Ablesen einbauen.

von Mr.Unklar (Gast)


Lesenswert?

Danke Lothar,
habe mal gemessen wie lange das Display benötigt. Ganze 14ms! Und um 
diesen Wert schwanken auch die Messwerte. Mit Deiner Änderung habe ich 
jetzt einigermaßen Stabile Messwerte.
Jetzt muss ich nur noch eine Lösung finden, wenn die 2. Bahn 
gleichzeitig gemessen wird.

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


Lesenswert?

Mr.Unklar schrieb:
> Jetzt muss ich nur noch eine Lösung finden, wenn die 2. Bahn
> gleichzeitig gemessen wird.
Ich würde da für die Pulsdauerermittlung auf Pinchange-Interrupts gehen 
und die gesamte Timerverwaltung im Interrupt machen. Dann ist es 
schnurzegal, wie langsam das Display aktualisiert wird.

Dann ist es hilfreich, den Timer nicht zurückzusetzen, sondern ihn 
einfach durchlaufen zu lassen, sich dann den Startzeitpunkt zu merken 
und letztlich diese Startzeit vom Endzeitpunkt anzuziehen.
1
:
2
:
3
PinchangeINT0_sub:
4
If PinD.0 = 1 And HM1 = 0 Then  'steigende Flanke
5
   HM1 = 1
6
   Start1 = Timer                   
7
End IF
8
If PinD.0 = 0 And HM1 = 1 Then  'fallende Flanke
9
   HM1 = 0
10
   Pulse1 = Timer - Start1
11
End IF
12
13
If PinD.1 = 1 And HM2 = 0 Then  'steigende Flanke
14
   HM2 = 1
15
   Start2 = Timer                   
16
End IF
17
If PinD.1 = 0 And HM2 = 1 Then  'fallende Flanke
18
   HM2 = 0
19
   Pulse2 = Timer - Start2
20
End IF
21
Return
22
:
23
:

: Bearbeitet durch Moderator
von Samstagsgast (Gast)


Lesenswert?

Hallo zusammen,
also Peter D. mein Autoschrauber ist ein ehrlicher Typ und dem kann Mann 
schon mal das Auto anvertrauen. Du warst schon mal besser in Deinen 
anderen Beiträgen.
Und für den "lesestolperer", wie der Name schon sagt, noch der Hinweis, 
dass es auch LED- oder Grafik-Displays gibt!!! Wäre schön gewesen, wenn 
er auch etwas beigetragen hätte.
Wieso hat der Moderator denn das Problem gleich erfasst? Ist wohl doch 
nicht der Anfänger wie andere mit einem Halbwissen oder permanente 
Nörgeler.
Die Frage ist aber immer noch was passiert, wenn die beiden Fahrzeuge 
wirklich gleichzeitig gemessen werden sollen.
Schönes WE noch und Gruß vom
Andree

von Peter D. (peda)


Lesenswert?

Samstagsgast schrieb:
> also Peter D. mein Autoschrauber ist ein ehrlicher Typ

Ein ehrlicher Typ ist aber kein Hellseher. Wenn Du ihm keine 
Fehlerbeschreibung gibst, braucht er deutlich mehr Zeit, das Auto zu 
untersuchen. Und diese zusätzliche Zeit will er natürlich von Dir 
bezahlt haben.

Samstagsgast schrieb:
> Die Frage ist aber immer noch was passiert, wenn die beiden Fahrzeuge
> wirklich gleichzeitig gemessen werden sollen.

Wurde doch schon gesagt. Einfach mal die Beiträge lesen.

von Mr.Unklar (Gast)


Lesenswert?

Guten Morgen,
geht leider doch nicht so einfach. Habe (zwar sehr selten) den Fehler,
dass ich einen hohen negativen Wert erhalte und zwar dann wenn der Timer 
kurz vor 65535 abgefragt wird, überläuft und das nächste mal bei 0+x 
abgefragt wird.
Aber das ist, denke ich, lösbar.
Danke noch mal und schönen Sonntag
Maik

von Yalu X. (yalu) (Moderator)


Lesenswert?

Mr.Unklar schrieb:
> Habe (zwar sehr selten) den Fehler,
> dass ich einen hohen negativen Wert erhalte und zwar dann wenn der Timer
> kurz vor 65535 abgefragt wird, überläuft und das nächste mal bei 0+x
> abgefragt wird.

M.W. gibt es dafür in Bascom den vorzeichenlosen Datentyp Word.

von Mr.Unklar (Gast)


Lesenswert?

Naja, der Wert 65535 ist schon vom Format Word!
Bei Int wäre es +/- die Hälfte!

von STK500-Besitzer (Gast)


Lesenswert?

Mr.Unklar schrieb:
> Habe (zwar sehr selten) den Fehler,
> dass ich einen hohen negativen Wert erhalte und zwar dann wenn der Timer
> kurz vor 65535 abgefragt wird, überläuft und das nächste mal bei 0+x
> abgefragt wird.

> 8MHz
> 0,15s - 0,22s
Auf wie viele Timer-Takte kommt man mit diesen Zahlen?

Dei Methode, einen Zähler mit begrenztem Zahlenumfang auf 0 zurück zu 
setzen, ist äußerst unpraktisch.
Man subtrahiert einfach die Zeitpunkte der Flanken voneinander und lässt 
den Timer munter vorsichherlaufen.

von STK500-Besitzer (Gast)


Lesenswert?

Mr.Unklar schrieb:
> Dieser geht auf den Eingang PD.0

Deine Autos sind also alle gleich lang?
Geschwindigkeiten misst man zwischen zwei Punkten in einem definierten 
Abstand. Das würde den ganzen Spaß auch massiv vereinfachen.

von Mr.Unklar (Gast)


Lesenswert?

Nein Mr. STK500. Die Länge der Autos ist egal. Es sind zwei 
Lichtschranken, die ein RS-FlipFlop setzen und rücksetzen. Deshalb nur 
ein Eingang.
Aber das war nicht das Thema.
Das Prinzip des ständigen Laufens des Timers wurde ja schon von  Lothar 
M. so vorgeschlagen. Trotzdem besteht das Problem mit der Messung 
innerhalb des Überlaufs vom Timer.

von STK500-Besitzer (Gast)


Lesenswert?

Mr.Unklar schrieb:
> Trotzdem besteht das Problem mit der Messung
> innerhalb des Überlaufs vom Timer.

Dann zählt man in der Überlauf-ISR deren Auftreten.

Mr.Unklar schrieb:
> Es sind zwei
> Lichtschranken, die ein RS-FlipFlop setzen und rücksetzen. Deshalb nur
> ein Eingang.

umständlich...

von Mr.Unklar (Gast)


Lesenswert?

Umständlich STK500-Besitzer??? Das solltest Du mir erklären!!!!
Ich spare dadurch 2 Ein-/Ausgänge bei dem kleinen ATTiny!

von Peter D. (peda)


Lesenswert?

Mr.Unklar schrieb:
> Trotzdem besteht das Problem mit der Messung
> innerhalb des Überlaufs vom Timer.

Nö, bei nur einem Überlauf besteht weiterhin kein Problem (Differenzen 
stimmen immer).
Erst bei mehreren Überläufen je Messung muß man sie synchron 
mitzählen:
Beitrag "AVR Timer mit 32 Bit"

von STK500-Besitzer (Gast)


Lesenswert?

Mr.Unklar schrieb:
> Ich spare dadurch 2 Ein-/Ausgänge bei dem kleinen ATTiny!

Dafür aber (mindestens) einen Bautstein mehr.

von STK500-Besitzer (Gast)


Lesenswert?

STK500-Besitzer schrieb:
>> 8MHz
>> 0,15s - 0,22s
> Auf wie viele Timer-Takte kommt man mit diesen Zahlen?

Die Frage ist mMn noch offen.
Als nächstes: Wie viele Überläufe deines Timer-Registers treten auf?

von STK500-Besitzer (Gast)


Lesenswert?

Mr.Unklar schrieb:
> Ich spare dadurch 2 Ein-/Ausgänge bei dem kleinen ATTiny!

Was nu? ATTiny oder ATmega?
Ein ATmega hat im Normalfall eine Input-Capture-Unit. Die erledigt sowas 
in Hardware.
Ein Tiny hat die eher nicht.

von m.n. (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> Ein ATmega hat im Normalfall eine Input-Capture-Unit. Die erledigt sowas
> in Hardware.
> Ein Tiny hat die eher nicht.

STK500 ist veraltet!
ATtiny44, 861, 2313, ..., ATtiny212+++
Alle haben eine Capture-Einheit zu einem Timer.

von Peter D. (peda)


Lesenswert?

m.n. schrieb:
> Alle haben eine Capture-Einheit zu einem Timer.

Nur sollen hier ja 2 Eingänge unabhängig gemessen werden.

von m.n. (Gast)


Lesenswert?

Peter D. schrieb:
> Nur sollen hier ja 2 Eingänge unabhängig gemessen werden.

Das ist doch weder für Dich noch für mich ein ernsthaftes Problem - 
Capture hin oder her.

> Ein Tiny hat die eher nicht.

Diese Information ist veraltet und unzutreffend.

von STK500-Besitzer (Gast)


Lesenswert?

m.n. schrieb:
> STK500 ist veraltet!
> ATtiny44, 861, 2313, ..., ATtiny212+++
> Alle haben eine Capture-Einheit zu einem Timer.

Danke für die Info.
Ich bin inzwischen nicht mehr mit AVR (oder anderen achtbittern) 
unterwegs...

Peter D. schrieb:
> Nur sollen hier ja 2 Eingänge unabhängig gemessen werden.

Nee, eben nicht. Die beiden Eingänge sollen mittels Flip-Flop 
zusammengefasst werden (was ich schon als "umständlich" bezeichnet 
hatte).

von Mittwochs-Gast (Gast)


Lesenswert?

Nö!!!

Peter D. schrieb:
> Nö, bei nur einem Überlauf besteht weiterhin kein Problem (Differenzen
> stimmen immer).

Wenn Timer normal läuft dann z.B. TW2 = 20000, TW1 5000 dann Wert = TW2 
- TW1 = 15000!
Wenn Timer überläuft bei gleichem Abstand von 15000 dann z.B. TW2 = 
5000, TW1 = 55535 dann Wert TW2 - TW1 = -50535!

STK500-Besitzer schrieb:
> > Nur sollen hier ja 2 Eingänge unabhängig gemessen werden.

>Nee, eben nicht. Die beiden Eingänge sollen mittels Flip-Flop
>zusammengefasst werden (was ich schon als "umständlich" bezeichnet
>hatte).

Es sind nach meiner Meinung zwei unabhängige Eingänge, da es ja 2 Spuren 
sind, oder???
Andree

von Mr.Unklar (Gast)


Lesenswert?

Nochmal für den STK500-Besitzer!
Es sind pro Spur 2 LS verbaut, die auf einen 4027 gehen. Dieser Aufbau 
ist ca. 20 Jahre alt und funktioniert immer noch sehr gut, weil er mir 
einen sauberen pos. Impuls liefert. Gemessen habe ich damals mit einem 
RFT-Zähler (kann nur den negativen Impuls messen).
Zur Zeit ist ein ATMega in Funktion als Versuchsaufbau. Später wird es 
ein ATTiny 24! Auch liebäugele ich mit dem neuen ATTiny1624! Und einer 
LCD-Anzeige (einstellig und 8 Zeichen)! Jetzt läuft nur der 
Rundenzähler. Eine Messung mit dem BASCOM-Befehl PULSEIN funktioniert 
auch aber wenn kein Impuls ansteht läuft die Variable immer bis 655535 
und bremst dadurch mein ganzes Programm aus.
Und der Mittwochs-Gast hat das Problem mit dem Überlauf erkannt. Habe 
ganz ähnliche Werte.
Aber das war hier nicht das Thema. Bin immer bemüht, das Problem so weit 
wie möglich einzugrenzen.
Danke nochmals

von Peter D. (peda)


Lesenswert?

Mittwochs-Gast schrieb:
> Wenn Timer normal läuft dann z.B. TW2 = 20000, TW1 5000 dann Wert = TW2
> - TW1 = 15000!
> Wenn Timer überläuft bei gleichem Abstand von 15000 dann z.B. TW2 =
> 5000, TW1 = 55535 dann Wert TW2 - TW1 = -50535!

Die Rechnung muß man natürlich unsigned machen (uint16_t).

von STK500-Besitzer (Gast)


Lesenswert?

Peter D. schrieb:
> Die Rechnung muß man natürlich unsigned machen (uint16_t).

Das sollte selbstverständlich sein.

Mr.Unklar schrieb:
> Nochmal für den STK500-Besitzer!
> Es sind pro Spur 2 LS verbaut, die auf einen 4027 gehen. Dieser Aufbau
> ist ca. 20 Jahre alt und funktioniert immer noch sehr gut, weil er mir
> einen sauberen pos. Impuls liefert. Gemessen habe ich damals mit einem
> RFT-Zähler (kann nur den negativen Impuls messen).
> Zur Zeit ist ein ATMega in Funktion als Versuchsaufbau. Später wird es
> ein ATTiny 24! Auch liebäugele ich mit dem neuen ATTiny1624! Und einer
> LCD-Anzeige (einstellig und 8 Zeichen)! Jetzt läuft nur der
> Rundenzähler. Eine Messung mit dem BASCOM-Befehl PULSEIN funktioniert
> auch aber wenn kein Impuls ansteht läuft die Variable immer bis 655535
> und bremst dadurch mein ganzes Programm aus.
> Und der Mittwochs-Gast hat das Problem mit dem Überlauf erkannt. Habe
> ganz ähnliche Werte.
> Aber das war hier nicht das Thema. Bin immer bemüht, das Problem so weit
> wie möglich einzugrenzen.
Tolle Salamitaktik.
Normalerweise verwendet man einen Mikrocontroller mit zwei Eingängen pro 
Spur.
Warum man privat etwas unbedingt mit irgendwelchen Minimalschaltungen 
realisiern  muss, bleibt mir ein Rätsel.
Dann sollte man auch gleich in Assembler tätig werden.

> Danke nochmals
Da nicht für.

von Peter D. (peda)


Lesenswert?

Mr.Unklar schrieb:
> Eine Messung mit dem BASCOM-Befehl PULSEIN funktioniert
> auch aber wenn kein Impuls ansteht läuft die Variable immer bis 655535
> und bremst dadurch mein ganzes Programm aus.

Die vorgefertigten Legosteinchen können eben nur das, was sich jemand 
vorher mal ausgedacht hat.

Wenn man das ganze Interrupt basiert macht, wird nichts ausgebremst. Der 
Interrupt meldet irgendwann, daß was gemessen wurde oder ein Timeout 
erfolgte und das Main zeigt es nur noch an.
Mit dem Interrupt der Startflanke kann man eins der Compareregister auf 
den Timeout setzen und somit für beide Meßsignale je ein Timeout 
generieren. Sollen die Timeouts >65536 sein, kann man sie auch mit einer 
Zählvariablen erweitern.

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.