Forum: Mikrocontroller und Digitale Elektronik "Aussetzter" beim messen von Impulslängen


von Steffen Flämig (Gast)


Lesenswert?

Hallo,

ich habe den PWM-Ausgang eines ADXL an Port B, Bit 1 eines ATMEGA8
angeschlossen.
Es kommen dort Impulse im Längenbereich von 1-10 ms an (hab' mit
verschiedenen Werten probiert).
Die Länge ( H bzw. L Phasen) wollte ich jetzt mit einem in Bascom Basic
geschriebenen Programm messen.
Ich weis, dazu sollte man den internen Timer/Zähler benutzen. Da ich
aber gerade mit der Mikrokontrollerei anfange, wollte ich endlich mal
ein Ergebnis sehen ;-).
Ich habe also schnell die folgende Zählschleife geschrieben und die
Ergebnisse über RS232 an den PC geschickt:

-schnipp---------------------------------------------
$regfile = "m8def.dat"
$crystal = 4000000
$baud = 19200
Config Portb = Input
Dim T1 As Long

Do
  T1 = 0
  While Pinb.1 = 1
    'Warten, bis ein neuer L-Zyklus beginnt
  Wend
  While Pinb.1 = 0
    T1 = T1 + 1
  Wend
  Print T1
Loop
End
-schnapp---------------------------------------------

Die Ergebnisse sehen beispielsweise so aus:

1075
1074
1076
1076
1074
3
1075
1075
.
.
.

O.k., etwas Rauschen und Messungenaueigkeiten sind mir schon klar, aber
es kommen in (glaube ich) unregelmäsigen Abständen regelrechte
Aussetzter.

Hat jemand ne Idee, was die Ursache sein könnte und was man dagegen
machen kann?

MfG Steffen

P.S. Hat jemand vielleicht schon ne fertige Routine zum auslesen eines
ADXL?

von crazy horse (Gast)


Lesenswert?

hast du irgendwelche Interrupts laufen? Wenn ja, ist dein Programm
prinzipiell unbrauchbar.
Wie läuft die UART-Ausgabe?

von Steffen Flämig (Gast)


Lesenswert?

Hallo,

>> hast du irgendwelche Interrupts laufen?

Nein. Das angegeben Programm ist alles, was im Controler läuft.

>> Wie läuft die UART-Ausgabe?
ähh, wie meinst du dass?
Am ATMEGA8 hängt ein MAX232 und dieser an ist an COM1 meines PC
angeschlossen.
Was dort reinkommt, empfange ich mit nem Programm namens
"Multi-threaded TTY.

Wie schon geschrieben, ich habe auch schon die Impulslängen des ADXL
mit verschiedenen Widerständen variiert, immer mit dem prinzipiell
gleichen Ergebnis.

MfG Steffen

von ape (Gast)


Lesenswert?

Wenn das alles is nwas im Controller läuft, wie gibt der dann was ans
UART aus?
bzw ist es möglich das ein PWM signal kommt während der Controller mit
der Kommunikation übers UART ebschäftigt ist? In diesem Fall wäre
nämlich klar das er nur Hausnummern zählt.

von Sven Müller (Gast)


Lesenswert?

MAch das ganz doch mit den Input capture Register.
Gibt auf jeden Fall sichere Ergebnisse, der Capture IRQ hat höhere
Priorität als der vom UART (ist zumindest beim Mega16 so..)

von Steffen Flämig (Gast)


Lesenswert?

Hallo,

>> Wenn das alles is nwas im Controller läuft,
>> wie gibt der dann was ans UART aus?

Wie schon gesagt, ich bin noch blutiger Anfänger. Ich nehme an, das der
Basicbefehl "Print" die die Ausgabe übers USART vollständig
übernimmt. Wie sollte es anders sein, ein einfaches 'Print "foo"'
läst ein 'foo' auf dem Terminalfenste erscheinen.

>> bzw ist es möglich das ein PWM signal kommt während der
>> Controller mit der Kommunikation übers UART ebschäftigt ist?

Da ist möglich, sogar wahrscheinlich. Aber ich arbeite hier nicht mit
interrupts sondern mit einer einfachen Abfrage des Pegels der Leitung
'PB1'.
Dort kann wer weis was passieren, wenn die Leitung nicht gerade
abgefragt wird, interesierts den mC nicht. Denke ich.

MfG Steffen

von Steffen Flämig (Gast)


Lesenswert?

@Sven,

