Dumma LCD, HJÄLP!

Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Dumma LCD, HJÄLP!

Inlägg av net4all »

Hejsan!
Jag använder en PIC 16F628
Jag köpte en LCD (Elfa 75-511-53 den utan backlight) och tänkte först köra i 4-bitars läge.
Jag läste här http://www.isk.kth.se/kursinfo/6b2266/lcd/lcd16x1.htm hur jag skulle göra.

Men det uppstod problem, LCDn reagerade inte på några kommandon alls så jag började med 8-bitar men det gick lika dåligt där. Testade att tima E pulsen på massor av olika sätt, läste data blad men kommer ingen vart.

Nån som har några tips?
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

Tja, troligen har du kopplat fel, eller skrivit fel i dina LCD-rutiner. Beskriv hur du har gjort och visa koden som inte fungerade så kan vi kanske hitta orsaken.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Inlägg av v-g »

Jag antar att du fått "igång" displayen och kopplat så du kan ställa kontrasten. Ställ den så de fyrkanterna som oftast visas på första raden just försvinner. Så långt allt klart hoppas jag.

Nu till det kniviga du MÅSTE läsa databladet, för displayer kräver ofta lite tid för att hinna göra det du önskar PICen är alltså för snabb för att bara kunna köra på. Sen har du R/W och RS pinnarna har du kopplat hur?

Observera att RS skall ändras när man vill skicka kommandon eller text.
Kolla på sidan 13 (bladets egen numrering) så finner du en tabell över kommandona.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Nån som har några tips?

Tips till vadå ?
Du får börja med att tala om vad du har gjort.
*Sen* kanske det går att komma med tips...
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg av net4all »

Kopplingarna har jag kollat många gånger, ska bygga på ett separat kort för att ha så lite komponenter som möjligt.

Koden för 4-bitar skrivet i C "dialekten" CC5X

Kod: Markera allt

/*  lcd16x1.c  LCD-display 4 bit data (nibble) connected to PIC 16F628 */
/*  GTC-1601-TR6N0C 1 (2) line 2x8 example: "Hello wo" + "rld!    "    */
/*  ELFA 75-511-53    c:a 110:-                                        */
/*  Internal ic: KS0066U  used pins: D4-D7, RS, EN, RD/!WR=0           */
/*  William Sandqvist   william@kth.se                                 */

/*
       ________  ________
      |        \/        |       RD/!WR = 0
  D6--|RA2   16F628   RA1|--D5   (only write, wait while busy)
  D7--|RA3            RA0|--D4
      |RA4       RA7/OSC1|
      |RA5/MCLR  RA6/OSC2|
 GND--|Vss            Vdd|-- +5V
      |RB0/INT  (RB7)/PGD|
      |RB1/Rx   (RB6)/PGC|
      |RB2/Tx         RB5|--RS
  EN--|RB3/CCP  (RB4)/PGM|
      |__________________|

*/


#include "16F628.h"
#pragma config |= 0x3f90   // use internal 4MHz oscillator

/* I/O-pin definitions                               */ 
/* change if you need a pin for a different purpose  */
#pragma bit RS  @ PORTB.5
#pragma bit EN  @ PORTB.3

#pragma bit D7  @ PORTA.3
#pragma bit D6  @ PORTA.2
#pragma bit D5  @ PORTA.1
#pragma bit D4  @ PORTA.0


#include "delays.c"

void delay( char ); // ms delay function from file delays.c
void lcd_init( void );
void lcd_putchar( char );
char text1( char );
char text2( char );

void main( void)
{
    CM0=1; CM1=1; CM2=1; // no comparators on PORTA pins

    /* I/O-pin direction in/out definitions, change if needed  */
    TRISB  = 0b11.0.1.0.0.11;  // output to RS and EN ( and Tx )
    TRISA  = 0b1111.0000;      // output to D4-D7

    char i;
    lcd_init();

    RS = 1;  // LCD in character-mode
    // display the 8 char text1() sentence
    for(i=0; i<8; i++) lcd_putchar(text1(i)); 

   // reposition to "line 2" (the next 8 chars)
    RS = 0;  // LCD in command-mode
    lcd_putchar( 0b11000000 );
  
    RS = 1;  // LCD in character-mode
    // display the 8 char text2() sentence
    for(i=0; i<8; i++) lcd_putchar(text2(i)); 
 
   
    while(1) nop();
}

/* ****************** FUNCTIONS ****************************** */

char text1( char x)   // this is the way to store a sentence
{
   skip(x); /* internal function CC5x.  */
   #pragma return[] = "Hello wo"    // 8 chars max!
}

char text2( char x)   // this is the way to store a sentence
{
   skip(x); /* internal function CC5x.  */
   #pragma return[] = "rld!    "    // 8 chars max!
}

void lcd_init( void ) // must be run once before using the display
{
  delay(40);  // give LCD time to settle
  /* Function set */
  RS = 0;  // LCD in command-mode
  //  0010.xxxx   4-bit mode
  lcd_putchar(0b0010.0010); 
  // The display is actual two lines after each other 
  //  4bitmode.two line.display off.xx
  lcd_putchar(0b0010.1.0.00); 

  /* Display ON/OFF Control  */
  //  0000.1.display on.cursor off.blink off
  lcd_putchar(0b0000.1.1.0.0);

  /* Display clear  */
  //  0000.0001
  lcd_putchar(0b0000.0001);

  /* Entry mode set  */
  //  0000.01.increment mode.shift off
  lcd_putchar(0b0000.01.1.0);
  // initialization is done!
}

