Go Down

Topic: Conflit TVout - Shield microSD sparkfun (Read 624 times) previous topic - next topic

flyenix

Bonjour !
J'ai récemment acheté le shield microSD sparkfun (http://www.hobbytronics.co.uk/arduino-microsd-shield) et je souhaite l'utiliser avec la librairie TVout (https://code.google.com/p/arduino-tvout/, librairie qui permet de générer de la vidéo composite).
Le problème c'est qu'il il y a un conflit sur le pin 11 : TVout l'utilise pour la sortie audio, mais le shield l'utilise aussi pour la lecture de la carte microSD..
J'ai fais quelque recherches, et d'autres personnes, notamment à cause du shield ethernet, ont rencontré ce problème.
Le morceau de code pour la génération de signaux audio se trouve dans le fichier TVout.cpp, voici le morceau en question :

Code: [Select]
/* Simple tone generation
*
* Arguments:
*  frequency:
*      the frequency of the tone
* courtesy of adamwwolf
*/
void TVout::tone(unsigned int frequency) {
    tone(frequency, 0);
} // end of tone


/* Simple tone generation
*
* Arguments:
*  frequency:
*      the frequency of the tone
*  duration_ms:
*      The duration to play the tone in ms
* courtesy of adamwwolf
*/
void TVout::tone(unsigned int frequency, unsigned long duration_ms) {

    if (frequency == 0)
        return;

#define TIMER 2
    //this is init code
    TCCR2A = 0;
    TCCR2B = 0;
    TCCR2A |= _BV(WGM21);
    TCCR2B |= _BV(CS20);
    //end init code

    //most of this is taken from Tone.cpp from Arduino
    uint8_t prescalarbits = 0b001;
    uint32_t ocr = 0;
   

    DDR_SND |= _BV(SND_PIN); //set pb3 (digital pin 11) to output

    //we are using an 8 bit timer, scan through prescalars to find the best fit
    ocr = F_CPU / frequency / 2 - 1;
    prescalarbits = 0b001;  // ck/1: same for both timers
    if (ocr > 255) {
        ocr = F_CPU / frequency / 2 / 8 - 1;
        prescalarbits = 0b010;  // ck/8: same for both timers

        if (ocr > 255) {
            ocr = F_CPU / frequency / 2 / 32 - 1;
            prescalarbits = 0b011;
        }

        if (ocr > 255) {
            ocr = F_CPU / frequency / 2 / 64 - 1;
            prescalarbits = TIMER == 0 ? 0b011 : 0b100;
            if (ocr > 255) {
                ocr = F_CPU / frequency / 2 / 128 - 1;
                prescalarbits = 0b101;
            }

            if (ocr > 255) {
                ocr = F_CPU / frequency / 2 / 256 - 1;
                prescalarbits = TIMER == 0 ? 0b100 : 0b110;
                if (ocr > 255) {
                    // can't do any better than /1024
                    ocr = F_CPU / frequency / 2 / 1024 - 1;
                    prescalarbits = TIMER == 0 ? 0b101 : 0b111;
                }
            }
        }
    }
    TCCR2B = prescalarbits;

    if (duration_ms > 0)
        remainingToneVsyncs = duration_ms*60/1000; //60 here represents the framerate
    else
        remainingToneVsyncs = -1;
 
    // Set the OCR for the given timer,
    OCR2A = ocr;
    //set it to toggle the pin by itself
    TCCR2A &= ~(_BV(COM2A1)); //set COM2A1 to 0
    TCCR2A |= _BV(COM2A0);
} // end of tone

/* Stops tone generation
*/
void TVout::noTone() {
    TCCR2B = 0;
    PORT_SND &= ~(_BV(SND_PIN)); //set pin 11 to 0
} // end of noTone


J'ai trouvé des liens interessants : http://arduino.cc/forum/index.php/topic,123796.0.html http://arduino.cc/forum/index.php?topic=119940.5 mais je n'y comprends pas grand chose..
Le problème vient apparemment du fait que la fonction utilise le timer 2, codé sur les sorties 3 et 11.
Je pensais donc qu'il était possible d'utiliser un autre timer par exemple, mais je n'ai pas les compétences ni les connaissances requises à ce niveaux.
Il est possible de régler le conflit en supprimant cette fonction, mais j'ai vraiment besoin de pouvoir générer de l'audio.
Quelqu'un à une idée ? Merci d'avance.

Go Up