arduino interrupt

hallo Leute

ich hoffe, das ihr mir eventuell helfen könnt, es geht um folgendes: ich versuche seit paar Tagen einen c-Kode zu schreiben welcher folgendes tun sollte:

das ARDUINO-Board, duemillanove, wird mit einem ext-Trigger kontrolliert. Triggersignal dauert einige milisec, und wird nur als einzelner Puls ausgegeben, d.h., das ext-Gerät gibt immer einen Puls heraus. Hier habe ich den ext-Trigger am Pin2 angeschlossen, wegen interrupt 0.

Das ARDUINO-Board soll bei diesem Trigger, einen eigenen Puls herausgeben, wobei die Pulslänge definierte Zahl ist. die definierte Zahl gebe ich über die RS232 Schnittstelle in ARDUINO rein.

Das Programm für die Generierung dieser Zahl hab ich geschrieben und es funktioniert auch.

das Problem liegt bei attachinterrupt-Routine, weil sie keine delay akzeptiert.

bsp-Code: //Interrupt wird ausgelöst attachinterrupt(0, function, RISING)

void function() { digitalWrite(3, HIGH); delay(y); //meine definierte Zahl als int digitalWrite(3, LOW) }

Hier kommt das Problerm, dass die dely inerhalb der Funktion nicht erlaubt ist, bzw. das Programm stürtzt ab. wenn dies funktionieren würde, also mit delay, dann wäre mein Problem gelöst.

kann mir jemand hier helfen, wie kann ich meinen Impuls generieren?

Impulslänge: (1...x000)msec

Muss Dein Arduino sonst noch was machen?

Hast Dus mal ohne Interrupt probiert?

Vielleicht über eine Endlosschleife?

vom Prozess her, das wäre eigentlich das einzige, was das Board machen sollte.

habe es mit digitalRead versucht, aber bekomme einen Timing-Problem.

kann man irgendwie das delay im interrupt umgehen und eine andere funktion verwenden?

Das "arduino-delay" funktioniert im interrupt nicht, weil es auf das inkrementieren einer internen variable wartet. dieses erledigt aber ein anderer interrupt, und der tickt solange nicht, bis dein interrupt abgearbeitet ist. in diesem fall also niemals.

es gibt zwar eine delay function, die hier auch liefe (ist in avr-libc drinnen), aber in einem interrupt hat das eigentlich nichts verloren.

die unschaedlichste variante saehe ca. so aus:

volatile byte irq_flag = 0; // globale variable, "volatile", da in irq verwendet (ist ein muss)

void loop(void) {
  if(irq_flag == 1) {
    /* sende den ping */
    irq_flag = 0; // ruecksetzen des flags
  }
  else {
    /* zeit fuer andere dinge */
  }
}

void function(void) {
  irq_flag = 1;
}

etc.