Hallo trapperjohn,

ja, die Probleme mit dem "Hängenbleiben" in den Funktionen sind sehr lästig.
Und alle Sensoren per Interrupt zu bearbeiten ist nicht unbedingt übersichtlich und einfach.

Unter ASURO ermittelt Werte für Lib V2.70 myasuro.h selber findest du in dem ASURO-Programm-Teil alle Funktionen (bis auf IR-Empfang) in Interrupts verpackt.
Die Steuerung, welche Sensoren aktiv sein sollen, erfolgt über die in deinem Hauptprogramm zu setzenden Werte in der Variablen: asuro.strg.dat
Code:
  // Muster aus dem dort vorhandenen test.c main()-Programm zum einschalten
  // der RAD-(ODO)-Sensoren und der LINIEN-Sensoren
  asuro.strg.dat |= STRG_RAD;
  asuro.strg.dat |= STRG_LINIE;
  // Wichtig, um sicherzustellen, dass die Sensoren einen Interrupt-
  // Zyklus durch haben und nun kontinuierlich Daten liefern.
  // Aber NICHT zwingend notwendig. NICHTS bleibt hängen!
  while (asuro.sens.dat [SENS_RAD_RD] == 0)
    ;


  // Zum Ausschalten dann bei Bedarf:
  asuro.strg.dat &= ~STRG_RAD;
  asuro.strg.dat &= ~STRG_LINIE;
Das Messen der Batteriespannung und die Erkennung von gedrückten Tasten lässt sich NICHT abschalten. Macht meiner Meinung nach keine Sinn. Tasten werden i.d.R. immer benötigt, und das Messen der Batterie ist ein Abfallprodukt.

Folgende Interrupts / Funktionen sind beteiligt:
- IR-Senden mit: SIGNAL (SIG_UART_DATA)
- Auswahl des nächsten ADC: SIGNAL (SIG_OVERFLOW2)
- ADC-Daten ausgewertet in: SIGNAL (SIG_ADC)

- Der Wahnsinn beginnt hier: Init()
- Angepasst auf gepuffertes, interruptbetriebenes IR-Senden: SerWrite()
- Angepasst auf interruptbetriebene Tasten: PollSwitch()
- Angepasst auf interruptbetriebene Linien-Sensoren: LineData()
- Linien verfolgen bzw. GoTurn-Ersatz: MotorPID()
- Aktuell nicht funktionsfähig: BackLED()


Alle ermittelten Messwerte sind in der Datenstruktur asuro.sens.dat [xxx] vorhanden.
Für xxx gelten:
- SENS_TASTER ==> Tastenwert wie von PollSwitch()
- SENS_BATTERIE ==> geglätteter Batteriespannungswert
- SENS_LINIE_LH ==> Linker Liniensensor bei EINgeschalteter LED
- SENS_LINIE_RH ==> Rechter Liniensensor bei EINgeschalteter LED
- SENS_LINIE_LD ==> Linker Liniensensor bei AUSgeschalteter LED
- SENS_LINIE_RD ==> Rechter Liniensensor bei AUSgeschalteter LED
- SENS_RAD_LH ==> Linker Radsensor bei EINgeschalteter LED
- SENS_RAD_RH ==> Rechter Radsensor bei EINgeschalteter LED
- SENS_RAD_LD ==> Linker Radsensor bei AUSgeschalteter LED (ja, es geht ! )
- SENS_RAD_RD ==> Rechter Radsensor bei AUSgeschalteter LED
- SENS_TIK_L ==> Gezählte Tik’s vom linken Rad
- SENS_TIK_R ==> Gezählte Tik’s vom rechten Rad
- SENS_TASTER_ADC ==> purer ADC-Wert der Tasten


Am besten schaust du dir die Datei asuro_st.h mal an.
Dort sind die Datentypen definiert und beschrieben.
Unter anderem gibt es noch die asuro.my.yyyy-Variablen. Diese sind für die einstellbaren Werte zuständig, um die Tik-Zählerei und GoTurn() zu betreiben. Die werden in Init() vorbelegt.


Dann gibt es noch die von waste entwickelte PID-Funktion.
Ich habe sie MotorPID() genannt und so umgebaut, dass sie sowohl die (waste-)Linienverfolgung, als auch ein Fahren mit Tik-Vorgaben machen kann. (Geradeausfahren (Go()) Drehen auf der Stelle (Turn()) UND Bogenfahrt sind damit möglich.)
Damit ist es NICHT mehr möglich, dass man hängen bleibt. Die Funktion muss allerdings im Hauptprogramm alle 2ms (Zeit hatte waste ermittelt) aufgerufen werden.
Ein Muster ist auch in test.c zu finden. (Aber durch Sparmaßnahmen deaktiviert.)

Warnung:
Sowohl ausro_st.c als auch test.c sind durch ein paar Defines auf Sparmaßnahmen getrimmt. Somit ist es teilweise unübersichtlich.

Ach und noch etwas:
Das Problem mit den Werten der ADC's liegt tatsächlich am Timing. Du hast schon an der richtigen Stelle (Sleepzeit anpassen) eingegriffen.
Im Source von mir wird dies in asuro_st.c mit den Defines ADC_DELAY_.... gelöst. Der Timerinterrupt schaltet auf den nächsten ADC um, und wartet dann aber erst die in den Delay-Defines angegeben Timer-Interrupt-Anzahl, bis der ADC tatsächlich gestartet wird. Dadurch werden alle möglichen Kondensator-Ladezeiten und Einschaltzeiten (z.B. der LED's) überbrückt. Ist hier aber alles per Interrupt gelöst, so das dieses Warten keine CPU-Zeit vergeudet.


Bei Fragen zum Source: Nur zu

Gruß Sterntahler

P.S.: Auch die Entfernungsmessung per IR-Hardware kann im Interrupt betrieben werden: https://www.roboternetz.de/phpBB2/ze...=371678#371678
Dieser Source passt auch zur hier im Forum verwendeten Asuro-LIB, da die Interruptfunktion dank m.a.r.v.i.n's Umbau nur in den Timer 'eingehängt' werden muss.