Forum: Mikrocontroller und Digitale Elektronik Robotersteuerung mit ATTiny 2313-Interrupt nervt


von Tilman W. (tilman)


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

von Pöschi (Gast)


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.

von Tilman W. (tilman)


Lesenswert?

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

von Hannes L. (hannes)


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.)

...

von Tilman W. (tilman)


Lesenswert?

@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 ?

von Sascha (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.