Dumma LCD, HJÄLP!
Dumma LCD, HJÄLP!
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?
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?
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.
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.
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
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
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);
}
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
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...
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...
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 ??
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 ??
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.
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.
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 ??
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 ??