Skyduino:~#
Articles
arduino, programmation, test

[Test] MicroVga BreakOut

Salut à tous !

Aujourd’hui je vais vous parler de la breakout nommée « MicroVga » et abrégé µVGA.

Le projet µVGA est une breakout qui à pour but de permettre à n’importe quelle microcontrolleur d’afficher du texte sur un ecran VGA via de simple commande série ou SPI.

Mais cette breakout ne ce limite pas à afficher du texte sur un écran !
Non ! Elle comporte aussi une sortie S-Video et une entré PS/2 pour brancher un clavier.

La breakout est axé autour d’un FPGA Xiling XC9572XL qui génére les signaux VGA et S-Video et d’un PIC 24HJ32 qui gére le ports PS/2, le UART et le SPI. C’est ce même pic qui permet la configuration via un menu interne de la breakout.

Pour entrer dans ce menu de configuration il faut faire contact sur un petit jumper annoter « SETUP » pendant quelque instant.

Une fois que cela est fait on aperçois le saint menu.

Pour pouvoir utilisé le µVGA avec une carte arduino il faut passer en mode SPI.

Remarque : L’étoile indique le paramètre par défaut, pas la configuration choisi.

Puis ce rendre sur le site de microVGA et télécharger la librairie arduino.

La version officiel ne semble pas fonctionner … j’ai passer de longue heure avant de trouver LE patch qui va bien !
Le voici, copier/coller le tout dans arduino_uvga.c

// debugged 25/1/10 by Shaun Ruscoe
// changed 14/03/10 by Copabel for Arduino Mega.
// fixed 16/05/10 by Sh00rGEn

/*
  This file implements low-level routines for Arduino MicroVGA-TEXT.

  The MicroVGA has to be configured for SPI mode and connected as follows:

  
1 GND -> Arduino GND
2 +5V -> Arduino 5V
3 +3V3  NOT CONNECTED
4 CS# -> Arduino Digital 10	| Arduino Mega Digital 53
5 SCK -> Arduino Digital 13	| Arduino Mega Digital 52
6 RDY# -> Arduino Digital 8	| Arduino Mega Digital 10
7 MISO -> Arduino Digital 12	| Arduino Mega Digital 50
8 MOSI -> Arduino Digital 11	| Arduino Mega Digital 51

*/
#include "WProgram.h"  
#include "conio.h"

#ifndef __builtin_avr_delay_cycles
void __builtin_avr_delay_cycles(unsigned long __n) {
    while(__n)
        __n--;
}
#endif

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
// Arduino Mega Pin definitions

#define DD_SS     0	// PB0	| Arduino Mega Digital 53
#define DD_MOSI   2	// PB2	| Arduino Mega Digital 51
#define DD_MISO   3	// PB3	| Arduino Mega Digital 50
#define DD_SCK    1	// PB1	| Arduino Mega Digital 52
#define DD_RDY    4	// PB4	| Arduino Mega Digital 10

#else
// Arduino Duemilanove pin definitions

#define DD_SS     2	// PB2	| Arduino Digital 10
#define DD_MOSI   3	// PB3	| Arduino Digital 11
#define DD_MISO   4	// PB4	| Arduino Digital 12
#define DD_SCK    5	// PB5	| Arduino Digital 13
#define DD_RDY    0	// PB0	| Arduino Digital 8

#endif

#define DDR_SPI DDRB


void SPI_MasterTransmit(char cData)
{
    /* Start transmission */
   //SPDR = cData;
   SPDR = cData;
  
   /* Wait for transmission complete */
   while ( ! (SPSR & (1<<SPIF)));
}

#define KEYBUF_SIZE 10
unsigned char keybuf[KEYBUF_SIZE];
unsigned char khead, ktail;

char kbhit;
int _getch()
{
   int key;
  
   while (!_kbhit()) ;
  
   key = keybuf[khead];
   khead++;
   khead %= KEYBUF_SIZE;
  
   if (key == 0) {
       key = 0x100 | keybuf[khead];
       khead++;
       khead %= KEYBUF_SIZE;
   }
  
   return key;
}

int _kbhit()
{
  if (khead == ktail)
      _putch(0);
      
  if (khead == ktail)
     return 0;
    
  if (keybuf[khead] == 0 && ((khead+1)%KEYBUF_SIZE) == ktail) {
     _putch(0);
     if (keybuf[khead] == 0 && ((khead+1)%KEYBUF_SIZE) == ktail)
       return 0;
  }
      
  return 1;
}


void _putch(char ch)
{
   unsigned char response;
  
   __builtin_avr_delay_cycles(100);
   PORTB &= ~(1<<DD_SS); // SS#=0
   __builtin_avr_delay_cycles(100);
    // wait for RDY signal to go low!
   while (PINB & (1<<DD_RDY) );
   __builtin_avr_delay_cycles(100);
  
   /* Start transmission */
   //SPDR = cData;
   SPDR = ch;
  
   __builtin_avr_delay_cycles(100);
  
   /* Wait for transmission complete */
   while ( ! (SPSR & (1<<SPIF)));
   __builtin_avr_delay_cycles(100);
  
   response = SPDR;
   if (response != 0xFF) {
      keybuf[ktail] = response;
      ktail++;
      ktail %= KEYBUF_SIZE;
      kbhit = 1;
   }
  
   __builtin_avr_delay_cycles(100);
  
   PORTB |= (1<<DD_SS); // SS#=0
}


void microvga_init()
{
    kbhit = 0;
    khead = 0;
    ktail = 0;

   /* Set MOSI and SCK output all others input
      This agrees to AVR151 Table 1 also */

   DDRB = (1<<DD_MOSI) | (1<<DD_SCK) | (1<<DD_SS);

   DDRB &= ~(1<<DD_RDY);
   DDRB &= ~(1<<DD_MISO); // MISO is always input
  
   /* Enable SPI, Master, set clock rate fck/16 */
   SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0) | (1<<CPHA);

}

Source : http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1264372292

Ensuite partie fort complexe (non je rigole ;)) le câblage !
Câblage que voici :

(pin) µVGA -> Arduino
(1) GND -> GND 
(2) +5V -> 5V 
(4) CS# -> Digital 10
(5) SCK -> Digital 13 
(6) RDY# -> Digital 8 
(7) MISO -> Digital 12 
(8) MOSI -> Digital 11

Une fois le câblage finit on peut passer au test !
Et quoi de mieux pour faire un test qu’un bon tetris !

Mais il est aussi possible de faire de vrai TUI (Text User Interface) avec des couleurs et tout !

Conclusion :
C’est une board a des capacités très prometteuse, elle peut faire énormément de chose.
Mais je vais lui mettre un (-), pourquoi ?
Et bien premièrement cette breakout ne peut pas être mise à jour,
Le menu de configuration est mal pensé quand on test cette breakout pour la premiére fois voir une étoile en face d’un choix sans savoir ce que cela veut dire laisse perplexe,
la librairie officiel ne marche pas ! Il faut utilisez un patch d’un membre du forum arduino pour la faire marcher c’est vraiment WTF !

Mais maintenant que vous savez tout ça vous ne devriez pas avoir de probléme avec cette breakout 😉

Advertisements

Discussion

Pas encore de commentaire.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.