Interrupt hooken

OP #4849557
Hallo Leute,

ich hab ein Problem in einer Anwendung, wo sich 1Wire und V-USB in die 
Quere kommen. 1Wire blockiert Interrupts für sein nötiges Timing. Das 
führt dann dazu, dass manchmal USB-Anfragen vom PC kommend übersehen 
werden (Vermutung).

Ich habe mir folgenden Lösungsansatz überlegt: cli/sei bei 1Wire 
entfernen. Dafür muss der USB-Interrupt ein globales "Interrupt 
detected" Flag setzen. 1Wire fragt dieses Flag ab und startet seine 
letzte Aktion ggf. neu.

Da ich mich nicht zuviel in den Untiefen von V-USB bewegen will, würde 
ich gerne den INT0 verbiegen auf eine Funktion, die das detected-Flag 
setzt und dann erst zur USB-Interruptroutine weiter springt.

Was hält ihr von dieser Idee? Geht das vielleicht auch einfacher und ich 
seh den Wald vor lauter Bäumen nicht?

Falls das so sinnvoll ist - ich bewege mich noch halbwegs in 
"normalem" C-Code. Dieser Ansatz birgt für mich noch recht viel Voodoo 
und ich komme nicht recht weiter. Ersuche um Anregungen.

Was ich schon probiert habe:

void (* int0_isr)(void);

uint16_t *int0_addr;

void int0_proceed(void){
  int0_isr();
}

void INT0_detection_init(void){
  int0_addr = 0x0002;
  int0_isr = *int0_addr;
  *int0_addr = &int0_proceed;
}

Aber an 0x0002 steht ja nicht nur die Adresse, sondern auch der Sprung 
drinnen, aber da geht es schon in Richtung Assembler und da bin ich noch 
ziemlich unbedarft... Und vielleicht ist es ja auch komplett der falsche 
Ansatz.
#4849715
Peter Z. schrieb:
> Eine SW-Lösung wäre
> mir lieber.

Gibts aber nicht. Du hast Dir einen ungeeigneten µC ausgesucht.

Bei µC mit Hardware-USB ist der USB Teil lange nicht so zeitkritisch wie 
bei VUSB, wo in Software die Pins zu sehr exakten Zeitpunkten geändert 
oder ausgelesen werden müssen. Daher auch die Interrupt Sperre.
OP #4849757
Jim M. schrieb:
> Peter Z. schrieb:
>> Eine SW-Lösung wäre
>> mir lieber.
>
> Gibts aber nicht. Du hast Dir einen ungeeigneten µC ausgesucht.
>
> Bei µC mit Hardware-USB ist der USB Teil lange nicht so zeitkritisch wie
> bei VUSB, wo in Software die Pins zu sehr exakten Zeitpunkten geändert
> oder ausgelesen werden müssen. Daher auch die Interrupt Sperre.

Gibts nicht gibts nicht. Mittels eines Interrupt verbiegenden Hook 
müsste es gehen, siehe oben. Dazu fehlt mir aber das Know-How und ich 
hoffe auf die Unterstützung des Forums.
Derzeit baue ich eine andere Alternative mittels Timer, der mitläuft und 
anhand dem man erkennen kann, ob ein Interrupt drein gefahren ist.

Aber natürlich lässt sich mit besserer Hardware vieles besser lösen. Das 
war aber nicht die Intention meiner Frage.
Gast #4849777
>führt dann dazu, dass manchmal USB-Anfragen vom PC kommend übersehen
>werden (Vermutung).

Wie kommst du zu dieser Vermutung? Und selbst wenn wird
der PC wohl eine Antwort erwarten. Wenn er sie nicht bekommt
fragt er halt noch mal. Das dürfte ziemlich Banane sein ob
der 1Wire 2s später gelesen wird.

>Was hält ihr von dieser Idee?

Nichts.
Gast #4850238
holger schrieb:
> Wenn er sie nicht bekommt
> fragt er halt noch mal.

So funktioniert USB nicht. Nach den Spezifikationen muss der Client 
antworten. Und wenn es nur ein nak ist. Kann sein, dass der host-stack 
entsprechend Fehlertolerant ist, aber das bleibt Pfusch.

Du wirst nicht drum herumkommen, die von vusb in Assembler geschriebene 
isr zu erweitern. Das einfachste wäre es wohl ein Register mit sbi\cbi 
zu setzen. Informationen über Assembler gibts im avr-tutorial. So schwer 
ist das nicht. Assembler ist deutlich einfacher als c. Wenn dein uC 
gpior-Register besitzt, würden sich diese anbieten.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.