void lcd_putchar( char data )
{
  // must set LCD-mode before calling this function!
  // RS = 1 LCD in character-mode
  // RS = 0 LCD in command-mode
  // upper Nibble
  D7 = data.7;
  D6 = data.6;
  D5 = data.5;
  D4 = data.4;
  EN = 0;
  nop();
  EN = 1;
  delay(5);
  // lower Nibble
  D7 = data.3;
  D6 = data.2;
  D5 = data.1;
  D4 = data.0;
  EN = 0;
  nop();
  EN = 1;
  delay(5);
}
Delay får PICen att vänta ett antal ms beroende på argument

Hitils har jag testat olika 8,4 bitars program, samt olika kopplingssheman.
Har testat att lägga in pauser mellan varje medelande, men det har inte gett något resultat.

Någon som har ett färdigt program som man vet fungerar? Det har inte jag vilket gör att jag inte vet var problemet sitter....


EDIT: Glömde att skriva att denna kod inte är min, letar efter 8-bitar programmet
EDIT2:mer text
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg av net4all »

v-g: Ja jag har startat upp LCDn och har dom där svarta rutorna, och jag vet att man ska shifta RS boroende om det är text eller data/kommandon.
Problemet är att LCDn helt ignorerar PICen, jag får ingen reaktion hur jag än gör.....

R/W är kopplad till GND för att få logisk 0 så att man bara kan skriva...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Bara en liten fundering...

Notera att det kommando som sätter om LCD'n till 4-bitars-mode,
är ett 8-bitars kommando, och ska alltså *inte* köras som två
nibbles. Du kan alltså inte använda din vanliga 4-bitars funktion
när du initierar LCD'n.
Andra halvan kommer att tolkas som första halvan av nästa
kommando och allt kommer "ur fas".

Jag ser att din kod i princip är samma som på KTH's sida.
*Fungerar* verkligen den ??
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg av net4all »

Jo Sodjan det är samma kod och nej, eftersom jag inte går linjen och inte har någon lärare så vet jag inte om den funkar. Därför har jag försökt skriva egna för 8-bitar men det har inte gått bättre.

Det där med 4 bitars inställningen blev jag osäker på nu. Är det inte så att nibble kommandot bara är 4bitar och resten ignoreras? (tror jag är otydlig igen)

EDIT: Måste bara poängtera att oavsätt vad jag skickar till LCDn så händer inte ett smack.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

En HD44780 LCD befinner sig i 8-bitars mode från power-on/reset.
D.v.s att när man skickar på kommandot för att byta till 4-bitars-mode,
så är den just då fortfarande i 8 bitars-mode och förväntar sig inte
just *då* någon extra nibble.

Om man inte tar hänsyn till det, så kommer förljande 2x4 bits nibbles
att komma ur fas. D.v.s att andra halvan av ett kommando + första
halvan av *nästa* kommando kommer att tolkas av LCD'n som *ett*
kommando, sannolikt med fel resultat...

Notera att LCD'n inte har *något* sätt att veta vad som är första nibblen
och vad som är andra. Den bara antar att varannan nibble är "nummer två".
Man får absolut inte komma fel (missa en nibble, eller som i ditt fall, få en
nibble för mycket), för då blir allt efter det fel...

Alltså, alla kommandon fram till (och inklusive) det kommando som byter
till 4-bitars mode ska skrivas som om man körde med 8-bitar.

Så init rutinen måste ha egna rutiner för att skriva till LCD'n som inte är
samma som senare, i alla alla tills efter sätt-4-bitars-kommandot, efter det
kan även init rutinen köra med 2x4 bitars nibble rutinen...

> Måste bara poängtera att oavsätt vad jag skickar till LCDn så händer inte ett smack.

Nä, du skickar väl fel data till den. Vad annars ??
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg av net4all »

Men om jag vill köra i 8bitar då?
Jag har testat att ställa varje pinne manuellt och sedan skicka en puls på E, det har inte hänt något då...

Ska testa mer imorn.

Just nu spelar det ingen roll om det 8 eller 4 bitar, vill bara få den att lyssna.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Men om jag vill köra i 8bitar då?

Då gäller självklart inte det som gäller för 4-bitars mode.
Eller vad 17 frågar du igentligen ??

> ...och sedan skicka en puls på E.

Hur då ?

Har du en rad med svarta fyrkanter på ena raden efter power-on ?
Har du en korrekt pot till kontrastjusteringen ?
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg av net4all »

1 Jag vill bara få den att fungera först sen kanske det blir 4bitar

2 Ska man inte skicka en puls på E pinnen när data/kommando är tillgängligt?

Fyrkanter, ja
trimpot, ja
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

På min hemsida (under "Freebies") finns det en PDF om hur man kommunicerar och initierar steg-för-steg.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

>...och sedan skicka en puls på E.

Alltså om du skapar E-pulsen också manuellt. Och i så fall hurdå ?
Jag funderar på hur du fixar en "ren" puls på E-pinnen manuellt.

> Fyrkanter, ja
> trimpot, ja

Bra.
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg av net4all »

Sodjan: Pulsen skapar jag med en PIC

Funderar på om det kanske är det där med att man måste initiera LCDn själv som krånglar..... Har ju inte testat det :oops:
Skriv svar