dein Betrag kam jetzt als ich die Antwor auf den vorherigen schrieb.
Ist also jetzt etwas verschachtelt.

Das das alles veil sauberer mit Interupts bzw. Timer geht, weis ich
schon.

Ich werde mich da auch als nächstes dahinterklemmen. Aber ich wollte
mit der einfachen Zählschleife ein schnelles Erfalgserlebnis ;-) unter
eingehen von ein paar Kompromissen.

Das müsste doch prinzipiell gehen, oder? Der compilierte Basic-code
sollte doch eigentlich nur ein paar Register incrementieren solange die
Inputabfrage für PB1=0 ist und dann den Inhalt der Register (die ja der
definierten 'long' Variablen entsprechen) per USART ausgeben.
Die USART Ausgabe klappt auch. aber alle soundsoviele Zählzykle verhaut
sich das Ding;-(.

MfG Steffen

von Sven Müller (Gast)


Lesenswert?

Ich denke auch das der UART IRQ das problem ist.
Frag dochmal ab ob deine zählvariable überläuft..

von Steffen Flämig (Gast)


Lesenswert?

>> Ich denke auch das der UART IRQ das problem ist.
Hab ich jetzt auch schon drüber nachgedacht.
Wenn ich mit dem UART nur sende, kann es dann trotzdem mein Programm an
"anderer" stelle per Interupt unterbrechen?


>> Frag dochmal ab ob deine zählvariable überläuft..
wie meinst du das? Ich habe die Variable in Basic als long definiert.
Ich weis jetzt aus dem Kopf nicht, wie groß so ein long werden kann,
aber ziehmlich groß. Da läuft so schnell nichts über.

MfG Steffen

von Sven Müller (Gast)


Lesenswert?

Gegenfrage: Vielleicht nutzt die Basic Routine ja nen Interrupt wenn ein
zeichen gesendet ist??

Ok, Long läuft nciht so schnell über..weiß auch nicht weiter..

von Steffen Flämig (Gast)


Lesenswert?

>> Gegenfrage: Vielleicht nutzt die Basic Routine ja nen
>> Interrupt wenn ein zeichen gesendet ist??

Keine Anhnung. So ist es halt, wenn man sich einer Hochsprache
anvertraut ;-).

Ich werde mich jetzt mal drübermachen, die Sache in Assembler zu
schreiben...

Bin trotzdem weiterhin für jede Idee dankbar.

MfG Steffen

von crazy horse (Gast)


Lesenswert?

in etwa musste das auch ohne Ints erst mal gehen.
Aber dein Programm hat einen Fehler. Wenn es aus der Senderoutine
zurückkommt, kann es ja sein, dass der Input-Pin schon low ist, das
erste warten entfällt also, und von der low-Zeit kann schon eine ganze
Zeit vergangen sein, so dass nur noch den letzten Rest messen kannst.
Du müüstest also:
1. warten, bis das letzte Byte des vorherigen gesendet worden ist
2. warten, bis am Pin H-Pegel liegt
3. warten, bis L-Pegel anliegt
4. zählen, bis wieder H-Pegel kommt

Wie schon gesagt - alles nicht die optimale Lösung, müsste aber
halbwegs gehen.

von Steffen Flämig (Gast)


Lesenswert?

Hab ich schon probiert:

-schnipp---------------------------------------------
$regfile = "m8def.dat"
$crystal = 4000000
$baud = 19200
Config Portb = Input
Dim T1 As Long

Do
  Waitms 100
  '100ms warten
  T1 = 0
  While Pinb.1 = 0
    'Warten, bis ein neuer H-Zyklus beginnt
  Wend
  While Pinb.1 = 1
    'Warten, bis ein neuer L-Zyklus beginnt
  Wend
  While Pinb.1 = 0
    T1 = T1 + 1               'Zählen, solange der Eingang O ist
  Wend
  Print T1
Loop
End
-schnapp---------------------------------------------

Immer wieder ein ähnliches Ergebnis:
Zählwerte so um die tausend und zwischedrinn immer mal wieder Werte
zwischen 1 und 4.

MfG Steffen

von Hannes Lux (Gast)


Lesenswert?

Hallo...

Rechne mal aus, wie viel Zeit die UART-Übertragung brauch um einen Wert
(4 Stellen + Zeilenabschluss?) zu senden. Du sendest nun jeden
Messwert, reicht dazu die Zeit zwischen zwei Messungen?

...HanneS...

von Steffen Flämig (Gast)


Lesenswert?

Hallo HanneS,

>> Rechne mal aus, wie viel Zeit die UART-Übertragung brauch
Ich weiss aus dem Stand jetzt nicht genau, wie man das ausrechnet
(schäm).
Aber ich habe Wartezeit zwischen zwei Messungen mal auf eine Sekunde
gesetzt.
Die Aussetzter kommen immer noch. könnte sein nicht mehr so häufig.
Aber das kann ich nicht so genau beurteilen, da sie ja sowieso
(scheinbar) zufällig kommen.

>> Du sendest nun jeden Messwert, reicht dazu die Zeit zwischen
>> zwei Messungen?
Bei o.g. Wartezeit von 1 sek sollte sie das.

Btw, Ziel dieser Übung sollte einaml eine Art Datenlogger sein, mit dem
ich Beschleunigungswerte für eine bestimmte Zeit (1 - 10 min) mit
möglicht hoher Auflösung / Genauigkeit messe und für eine spätere
Auswertung irgendwohin schreibe.
Bei "irgendwohin" dachte ich, in Ermangelung an genug RAM in
Reichweite des Controlers, an einen Abtransport via UART zum PC.

Ich glaube, da werden wohl 'ne Menge Probelm auf mich zu kommen.

Gibts irgendwo schon etwas in dieser Richtung?

MfG Steffen

von Hannes Lux (Gast)


Lesenswert?

Hi Steffen...

Sorry, hatte ich übersehen, zumindest sah ich die Warteschleife 100ms
erst als der Beitrag schon weg war...

Naja, wer weiß, wie BASCOM das umsetzt, ich hantiere da in Assembler.
Eine Impulslängenauswertung (Mehrkanal-Fernschalter für RC-Anlage mit
AT90S1200) habe ich mit Interrupt und Timer realisiert.

Hochsprachen sind ja gut und schön, aber ich als AVR-Anfänger möchte
erst mal mit der Architektur der AVRs vertraut werden und bevorzuge
daher Assembler und Simulator des AVR-Studio von Atmel.

Viel Erfolg noch...
...HanneS...

von Steffen Flämig (Gast)


Lesenswert?

Hi HanneS,

>> ...aber ich als AVR-Anfänger möchte erst mal mit der Architektur
>> der AVRs vertraut werden und bevorzuge daher Assembler und
>> Simulator des AVR-Studio von Atmel.

Sehe ich eigentlich genau so. Ich wollte halt nur mal schnell ein
Ergebnis sehen ;-).


>> Viel Erfolg noch...
Danke.

Steffen

von Uwe (Gast)


Lesenswert?

Hi!
Normalerweise muss das gehen, denn du hast ja nur lin.Code.
Ich kenne mich zwar mit Bascom nicht aus aber ein "*.lst" müsste doch
erstellbar sein.Hänge es doch mal an, da kann man schon näheres sagen.
Ich vermute aber eher einen Signalwischer, woher auch immer. Kannst du
nicht einfach Werte von sagen wir mal <10 einfach verwerfen?

MFG Uwe

von Steffen Flämig (Gast)


Lesenswert?

Hi Uwe,

>> Ich kenne mich zwar mit Bascom nicht
Ich auch noch nicht.

>> aus aber ein "*.lst" müsste doch erstellbar sein.
Was meist du damit?

>> Ich vermute aber eher einen Signalwischer, woher auch immer.

Die Vermutung habe ich auch. Es ist alles ein ziehmlich wilder Aufbau
und bei früheren Versuchen mit ADXL habe ich auch schon gemerkt, dass
das Ding durch geringe Erschütterungen offensichtlich schnell an seine
Betriebsgrenzen gerät.
Ich frage mich da manchmal, wie sich dass verhält, wenn man diesen
Sensor in wirklich rauher Umgebung einsetzt. In autonomen Fahr- und
Flugzeugen z.B..

>> Kannst du nicht einfach Werte von sagen wir mal <10 einfach
>> verwerfen?

Ja, aber mir ging es eigentlich ums Prinzip.

MfG Steffen

von Uwe (Gast)


Lesenswert?

Hi!
ein *.lst sollte den ASM-Cod deines "verzapften Basiccodes" enthalten

und den kann man recht gut lesen. Irgendwie habe ich das schon mal
gemacht (wegen Codgrösse), habe aber Bascom nicht mehr drauf und kann
deshalb nicht sagen wie.

<ziehmlich wilder Aufbau
Da wird wohl der Hund begraben sein.

MFG Uwe

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.