-         

Ergebnis 1 bis 3 von 3

Thema: atmega8 selbständige Frequenzausgabe - Aussetzer??

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.01.2006
    Ort
    Homberg (Efze)/Nordhessen
    Alter
    32
    Beiträge
    207

    atmega8 selbständige Frequenzausgabe - Aussetzer??

    Anzeige

    Hi,

    ich habe ein Programm geschrieben, in dem der Mega 8 einen Lautsprecher ansteuert, der einen Ton ausgibt. Die Frequenz des Tons wird geändert indem man an einem Poti dreht (analogauswertung).
    Das Programm ist realisiert mit

    TCCR1A=&B01000000 'Pin OC1A/PB1 toggeln, kein PWM
    TCCR1B=&B00001010 'Timer Reset bei Compare, Clock/8

    Das Register COMPARE1A wird dann im Programm abhängig vom Analogwert auf 0-1024 gesetzt.

    Das ganze funktioniert ansatzweise, der Lautsprecher gibt einen Ton aus, der sich auch in der Höhe variieren lässt, allerdigngs gibt es oft aussetzer, sodass der Beeper plötzlich ausgeht und für vielleicht 30 sekunden keinen Mucks mehr macht, dann plötzlich macht er wieder weiter als wäre nichts gewesen.
    Insbesondere konnte ich beobachten tritt das auf, wenn man sehr schnell am Poti dreht. Ich habe auch mal ohne Lautsprecher das Oszi an den Port gehängt, genau das gleiche. Der Controller arbeitet aber ansonsten normal, das LCD was nebenbei noch angesteuert wird bekommt alle Informationen unmittelbar und ohne aussetzer.

    Woran kann das also liegen? Kennt jemand Rat?
    Grüße Paul

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Hmm das klingt nach einem Fall von $Stack
    Da läuft irgend was über und der Chip wartet auf den nächsten Überlauf oder was auch immer.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.11.2003
    Beiträge
    1.111
    Sowas ähnliches hatte ich auch mal:
    Ich hatte verwendete den Timer OverflowIRQ in C und es konnte passieren, dass ein Wert geladen wurde, der eine sehr kurze Zeit bis zum nächsten IRQ zur Folge hatte. Dadurch reichte diese Zeit nicht aus, die ISR abzuarbeiten, bevor der nächste IRQ anlag. Dadurch wurden die folgenden Befehle im Schneckentempo abgearbeitet. In meinem Fall hat es 5s gedauert, bis die Stelle im Code erreicht war, an der eine längere Zeitkonstante für den Timer geladen wurde.
    Ein sehr hinterhältiger Fehler!
    Es lag letztendlich daran, dass in C relativ viele Takte verloren gehen, wenn eine Subroutine aufgerufen wird. In Assembler war ich gewohnt, dass das nur wenige Takte sind.
    Vielleicht ist es bei Dir ja ähnlich.
    Gruß

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •