Go Down

Topic: Arduino et LCD couleur (Nokia 6100) (Read 2419 times) previous topic - next topic

wilou94

Bonjour tout le monde !

Je viens de m'acheter "Arduino Main Board" ainsi que "Color LCD Shield" de SparkFun mais voilà j'arrive pas à comprendre le fonctionnement de cet écran, j'ai besoin d'aide ! :'(

Sur le site de SparkFun il propose un exemple de code .... enfin de compte, d'après ce que j'ai pu comprendre c'est juste des fichiers à mettre dans la librairie  ;D, vous me direz si j'ai tort  :).

Donc c'est fichier je les ai mis dans "arduino-0018\libraries\LCDShieldDriver" j'ai enlever les "-" (LCD-Shield-Driver) car sinon j'avais une erreur au lancement du logiciel.

Après avoir inséré les librairies, j'ai regardé les fichiers, tapé un code grâce à ce que j'ai pu voir dans les fichiers mais rien à faire il me met des erreurs:

D:\arduino-0018\libraries\LCDShieldDriver\LCD_driver.c: In function 'LCDClear':

D:\arduino-0018\libraries\LCDShieldDriver\LCD_driver.c:125: error: 'for' loop initial declaration used outside C99 mode

D:\arduino-0018\libraries\LCDShieldDriver\LCD_driver.c: In function 'LCDCommand':

D:\arduino-0018\libraries\LCDShieldDriver\LCD_driver.c:152: error: 'for' loop initial declaration used outside C99 mode

D:\arduino-0018\libraries\LCDShieldDriver\LCD_driver.c: In function 'LCDData':

D:\arduino-0018\libraries\LCDShieldDriver\LCD_driver.c:185: error: 'for' loop initial declaration used outside C99 mode


Voilà, je suis coincer là! Je sais pas quoi faire!

J'espère que vous pourrez m'aider et vous en remercie d'avance. :)
Si besoin je peux donner plus d'informations bien sûr .
Sur ceux bonne soirée à tous !

PS: J'ai déjà utiliser la Arduino avec des montages simples exemple un détecteur de température avec un LM335 et je connais très bien le language C ^^

NO0X

Salut, tu peux nous montrer le code que tu as mit ainsi que le contenu des fichiers dont tu parles ?

wilou94

Les codes sont téléchargeables sur la page suivante:

http://www.cbxdragbike.com/arduino/sparkfunlcd/index.html

et le code que j'ai tapé est le suivant:

#include <LCD_driver.h>
#include <nokia_tester.h>


void setup()   {                
   LCDInit();
}


void loop()                    
{
   LCDClear(black);
}



fdufnews

#3
Jun 23, 2010, 09:35 am Last Edit: Jun 23, 2010, 09:35 am by fdufnews Reason: 1
Je viens de faire un essai.
Les trois erreurs ligne 125, 152 et 185 dans driver.c correspondent à une déclaration de la variable dans un for. si tu déplaces la déclaration de la variable au début de la fonction le code compile correctement. Il reste juste une erreur concernant la variable black qui n'est pas définie dans ton code.

wilou94

J'ai fais les modifications que tu as faite et je n'ai plus d'erreur sur les "for" et pour le black non définie c'est normal car si on regarde la définition de la fonction il me demande un "int" en entré.
Maintenant tout ce compile mais après l'upload aucune réaction sur l'écran  :-?.

Peut-être que j'ai oublié d'alimenter.  ;D

Pour info j'ai juste soudé des pins comme conseillé sur le site de SparkFun pour brancher l'écran au dessus de la arduino, mais est-ce que ca suffit à alimenter?

wilou94

Ma question viens de trouver ca réponse ! Oui c'est alimenté c'est juste qu'il y a pas de retroéclairage donc on voit mal, donc maintenant comment activer le rétroéclairage?

Par contre le code que j'ai fais ne marche pas c'est comme si il n'avait rien reçu, il m'affiche juste le logo de SparFun sur différent fond ( 3 en tout) selon le bouton appuyé !

Donc faut trouver comment rétroéclairer et taper un code valide .

je continu mes recherches et espère que vous pourrez m'aider encore   :)

wilou94

Je viens de faire une autre petite découverte serte peut-être inutile mais bon je le dit quand même, l'écran était déjà programmé et le programme exécuté est celui du main.c, du moins les premières lignes avec l'impression du logo et une couleur de fond changeant en fonction du bouton appuyé! :)

wilou94

Mes recherches mon menés sur un code source permettant l'affichage d'une horloge, après quelques erreurs que j'ai réglé, l'horloge marche! Mais toujours pas de rétroéclairage, c'est peut être à cause de mes soudures donc je vais les refaire et voir si c'est ça!

