| Autor |
Impulse mit Atmel Controller empfangen und auswerten Suche nach: controller (3563) |
|
|
|
|
BID = 68722
X-Plod Neu hier

Beiträge: 25 Wohnort: Salzgitter
|
|
Hallo
Ich bin in diesem Gebiet Neueinsteiger und habe mich einwenig durch Tutorials gekämpft.
Ich habe einen ATmega8 Microcontroller und möchte folgendes realisieren:
Mein Auto hat ein Tacho, welches Impulse bekommt und diese umwandelt (Drehzahlmesser und Geschwindigkeitsanzeige).
Nehmen wir mal an, ich bekomme 500 Impulse pro 100 Meter. Wie werte ich diese mit dem Controller aus? Mein größtes Problem ist die Sache mit der Zeit. Ich muss ja STrecke durch Zeit dividieren. Nur wie wie sage ich meinem Programm, dass es ab einer gewissen Stelle die Zeit zählen soll? Dafür kenn ich noch keine Befehle.
Wäre über jede Hilfe erfreut. Eventuell auch noch andere Tutorials etc.
mfg |
|
BID = 68746
Jornbyte Moderator
      
Beiträge: 7336
|
|
Es gibt verschiedene Lösungen. Die Impulse würde ich auf INT0 legen und Zählen.
Der interne Timer sollte als Software- oder Hardwarelösung ausgeführt werden . Nun gibt es da bei beiden Nachteile, da der INT0 keine Priorität hat. Jeder Interrupt unterbricht die Softwarelösung für die Zeit des Zählens. Der Timer könnte Zeitgleich mit einem INT0 Interrupt eintreffen, damit kommt es unweigerlich zu Fehler in der Berechnung. Wie groß die sind hängt vom verwendeten Quarz ab.
So, wie ist nun das Proggi aufzubauen in der Softlösung:
Timer für z.b. 0,5 s starten
INT0 erlauben
Ist Zeit vorbei?
Wenn Nein weiter warten
Wenn Ja -> Berechnen und Anzeigen
Alles von vorne
INT0:
Zählen
****************************
Mit Timer/Counter:
Timerinterrupt erlauben
Timer für z.b. 0,5 s starten
INT0 erlauben
Hier warten
INT0:
Zählen
Timerint:
INT0 ausschalten
Berechnen und Anzeigen
INT0 einschalten
Das ist zwar hier recht einfach mit ein paar Zeilen beschrieben, so ist es aber nicht.
Du hast das Problem mit der Zeit angesprochen, das ist einfach. Mal ein Beispiel für 0,5 Sekunden warten bei 16 Mhz Quarz und das als Softlösung:
ldi R17, $48
w0: ldi R18, $BC
w1: ldi R19, $C4
w2: dec R19
brne w2
dec R18
brne w1
dec R17
brne w0
; -----------------------------
; delaying 6 cycles:
ldi R17, $02
w3: dec R17
brne w3
nop
nop
für den Timer habe ich ein kleines Proggi geschrieben, ist im Uplod
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten. |
|
BID = 68748
Marc10k Stammposter
   
Beiträge: 273 Wohnort: Erkelenz
|
Du könntest die Zeit zwischen 2 Pulsen messen und daraus die Geschwindigkeit ableiten. Oder du nimmst einen bestimmten Zeitabschnitt (z.B. 100ms) und zählst dann alle einkommenden Pulse, wobei die erste Möglichkeit wohl eleganter ist. Beides kann mit Hilfe von Timern erreicht werden.
Zu 1:
Ersten Puls abwarten, Zähler starten, 2. Puls kommt Zähler stoppen. Zählerwert ist dann abhängig von der Geschwindigkeit.
Zu 2:
Die Impulse kannst du auf ein Interrupteingang geben und in der Interruptroutine zählen. Den Timer so einstellen das er alle z.B. 100ms ein Interrupt ausgibt und dann in die Routine springt wo der Zählerstand verrechnet wird.
|
BID = 68772
Jornbyte Moderator
      
Beiträge: 7336
|
Also wie ich es beschrieben habe
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 68797
Marc10k Stammposter
   
Beiträge: 273 Wohnort: Erkelenz
|
Genau. Nur ich war nicht ganz so schnell. wawand
So ist es halt im Leben:
Manchmal verliert man und manchmal gewinnen die anderen! :
|
BID = 68866
X-Plod Neu hier

