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.