MezData-Logo Creative Commons License 204 Lösungen Button :AVR: SD-Player Ansteuerung

Für unsere Kunstautomaten benötigen wir einen SD-Player, der verschiedene Stereotondateien abspielt. Verschiedene Lösungsmöglichkeiten wurden abgewogen und eine Lösung gefunden. Die Software des Players wird dafür modifiziert. Um ein Stück geziehlt auswählen zu können wird nach dem Start dem Players mit einer Impulsfolge die Nummer {0..5} des gewünschten Stückes übermittelt. Eine Testschaltung mit einem ATtiny2313 soll diese Impulsfolge erzeugen.

Timing für die Anwahl der Stücke

Timing für Wahl Stück 0 Timing für Wahl Stück 1 Timing für Wahl Stück 2
PB0
0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8
PB1
0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8

Prototyp

Quellcode [SDPlayerAnsteuerung.c]
// *** SD-Player Ansteuerung (c) Oliver Mezger 05.03.2011

#include <avr/io.h>     // Definitionen laden
#include <util/delay.h> // Delay-Bibliothek laden

unsigned char keyOld = 0;       // alter Tasten-Zustand
unsigned char keyEnter,keyExit; // gedrueckte und losgelassene Tasten

void keyCheck(){          // Tastaturabfrage mit Flankendedektion 
  unsigned char keyTest,tmp;
  keyEnter = 0, keyExit = 0;
  keyTest = ~PIND & 0b01111111; // Einlesen und zurechtschieben
  if (keyOld != keyTest){       // hat sich was getan
    _delay_ms(10);              // Prellen abwarten
    tmp = ~PIND & 0b01111111;   // nochmal Einlesen und zurechtschieben
    if (tmp == keyTest){        // ist es stabil?
      keyEnter = (~keyOld) & keyTest; // steigende Flanke !alt und neu
      keyExit = keyOld & (~keyTest);  // fallende Flanke alt und !neu
      keyOld = keyTest;
    }
  }
}

unsigned char tasteInStueck(unsigned char n){ // Zuordnung einer Taste zu einem Stueck
  switch (n){
    case 1 : return 0;
    case 2: return 1;
    case 4: return 2;
    case 8: return 3;
    case 16: return 4;
    case 32: return 5;
    default: return 0;
  }
}

#define PLAYIMP 10  // 10ms Abstand zwischen Flankenwechsel
void play(unsigned char n){
  unsigned char i=0;
  PORTB &= ~1;      // Player aus fuer Reset
  _delay_ms(100);   // warten bis Spannung klein fuer Reset
  PORTB |= 1;       // Player an
  if (n > 0){
    PORTB |= 2;     // Taktsignal an
    _delay_ms(80); // Resetzeit des Players abwarten
  }
  while (n > i){    // erzeuge Impuls fuer Stuecke
    PORTB |= 2;     // Taktsignal an
    _delay_ms(PLAYIMP);
    PORTB &= ~2;    //Taktsignal aus 
    _delay_ms(PLAYIMP);
    i++;
  }
}

int main(){         // Hauptprogramm
  PORTB=0b11111100;       // alle LED aus
  DDRB=0xff;        // PB als Ausgang
  while(1){         // Endlosschleife
    keyCheck();
    if (keyEnter >0){
      if(keyEnter >32){
        PORTB &= ~1; // Player aus
      }
      else{
        play(tasteInStueck(keyEnter));
      }
    }
  }
  return 0;
}

Aufgaben