Hallo und guten Abend, ich habe ein Assembler Programm für den AT Tiny 2313 geschrieben. Ein Interrupt wird ausgelöst, sobald über UART ein Zeichen empfangen wird. Dann wird ein Unterprogramm abgearbeitet, das die Elektromotoren eines Roboters ansteuert. Funktioniert soweit. Gleichzeitig steuert das gleiche Programm ein Ultraschallmodul. In einer Schleife wird ständig die Entfernung des US Moduls zum nächsten Hindernis gemessen. Auch das funktioniert. Mein Problem ist jetzt aber, dass wenn ich andauernd Steuerzeichen (also konkret: Vorwärts, wenn Entfernung>20cm und STOP, wenn Entfernung<20cm) zum Tiny schicke, dann geht das US Modul nicht mehr richtig. Es gibt dann nur noch Quark aus. Ich vermute, dass dann einfach zu oft der Interrupt ausgelöst wird und der Rest des Programms zu stark gebremst wird. Was kann ich da machen ? Danke für Tips, Tilman
Hi, dektiviere doch einfach den Interrupt, wenn du die Entfernung misst. Wenn der AVR über den UART ein Byte empfängt bleibt es in dem Datenregister bis es ausgelesen wird. Um einen Datencrasch zu vermeiden muss dein UART nach jedem ausgelesenem Byte ein Antwort senden und erst dann kommen das nächste Byte. Sowas in der Art sollte funktionieren, hab ich auch mal gemacht: PC Schickt ein Byte an MC und wartet bis der die Daten verarbeiten kann und eine Antwort schickt erst dann schickt der PC die restlichen Bytes.
Ja, gute Idee, ich werds mal ausprobieren. Weiss allerdings im Moment noch nicht, wie man den Interrupt zur Laufzeit deaktiviert...mal im Datenblatt nachgucken oder so
Wenn das Programm mehrere Jobs parallel ausführen soll, dann muss es auch dementsprechend programmiert worden sein (Programmierstil). Dazu gehört (unter Anderem), dass: - die ISRs so kurz (schnell) wie möglich sind (keine Warteschleifen!), - die ISR keine Unterprogramme aufruft, sondern nur ein Flag setzt, welches vom Hauptprogramm ausgewertet wird, das dann das Unter- Programm aufruft und das Flag wieder löscht, - Unterprogramme des Hauptprogramms sofort zum Hauptprogramm zurück springen, falls sie im Moment nix ausrichten können (z.B. Busywait), - Unterprogramme und Hauptprogramm keine Warteschleifen enthalten, sondern evtl. Verzögerungen von einem (sowiso benutzten) Timer (über Flags) synchronisiert werden... (Die Liste lässt sich erweitern.) ...
@Pöschi: Vielen Dank, das klappt ! (cli & sei), hätte ich gar nicht gedacht, denn die Zeit, in der der Interrupt ausgeführt werden kann, kann höchstens 1 oder 2 Systemtakte sein...aber egal- es geht nun. @Hannes: Ja hmmm. was heisst ISR ?
ISR = Interrupt Service Routine :) Oder auf Deutsch, Die Routine, die der jeweilige Interrupt anspringt. Mfg Sascha
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.