[APL] Vidéo avec Arduino, afficher sur moniteur

C'est surement mieux formaté sur pastie, mais si tu es paresseux...
(EDIT ou si pastie fini par jetter cette entré)

P.S. Je code dans TextMate plutôt que l'IDE en utilisant le Makefile, raison pour laquelle il y a le include et les prototypes.

#include "WProgram.h"

#define      DEBUG                        1
//#define      USE_SPI                        1

// Définition des pins
#define PIN_SYNC                  8
#define PIN_VIDEO                  9
#define PIN_LED                        12
#define PIN_AUDIO                  11

#define _SYNC                        0x00
#define _BLACK                        0x01
#define _GRAY                        0x02
#define _WHITE                        0x03

// Non modifié, voir mon post! (pas sur de comprendre)
#define _LONG_SYNC                  19
#define _SHORT_SYNC                  2
#define _LONG_SYNC_DELAI      2
#define _SHORT_SYNC_DELAI      30

#define _NB_PIXELS                  29
#define _NB_LIGNES                  19

#define      _NB_TV_LIGNES            262      // Modifié pour NTSC

#define _COMPENS_BOUCLE            7
#define _COMPENS_IF_SERIAL      17

#define _BAUD_RATE                  19200

// Prototypes
void SPI_MasterInit(void);
void clearScreen(boolean mode);
#ifdef DEBUG
      void blinkStatus(void);
#endif
void resetCursor(void);

// Variables definition
byte memVideo[_NB_PIXELS][_NB_LIGNES];
byte index, index2;

int ligne;
char c;
int cx=(_NB_PIXELS / 2), cy=(_NB_LIGNES / 2);
byte couleur = _BLACK;

#ifdef USE_SPI
void SPI_MasterInit(void)
{
      /* Set MOSI and SCK output, all others input */
      DDRD = (1<<DDB0)|(1<<DDB1);
      /* Enable SPI, Master, set clock rate fck/16 */
      SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
#endif

// Fonction d'effacement de l'écran (avec possibilité de faire un "cadriage" pour les tests)
void clearScreen(boolean mode)
{
      for (index2 = 0; index2 < _NB_LIGNES; index2++)
            for (index = 0; index < _NB_PIXELS; index++)
                  if (!mode) {
                        memVideo[index][index2] = _BLACK;
                  } else {
                        memVideo[index][index2] = (index + index2) % 3 + 1;
                  }
      
      memVideo[0][0] = _WHITE;
      
      resetCursor();
}

// Remet le curseur au milieux
void resetCursor(void)
{
      cx=(_NB_PIXELS / 2);
      cy=(_NB_LIGNES / 2);
}

#ifdef DEBUG
void blinkStatus(void)
{
      int ii;
      
      pinMode(PIN_LED, OUTPUT);
      
      for(ii=0;ii<3;ii++)
      {
            digitalWrite(PIN_LED, HIGH);
            delay(75);
            digitalWrite(PIN_LED, LOW);
            delay(75);
            digitalWrite(PIN_LED, HIGH);
            if (ii < 2) delay(75);
      }
}
#endif

void setup()
{
      pinMode(PIN_SYNC, OUTPUT);
      pinMode(PIN_VIDEO, OUTPUT);
      pinMode(PIN_AUDIO, OUTPUT);
      
      digitalWrite(PIN_SYNC, HIGH);
      digitalWrite(PIN_VIDEO, HIGH);
      
#ifdef USE_SPI
      SPI_MasterInit();
#endif
      Serial.begin(_BAUD_RATE);
      Serial.println("GO");
      
      clearScreen(true);
#ifdef DEBUG
      blinkStatus();
#endif
}

void loop()
{
      // SYNC VERT A
      
      /**
       * Cette section je suis pas certain de comprendre
      **/
      
      // ligne 1 LONG SYNC
      PORTB = _SYNC; delayMicroseconds(_LONG_SYNC);
      PORTB = _BLACK; delayMicroseconds(_LONG_SYNC_DELAI);

      PORTB = _SYNC; delayMicroseconds(_LONG_SYNC);
      PORTB = _BLACK; delayMicroseconds(_LONG_SYNC_DELAI);

      // ligne 2 LONG SYNC
      PORTB = _SYNC; delayMicroseconds(_LONG_SYNC);
      PORTB = _BLACK; delayMicroseconds(_LONG_SYNC_DELAI);

      PORTB = _SYNC; delayMicroseconds(_LONG_SYNC);
      PORTB = _BLACK; delayMicroseconds(_LONG_SYNC_DELAI);

      // ligne 3 MIXTE SYNC
      PORTB = _SYNC; delayMicroseconds(_LONG_SYNC);
      PORTB = _BLACK; delayMicroseconds(_LONG_SYNC_DELAI);

      PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
      PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);

      // ligne 4 SHORT SYNC
      PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
      PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);

      PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
      PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);

      // ligne 5 SHORT SYNC
      PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
      PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);

      PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
      PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI-_COMPENS_BOUCLE);

      // IMAGE

      for (ligne = 0; ligne < _NB_TV_LIGNES; ligne++)
      {
            //** synchro

            // HSync
            PORTB = _SYNC;
            delayMicroseconds(4.7);      // Modifier NTSC

            // Black
            PORTB = _BLACK;
            delayMicroseconds(4.7);      // Modifier NTSC
            
            //** image ligne 51.5 uS
            
            for (index = 0; index < _NB_PIXELS; index++)
            {
                  PORTB = memVideo[index][ligne>>4];
                  PORTB = PORTB;      // Pas sur de comprendre ???
                  PORTB = PORTB;      // Pas sur de comprendre ???
            }
            
            delayMicroseconds(1.4);      // Modifier NTSC
            
            /**
             * Cette section je suis pas certain de comprendre
            **/
            PORTB = _BLACK;
            PORTB = _BLACK;
            PORTB = _BLACK;
            PORTB = _BLACK;
            PORTB = _BLACK;

            PORTB = _BLACK;
            PORTB = _BLACK;
            PORTB = _BLACK;
            PORTB = _BLACK;
      }

      // SYNC VERT B
      
      /**
       * Cette section je suis pas certain de comprendre
      **/
      
      // ligne 310 LONG SYNC
      PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
      PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);

      PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
      PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);

      // ligne 311 SHORT SYNC
      PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
      PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);

      PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
      PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);

      // ligne 312 SHORT SYNC
      PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
      PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);

      PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
      PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI-_COMPENS_BOUCLE-_COMPENS_IF_SERIAL);

// Fin au prochain poste