Pinguino Forum
Probleme LCD avec 45K50 (Résolu) - Printable Version

+- Pinguino Forum (http://forum.pinguino.cc)
+-- Forum: International (http://forum.pinguino.cc/forumdisplay.php?fid=23)
+--- Forum: Français (http://forum.pinguino.cc/forumdisplay.php?fid=25)
+--- Thread: Probleme LCD avec 45K50 (Résolu) (/showthread.php?tid=4732)



Probleme LCD avec 45K50 (Résolu) - xapon66 - 23-09-2015

Bonjour,

J'ai développé ma propre carte compatible Pinguino 45K50.
J'ai commencé les essais avec un PIC18F4550 dont je disposais.
Je viens de recevoir mon pic18F45K50 et mon application de test qui fonctionnait parfaitement avec le 4550 ne parvient plus à faire fonctionner le LCD alphanumérique avec le 45K50.
Code:
/*    ----------------------------------------------------------------------------

    Simple demo program, input and output, lcd and CDC usb
    <xapon@free.fr>
    ----------------------------------------------------------------------------
    ---------- LCD 4x16
    ----------------------------------------------------------------------------
    01 - VSS (GND)
    02 - VDD (+5V)
    03 - Vo (R = 1K Ohm to GND)
    04 - RS (pin 8 in this ex.)
    05 - RW (GND = LOW = write mode)
    06 - EN (pin 9 in this ex.)
    07 a 10 - D0 a D3   (connected to GND in this ex.)
    11 a 16 - D4 to D7  (pin 0 to 3 in this ex.)
    15 - LED+ (R = 470 Ohm to +5V)
    16 - LED- (GND)
    ---------------------------------------------------------------------------*/
 
// Global vars

u8 s  = 0;
u8 m  = 0;
u8 h = 0;
u8 Relays = 0;
u8 Btn1, Btn2;
u8 opto1,opto2,opto3,opto4;
BOOL send = false;

// This function is called every sec. by timer 0

void tick()
{
    s++;

    if (s > 59)
    {
        s = 0;
        m++;

        if (m > 59)
        {
            m = 0;
            h++;

            if (h > 23)
            {
                h = 0;
            }
        }
    }     
    lcd.setCursor(4, 1);
    lcd.printf("%02u:%02u:%02u", h, m, s);
    
    Btn1 = digitalRead(19);
    Btn2 = digitalRead(20);
    opto1 = digitalRead(13);
    opto2 = digitalRead(14);
    opto3 = digitalRead(15);
    opto4 = digitalRead(16);
    
    lcd.setCursor(0, 2);
    lcd.printf("Btn1 : %1u, Btn2 : %1u", Btn1, Btn2);
    lcd.setCursor(0, 3);
    lcd.printf("E1:%1u E2:%1u E3:%1u E4:%1u", opto1, opto2, opto3, opto4);

    digitalWrite(7,(Relays&0b00000001));
    digitalWrite(6,(Relays&0b00000010));
    digitalWrite(5,(Relays&0b00000100));
    digitalWrite(4,(Relays&0b00001000));
    digitalWrite(3,(Relays&0b00010000));
    digitalWrite(2,(Relays&0b00100000));
    digitalWrite(1,(Relays&0b01000000));
    digitalWrite(0,(Relays&0b10000000));
    if (Relays==0) {
        Relays = 1;
        }
    else {
        Relays = Relays<<1;    
    }
    send = true;
}

void setup()
{
    // 4 bits mode, last four pins are not used
    lcd.pins(22, 24, 25, 26, 27, 28, 0, 0, 0, 0); // RS, E, D4 ~ D8    

    // LCD format
    lcd.begin(20,4); // lines, dotsize

    lcd.home(); // 0, 0
    lcd.printf("Simple Clock Demo");
    CDC.println("Simple Clock Demo");
    
    // Timer0 call function tick() every sec.
    OnTimer0(tick, INT_MILLISEC, 1000);
            
    pinMode(13, INPUT);
    pinMode(14, INPUT);
    pinMode(15, INPUT);
    pinMode(16, INPUT);
    pinMode(19, INPUT);
    pinMode(20, INPUT);
    pinMode(21, OUTPUT);
    pinMode(0, OUTPUT);
    pinMode(1, OUTPUT);
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);

    digitalWrite(21,1);

}
 
void loop()
{
  if (send)
  {
      send = false;
      CDC.printf("Time : %02u:%02u:%02u \r\n", h, m, s);
      CDC.printf("Inputs : E1:%1u E2:%1u E3:%1u E4:%1u \r\n", opto1, opto2, opto3, opto4);
      CDC.printf("Btn1 : %1u, Btn2 : %1u \r\n", Btn1, Btn2);
   }

}

Quelqu'un aurait-il un début d'explication ?


RE: Probleme LCD avec 45K50 - regis - 27-09-2015

J'ai ici un Pinguino 45K50 qui marche parfaitement avec la lib lcd et un afficheur 2x16.
Peux-tu commenter les lignes CDC pour voir si ceka marche à nouveau ?


RE: Probleme LCD avec 45K50 - xapon66 - 29-09-2015

(27-09-2015, 08:03 PM)regis Wrote: J'ai ici un Pinguino 45K50 qui marche parfaitement avec la lib lcd et un afficheur 2x16.
Peux-tu commenter les lignes CDC pour voir si ceka marche à nouveau ?

J'avais ajouté les lignes CDC après mais je vais réessayer d'enlever tout le code qui ne touche pas au LCD et refaire le test comparatif.
Pour info, j'ai aussi essayé avec un exemple simple et cela ne marche pas non plus.
Est-ce qu'il peut y avoir un problème suivant le boot loader que j'ai installé et la fréquence de l'oscillateur interne ?
Je me demande s'il ne peut pas y avoir un problème de niveau des E/S du PIC18F45k50 ?
A+

Xavier


RE: Probleme LCD avec 45K50 - regis - 30-09-2015

Pour moi, il n'y a pas de lien ni avec le bootloader ni avec le niveau des I/O.
Les problèmes survenant avec les LCD sont souvent en liés à de mauvais timings.
Si ton programme faisait appel à des interruptions ce pourrait être une des causes.
En tous cas, tu peux aller voir du coté de la fonction lcd_pulseEnable qui est le coeur de cette lib et ajouter des délais.


RE: Probleme LCD avec 45K50 - xapon66 - 01-10-2015

Bof !
Je viens de passer deux trois à chercher. Ça résiste toujours.
Est-ce qu'un qu'une des fonctions alternatives sur le port D ne pourrait pas avoir la priorité ?
Il y a les ports analogiques 20 à 27 et Les sorties PWM P1B, P1C et P1D qui pourraient poser problème.
Je vais le commander individuellement en sortie pour vérifier.


RE: Probleme LCD avec 45K50 - regis - 01-10-2015

Tu utilises quelles pins ?


RE: Probleme LCD avec 45K50 - xapon66 - 01-10-2015

C'est écrit dans le code mais je le remets.
// 4 bits mode, last four pins are not used
lcd.pins(22, 24, 25, 26, 27, 28, 0, 0, 0, 0); // RS, E, D4 ~ D8
Les pins 26, 27 et 28 sont partagés avec P1B, P1C et P1D qui sont prioritaires d'après la datasheet.
Je viens de les tester en les commandant une par une => elles sont bloquées au niveau bas.


RE: Probleme LCD avec 45K50 - xapon66 - 02-10-2015

C'est bon !
Le problème est résolu.
Je viens de me rendre compte que la numérotation des broches est différente entre le PIC18H4550 et le 45K50.
Bref, un programme qui fonctionne sur 4550 doit être adapté pour fonctionner avec le 45K50.
=> cela devrait être indiqué en gras dans le WIKI !


RE: Probleme LCD avec 45K50 - regis - 02-10-2015

Edit1 : Oops nos messages se sont croisés ;-)
Edit2 : http://wiki.pinguino.cc/index.php/PIC18F45K50_Pinguino#Pin_Out
[Image: 700px-P45k50_cr.png]

Toutes ces pins fonctionnent très bien sur mon 45K50.
Tu as peut-être une vieille version du fichier digital.h ?
Il me semble me souvenir que certaines pins avaient été omises dans les premières versions.
Tu devrais avoir ceci :

Code:
/**********************************************************************/
#elif defined(PINGUINO45K50)
/**********************************************************************/
                                                   // Pinguino pin number
const unsigned char mask[36]={
                   _0,_1,_2,_3,_4,_5,_6,_7,        // 00 - 07
                   _0,_1,_2,_3,_4,_5,_6,_7,        // 08 - 15
                   _0,_1,_2,_3,_4,_5,_6,_7,        // 16 - 23
                   _0,_1,_2,_3,_4,_5,_6,_7,        // 24 - 31
                   _0,_1,_2,_3                        // 32 - 35
                   };

const unsigned char port[36]={
                   pB, pB, pB, pB, pB, pB, pB, pB,
                   pA, pA, pA, pA, pA, pA, pA, pA,
                   pC, pC, pC, pC, pC, pC, pC, pC,
                   pD, pD, pD, pD, pD, pD, pD, pD,
                   pE, pE, pE, pE
                   };



RE: Probleme LCD avec 45K50 - xapon66 - 03-10-2015

Et moi j'ai utilisé ça pour démarrer :
[Image: PIC18F4550_diagram.png]