Robotersteuerung mit ATTiny 2313-Interrupt nervt

OP #255201
Lesenswert?
• ▲
▼
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
Gast #255202
Lesenswert?
• ▲
▼
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.
#255204
Lesenswert?
• ▲
▼
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.)

...

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.