www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Konflikt im Programm durch Interruptroutine?


Autor: Johannes H. (menschenskind)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Ich habe nen MP3-Player aus den üblichen Verdächtigen, nem VS1001 und 
ner SD-Karte gebaut.

Die Steuerung erfolgt über 2 Taster: mit dem einen werden 'Drücker' 
gezählt und mit dem 2. dann bestätigt und dementsprechend Aktionen 
ausgelöst. Habs mittels LED-Blinkenlassen gecheckt. Läuft!

Die beiden Taster sind entprellt und hängen an INT0 und INT1 eines 
Atmega 32.

Die Interruptroutine für den 2. Taster sieht so aus:
volatile char Counter=0;
char Volume=0x10;
ISR(INT0_vect){
  Counter++;
}
ISR(INT1_vect){
  int NewVolume;
    
  switch (Counter){
    case 1:
      Pause(); 
      break;
    case 2:
      break;          //Next Title      
    case 3:
      if( Volume>=10)NewVolume=Volume-10; //LAUTER
      Vol_Change(NewVolume); 
      break;      
    case 4:
      NewVolume=Volume+10;        //LEISER
      Vol_Change(NewVolume); 
      break;    

    }
  Counter=0;

}

Ich habe es mit Lauter und Leiser probiert. Wenn ich dieses Kommando 3 
Mal ausgeführt hatte, dann war auf einmal Ruhe, nix ging mehr.
Beim Ausführen direkt nach dem Start des Players, also sobald die Musi 
spielte ;) war sogar schon nach der 1. Kommandoausführung Sense.

Die Fat-Umgebung ist von Chan und diese nutzt noch diese Routine:
ISR(TIMER2_COMP_vect)
{
  Timer++;      /* Performance counter for this module */
  disk_timerproc();  /* Drive timer procedure of low level disk I/O module */
}

Kann es da denn Konflikte geben? Wegen Laufzeiten oder so?
Ich meine in der INT1-Routine diese Switch-Anweisung ist ja relativ 
schnell durch, nehm ich mal an. Bei der Lautstärkeänderung wird auch nur 
ein kurzes Kommando an den Decoderchip gesendet.
Also alles relativ schnell, wie ich das einschätze.

Bin jedenfalls recht ratlos, wie das Fehlerbild zustande kommt.

Danke für eure Hilfe, schon mal im Voraus.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>volatile char Counter=0;
>char Volume=0x10;

Volume muß auch volatile sein.

>Ich meine in der INT1-Routine diese Switch-Anweisung ist ja relativ
>schnell durch, nehm ich mal an. Bei der Lautstärkeänderung wird auch nur
>ein kurzes Kommando an den Decoderchip gesendet.

Achso, während die Musi außerhalb der ISR Daten an den
Decoder schickt, schickst du in der ISR einfach mal so
auch noch Daten mitten rein in den Stream. Das der Decoder
das nicht mag ist naheliegend.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.