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?
hast du irgendwelche Interrupts laufen? Wenn ja, ist dein Programm prinzipiell unbrauchbar. Wie läuft die UART-Ausgabe?
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
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.
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..)
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
@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
Ich denke auch das der UART IRQ das problem ist. Frag dochmal ab ob deine zählvariable überläuft..
>> 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
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..
>> 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
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.
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
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...
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
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...
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.