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


von Johannes (menschenskind)


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:
1
volatile char Counter=0;
2
char Volume=0x10;
3
ISR(INT0_vect){
4
  Counter++;
5
}
6
ISR(INT1_vect){
7
  int NewVolume;
8
    
9
  switch (Counter){
10
    case 1:
11
      Pause(); 
12
      break;
13
    case 2:
14
      break;          //Next Title      
15
    case 3:
16
      if( Volume>=10)NewVolume=Volume-10; //LAUTER
17
      Vol_Change(NewVolume); 
18
      break;      
19
    case 4:
20
      NewVolume=Volume+10;        //LEISER
21
      Vol_Change(NewVolume); 
22
      break;    
23
24
    }
25
  Counter=0;
26
27
}

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:
1
ISR(TIMER2_COMP_vect)
2
{
3
  Timer++;      /* Performance counter for this module */
4
  disk_timerproc();  /* Drive timer procedure of low level disk I/O module */
5
}

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.

von holger (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.