Hi Patrick,

schön wenns jetzt funktioniert.
Zitat Zitat von Patrick91
... oder hat noch jemand eine andere idee? ...
Ich habe (m)einen Tongenerator mit meiner Standard-wait-Funktion geschrieben . . . die ich vor Ewigkeiten irgendwo abgekupfert hatte. (Zweck in diesem Fall: der Controller wartet auf ein high oder low an einem Pin und startet bei erkanntem Level einen kurzen Ton - das Ganze dient dazu, SEHR kurze Spikes zu erkennen - ohne dauernd aufs Oszi schauen zu müssen). Diese Funktion habe ich als Millisekunden- und manchmal (beim 20-MHz-Quarz) als Mikrosekunden-routine. Allgemein bekannter Nachteil: der Controller tut sonst "nix" - was nicht ganz stimmt: z.B. Interrupts muss er trotzdem arbeiten - dabei stimmt dann natürlich die Routinendauer nicht mehr.
Code:
/* =================================================================================
  *** Aufgabenstellung : Tongenerator am baby orangutan B-168-20MHz
        Der Pin PD7 am "linken, unteren" Eingang der pololu-Platine wird auf
        Pegel 1 (ca. + 5V) überwacht. WENN dieser Pegal ansteht, dann wird am
        Port PB2 (links, fünfter von oben)  ein Signal von etwa 1000 Hz ausgegeben.
        ...
        Ton: aktuell (11. Jan. 10) ca. 2,5 kHz bei "990" in waitms             */
// =================================================================================
// =====  Subroutinen  =============================================================
// =================================================================================
 
// =================================================================================
// =================================================================================
/*### Programm pausieren lassen  !! Der Pausenwert ist nur experimentell !*/ 
void waitms(uint16_t ms) 
{ 
   for(; ms>0; ms--) 
   { 
      uint16_t __c = 4000; // Dieser Wert bestimmt die Laufdauer ! ! !
      __asm__ volatile ( 
         "1: sbiw %0,1" "\n\t" 
         "brne 1b" 
         : "=w" (__c) 
         : "0" (__c) 
      ); 
   } 
} 
// =================================================================================
// =====  ENDE    Subroutinen  =====================================================
// =================================================================================