Beiträge: 25 Wohnort: Salzgitter
|
So, habe das mal nachgemessen. Es kommen pro Umdrehung des Rades 4 Impulse an. Radumfang beträgt 195cm
Bei einer Geschwindigkeit von 250km/h (mehr brauch ich nicht) kommen die Impulse mit einer Frequenz f von 142,5 Hz an. Welchen Quarzoszillator würdet ihr mir für diesen Bau empfehlen? Mein ATmega8 kann bis zu 16 MHz vertragen. Nur hab ich hier irgendwo mal gelesen, dass es nicht so gut sei, den Controller mit seiner Maximalfrequenz zu betreiben. Doch warum nur? Hätte gedacht, dass ich den mit 16 MHz nehme, da ich dann sicher sein kann, dass bei der Untersuchung, ob Masse anliegt oder nicht, kein Impuls ignoriert wird.
mfg
|
BID = 68867
Jornbyte Moderator
      
Beiträge: 7336
|
Den Controller kannste ohne Bedenken mit der max. Frequenz betreiben. Beim Hersteller und in den Datenblättern befindet sich kein Hinweis auf so eine Aussage.
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 68873
ERDI-Soft Stammposter
   
Beiträge: 200 Wohnort: Offenburg
|
Ich würde in deinem Fall sogar den internen Oszillator nehmen. Spart dir drei Bauteile (Quarz + 2 Kondensatoren.)
Und bei ner Frequenz von max. 150 Hz würde wahrscheinlich ein 1MHz-Takt reichen.
Wenn du also den internen Oszillator auf 4MHz einstellst, reichd das vollkommen. Spart sogar noch Strom. (Obwohl dich das woh lkaum interessieren dürfte, da ja genug Saft vorhanden ist, wenn das Auto fährt. Oder hast du ne Megawattstereoanlage im Auto?  )
@Marc10k: Ja, ja, das Leben ist hart aber ungerecht.
_________________
Wie immer gilt: Erst googeln, dann fragen!
[ Diese Nachricht wurde geändert von: ERDI-Soft am 11 Mai 2004 15:38 ]
|
BID = 69021
X-Plod Neu hier

Beiträge: 25 Wohnort: Salzgitter
|
Ich habe nochmal eine Frage:
Das Signal, was die Frequenz überträgt, wird beim Impuls auf Masse geschaltet. Jetzt suche ich eine Möglichkeit, dieses Signal am Prozessor zu erkennen.
Ich habe gedacht, dass ich die Strippe vom Impulsgeber an den I/O Port anschließe. Dann wird zwischen I/O Port und Masse ein Kondensator geschaltet. Ebenfalls wird zwischen I/O Port und +5V ein Widerstand geschaltet. Doch wie sind diese Bauelemente zu dimensionieren? Welchen Wert sollten sie haben und warum? Kann mir das einer freundlicherweise kurz verdeutlichen? Kapiers im Moment einfach nicht.
mfg
|
BID = 69037
Jornbyte Moderator
      
Beiträge: 7336
|
Abgesehen vom Pegel des Impulses, der TTL kompatibel sein sollte, kannst du sagen ob der Pin Low oder High auswerden soll. Dafür gibt es die ASM Befehle sbis und cbis.
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 69043
X-Plod Neu hier

Beiträge: 25 Wohnort: Salzgitter
|
Was heißt TTL kompatibel? Es kommt beim Impuls eine Masseverbindung zustande! Brauche da also keinen Spannungswandler oder ähnliches. Und wie meinst du das mit den ASM Befehlen? Das der Controller den Pin High oder Low auswerten kann, ist mir klar! Nur ich brauch da ja einen High/Low Unterschied bei Impuls/Nichtimpuls. Wie ich den Zustande bekomme, möcht ich zurzeit wissen.
mfg
|
BID = 69545
X-Plod Neu hier

Beiträge: 25 Wohnort: Salzgitter
|
Ich habe eine Frage. Ich wollte den Impulsgeber mit einem Pullup Widerstand an den Eingangspin des Atmels anschließen.
Zwischen Eingangspin und Ub+ kommt ein Pullupwiderstand und das Impulssignal kommt dann direkt an den Eingangspin. Nur wie muss ich den PullUp Widerstand dimensionieren? Welchen Wert sollte der haben und wonach richtet sich das?
mfg
|