Je vous tiens au courant et si mon problème n'est pas dû à mes soudures ....... ba ...... je sais plus quoi faire :'(

wilou94

Bon ba ... c'est pas les soudures en même temps ca m'aurais étonné...
Je suis à court d'idée !

J'espère que quelqu'un pourra m'aider.

wilou94

j'ai ramené l'écran LCD à la boutique, et il y aurait un petit problème dessus donc j'attends de voir ce qu'il vont faire avec ! ^^

je vous tiens au courant .

Gozaki

salut,

Si cela t'interesse, j'ai un montage a base de mega qui commande directement un lcd 6100 (bit banged spi vers LCD directement)

Gozaki (laboelectronique.be)

Jean-François

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Gozaki

pour la description du LCD ici :
http://www.laboelectronique.be/lcd6100.html

un peu de code pour Pic au passage et le sketch Arduino ici :
Code: [Select]
#include "LCD_INC.h"

int LED =  13;
int LCD_CS =  24;
int SPI_DO =  22;
int SPI_CLK =  25;
int LCD_RESET =  23;
int LCD_BUTE =  27;
int j;


void gspi_command(unsigned char dat)
{
 digitalWrite(LCD_CS, LOW);
 digitalWrite(SPI_DO, LOW);
 digitalWrite(SPI_CLK, LOW);
  __asm__("nop\n\t");
 digitalWrite(SPI_CLK, HIGH);
  __asm__("nop\n\t");
 gspi_do(dat);
 digitalWrite(LCD_CS, HIGH);
}

void gspi_data(unsigned char dat)
{
 digitalWrite(LCD_CS, LOW);
 digitalWrite(SPI_DO, HIGH);
 digitalWrite(SPI_CLK, LOW);
  //__asm__("nop\n\t");
 digitalWrite(SPI_CLK, HIGH);
  //__asm__("nop\n\t");
 gspi_do(dat);
 digitalWrite(LCD_CS, HIGH);
}

void gspi_do(unsigned char dat)
{
 int i;
 i = 0;
 for(i = 1; i <= 8; i++) // boucle de 8 itérations, une pour chaque bit
  {
   if (dat > (unsigned)127) // test du bit le plus significatif
    {
      digitalWrite(SPI_DO, HIGH); // si le bit=1, DO=1
    }
   else
    {
     digitalWrite(SPI_DO, LOW); // si le bit=0, DO=0
    }
   dat = dat << 1; // déplace les bits de dat d'une case vers la droite
   digitalWrite(SPI_CLK, LOW); // On envoie la clock
  //  __asm__("nop\n\t");
   digitalWrite(SPI_CLK, HIGH);
  //  __asm__("nop\n\t");
  }
}


void LCDSetPixel(int x, int y, int color) {
// Choix de l'adresse de la ligne (commande 0x2B)
gspi_command(PASET);
gspi_data(x);
gspi_data(x);
// Choix de l'adresse de la colonne (commande 0x2A)
gspi_command(CASET);
gspi_data(y);
gspi_data(y);
// On allume le pixel (2nd pixel ignoré)
gspi_command(RAMWR);
gspi_data((color >> 4) & 0xFF);
gspi_data(((color & 0xF) << 4) | ((color >> 8) & 0xF));
gspi_data(color & 0xFF);
gspi_command(NOP);}

void LCDSetrect(int x1, int y1,int x2, int y2, int color) {
// Choix de l'adresse de la ligne (commande 0x2B)
int i;
gspi_command(PASET);
gspi_data(x1);
gspi_data(x2);
// Choix de l'adresse de la colonne (commande 0x2A)
gspi_command(CASET);
gspi_data(y1);
gspi_data(y2);
// On allume le pixel (2nd pixel ignoré)
gspi_command(RAMWR);
for (i = 0; i < ((((x2 - x1 + 1) * (y2 - y1 + 1)) / 2) + 1); i++) {
gspi_data((color >> 4) & 0xFF);
gspi_data(((color & 0xF) << 4) | ((color >> 8) & 0xF));
gspi_data(color & 0xFF);}
gspi_command(NOP);}

void LCDSetCircle(int x0, int y0, int radius, int color) {
int f = 1 - radius;
int ddF_x = 0;
int ddF_y = -2 * radius;
int x = 0;
int y = radius;
LCDSetPixel(x0, y0 + radius, color);
LCDSetPixel(x0, y0 - radius, color);
LCDSetPixel(x0 + radius, y0, color);
LCDSetPixel(x0 - radius, y0, color);
while(x < y) {
if(f >= 0) {
y--;
ddF_y += 2;
f += ddF_y;
}
x++;
ddF_x += 2;
f += ddF_x + 1;
LCDSetPixel(x0 + x, y0 + y, color);
LCDSetPixel(x0 - x, y0 + y, color);
LCDSetPixel(x0 + x, y0 - y, color);
LCDSetPixel(x0 - x, y0 - y, color);
LCDSetPixel(x0 + y, y0 + x, color);
LCDSetPixel(x0 - y, y0 + x, color);
LCDSetPixel(x0 + y, y0 - x, color);
LCDSetPixel(x0 - y, y0 - x, color);
}
}

void setupLCD() {
   // Reset Hardware
 digitalWrite(LCD_RESET, LOW);
 delay(100);
 digitalWrite(LCD_RESET, HIGH);
 delay(100);
 // commande DISCTL
 gspi_command(DISCTL);
 gspi_data(0x00); // div par 2 (defaut) et periode de switching par défaut
 gspi_data(0x20); // 130 lignes utilisées
 gspi_data(0x00); // pas de lignes inversément "highlighted"
 gspi_data(0x00); // no dispersion
 gspi_command(COMSCN);
 gspi_data(0x01); //P1: 0x01 = Scan 1->80, 160<-81
 gspi_command(OSCON);
 gspi_command(SLPOUT);
 gspi_command(VOLCTR);
 gspi_data(0x30);
 gspi_data(0x03);
 delay(100);
 gspi_command(PWRCTR);
 gspi_data(0x0f);
 delay(100);
 gspi_command(DISINV);
 gspi_command(DATCTL);
 gspi_data(0x01);
 gspi_data(0x00);
 gspi_data(0x02);
 gspi_command(DISON);
 LCDSetrect(2,0,132,21,GREEN);
 LCDSetrect(2,22,132,45,RED);
 LCDSetrect(2,46,132,67,BLUE);
  LCDSetrect(2,68,132,89,BLACK);
 LCDSetrect(2,90,132,111,WHITE);
 LCDSetrect(2,112,132,130,YELLOW);
};
void LCDClearScreen(void) {
long i; // loop counter
// Row address set (command 0x2B)
gspi_command(PASET);
gspi_data(0);
gspi_data(131);
// Column address set (command 0x2A)
gspi_command(CASET);
gspi_data(0);
gspi_data(131);
// set the display memory to BLACK
gspi_command(RAMWR);
for(i = 0; i < ((131 * 131) / 2); i++) {
gspi_data((BLACK >> 4) & 0xFF);
gspi_data(((BLACK & 0xF) << 4) | ((BLACK >> 8) & 0xF));
gspi_data(BLACK & 0xFF);
}
}

void LCDPutChar(char c, int x, int y, int size, int fColor, int bColor) {

int i,j;
unsigned int nCols;
unsigned int nRows;
unsigned int nBytes;
unsigned char PixelRow;
unsigned char Mask;
unsigned int Word0;
unsigned int Word1;
unsigned char *pFont;
unsigned char *pChar;
unsigned char *FontTable[] = {(unsigned char *)FONT6x8, (unsigned char *)FONT8x8,
(unsigned char *)FONT8x16};
// get pointer to the beginning of the selected font table
pFont = (unsigned char *)FontTable[size];
// get the nColumns, nRows and nBytes
nCols = *pFont;
nRows = *(pFont + 1);
nBytes = *(pFont + 2);
// get pointer to the last byte of the desired character
pChar = pFont + (nBytes * (c - 0x1F)) + nBytes - 1;
// Row address set (command 0x2B)
gspi_command(PASET);
gspi_data(x);
gspi_data(x + nRows - 1);
// Column address set (command 0x2A)
gspi_command(CASET);
gspi_data(y);
gspi_data(y + nCols - 1);
// WRITE MEMORY
gspi_command(RAMWR);
// loop on each row, working backwards from the bottom to the top
for (i = nRows - 1; i >= 0; i--) {
// copy pixel row from font table and then decrement row
PixelRow = *pChar--;
// loop on each pixel in the row (left to right)
// Note: we do two pixels each loop
Mask = 0x80;
for (j = 0; j < nCols; j += 2) {
// if pixel bit set, use foreground color; else use the background color
// now get the pixel color for two successive pixels
if ((PixelRow & Mask) == 0)
Word0 = bColor;
else
Word0 = fColor;
Mask = Mask >> 1;
if ((PixelRow & Mask) == 0)
Word1 = bColor;
else
Word1 = fColor;
Mask = Mask >> 1;
// use this information to output three data bytes
gspi_data((Word0 >> 4) & 0xFF);
gspi_data(((Word0 & 0xF) << 4) | ((Word1 >> 8) & 0xF));
gspi_data(Word1 & 0xFF);
}
}
// terminate the Write Memory command
gspi_command(NOP);
}
void LCDPutStr(char *pString, int x, int y, int Size, int fColor, int bColor) {
// loop until null-terminator is seen
while (*pString != 0x00) {
// draw the character
LCDPutChar(*pString++, x, y, Size, fColor, bColor);
// advance the y position
if (Size == 0)
y = y + 6;
else if (Size == 1)
y = y + 8;
else
y = y + 8;
// bail out if y exceeds 131
if (y > 131) break;
}
}

void setup()   {                
 // initialize the digital pin as an output:
 pinMode(LCD_CS, OUTPUT);    
 pinMode(SPI_DO, OUTPUT);  
 pinMode(SPI_CLK, OUTPUT);  
 pinMode(LCD_RESET, OUTPUT);  
 pinMode(LCD_BUTE,INPUT);  
 pinMode(LED, OUTPUT);  
 setupLCD();
 LCDPutStr("Colpaert G. 2010", 123, 1, 0, YELLOW, BLUE);
 LCDSetCircle(100, 100, 8, RED);
gspi_command(NOP);}

void loop()                    
{
 digitalWrite(LED, HIGH);  
 delay(1000);
 digitalWrite(LED, LOW);
 delay(1000);
}



je peux passer les fichiers mais j'ai pas encore trouvé comme faire un attach...

Gozaki (laboelectronique.be)

Go Up