Problem med 1x8 DOG LCD och PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Axbri
Inlägg: 20
Blev medlem: 6 februari 2010, 20:15:47

Problem med 1x8 DOG LCD och PIC

Inlägg av Axbri »

Jag har köpt den här 1x8 DOG LCD-displayen från ELFA.

Nu försöker jag att styra den med 4-bitars-interfacet ihop med en PIC16F887 som sitter på min EasyPIC5, men det fungerar inte. Displayen är helt död, det kommer inte ens fram några ”skräptecken”. Jag andvänder mikroC 8.2.

Jag har lyckats att styra 2x16 LCD-displayen som följde med och sitter på EasyPIC5, den går på samma typ av interface.

Finns det några fler som har experimenterat med de här displayerna? Hur har ni gjort? Kan det bro på att jag har för långa sladdar mellan PICen och displayen? Eller vad gör jag för fel?

Jag har kopplat så här:

Bild

Bild

Så här ser C-programmet ut:

Kod: Markera allt


char *text = "12345678";

void main() {
  ANSEL  = 0;                              // Configure AN pins as digital I/O
	ANSELH = 0;
  Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); // Lcd_Init

  LCD_Cmd(LCD_CLEAR);                      // Clear display
  LCD_Cmd(LCD_CURSOR_OFF);                 // Turn cursor off
  LCD_Out(1,1, text);                      // Print text to LCD
}
sneaky
Inlägg: 1621
Blev medlem: 22 juni 2009, 18:38:42

Re: Problem med 1x8 DOG LCD och PIC

Inlägg av sneaky »

edit: Gäller ej COG-displayer på riktigt samma sätt, se Fagges inlägg nedan.
Har du testat att justera kontrasten? Jag rev ut en display ur en gammal skrivare som jag försökte sparka igång men lyckades inte. I slutändan visade det sig att den fungerade hela tiden, det var bara det att det inte syntes. Jag hade en annan display som fungerade klockrent i samma krets (utan justering). Värt att kika på i alla fall då du får igång den andra displayen med samma kod.
Senast redigerad av sneaky 24 mars 2010, 18:35:52, redigerad totalt 2 gånger.
Användarvisningsbild
Fagge
Inlägg: 3930
Blev medlem: 27 maj 2003, 13:59:51
Ort: Blekinge

Re: Problem med 1x8 DOG LCD och PIC

Inlägg av Fagge »

Har du kört initieringsprocessen så som man ska göra enligt databladet, inkl delayerna mellan raderna?.
Sneaky: Kontrast inställningen är mjukvaru styrd på dessa DOG displayer.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem med 1x8 DOG LCD och PIC

Inlägg av sodjan »

> Jag har köpt den här 1x8 DOG LCD-displayen från ELFA.

Skriv bara ELFA's artikelnummer så kommer forumet att fixa en
*fungerande* länk (till skillnad från din länk).
sneaky
Inlägg: 1621
Blev medlem: 22 juni 2009, 18:38:42

Re: Problem med 1x8 DOG LCD och PIC

Inlägg av sneaky »

Fagge: Ah, det hade jag ingen aning om. Beklagar missinformationen. Jag låter det dock stå kvar då det kan vara användbart om någon snubblar över det via Google.
bearing
Inlägg: 11497
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Problem med 1x8 DOG LCD och PIC

Inlägg av bearing »

Enligt databladet initieras inte displayen på samma sätt som en vanlig HD44780. Controllern heter ST7036.

Se databladet sida 7. Efter inledande "Function Set" följer fyra steg jag inte känner igen från HD44780.
Bias Set
Power Control
Follower Control
Contrast Set

Du behöver skriva en egen initieringsfunktion för LCD:n. mikroC-funktionen är skriven för HD44780 och innehåller inte de fyra extra stegen.
Användarvisningsbild
Axbri
Inlägg: 20
Blev medlem: 6 februari 2010, 20:15:47

Re: Problem med 1x8 DOG LCD och PIC

Inlägg av Axbri »

ELFAs artikelnummer är: 75-407-39

OK. Jag har kollat i databladet men jag förstår ändå inte hur jag ska programmera PICen för att initiera displayen. Exemplet i databladet verkar vara för 8-bitars interface, jag försökte köra 4-bitars interface.
Användarvisningsbild
jesse
Inlägg: 9235
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Problem med 1x8 DOG LCD och PIC

Inlägg av jesse »

här är en tråd om en liknande display (DOGM 16 x 3) med en hel del info om initiering med mera. De har samma koder, förutom antalet tecken och rader.

I tråden kan du nog hitta länk till databladet för kontrollerkretsen st7036 där det står hur du initierar den som fyra-bitars.

EDIT: nähä, den fanns inte där. Men sök kontrollern på http://www.datasheetarchive.com/ så står allt i det databladet.
EDIT2: Bearing hade visst redan länkat till den. :roll: (se ovan)
bearing
Inlägg: 11497
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Problem med 1x8 DOG LCD och PIC

Inlägg av bearing »

Axbri skrev:OK. Jag har kollat i databladet men jag förstår ändå inte hur jag ska programmera PICen för att initiera displayen. Exemplet i databladet verkar vara för 8-bitars interface, jag försökte köra 4-bitars interface.
Finns en initieringsrutin för 4-bit beskriven i databladet för ST7036 på sidan 41-42.

Här är assemblerkoden för 8051. Borde inte vara så svårt att göra om till C för en PIC.

Kod: Markera allt

;-------------------------------------------------------------------
INITIAL_START:
CALL DELAY40mS
MOV A,#30H ; FUNCTION SET
CALL WRINS_ONCE ; 8 bit, DL = 1
CALL DELAY2mS
MOV A,#30H ; FUNCTION SET
CALL WRINS_ONCE ; 8 bit, DL = 1
CALL DELAY30uS
MOV A,#30H ; FUNCTION SET
CALL WRINS_ONCE ; 8 bit, DL = 1
CALL DELAY30uS
CALL CHK_BUSY
MOV A,#20H ; FUNCTION SET
CALL WRINS_ONCE ; 4 bit, DL = 0
CALL DELAY30uS
MOV A,#29H ; FUNCTION SET
CALL WRINS_CHK ; 4 bit, DL = 0, N = 1,
CALL DELAY30uS ; IS2 = 0, IS1 = 1
MOV A,#14H ;bias
CALL WRINS_CHK
CALL DELAY30uS
MOV A,#78H ;Contrast set
CALL WRINS_CHK
CALL DELAY30uS
MOV A,#5EH ;Power/ICON/Contrast
CALL WRINS_CHK
CALL DELAY30uS
MOV A,#6AH ;Follower control
CALL WRINS_CHK
CALL DELAY30uS
MOV A,#0CH ;DISPLAY ON
CALL WRINS_CHK
CALL DELAY30uS
MOV A,#01H ;CLEAR DISPLAY
CALL WRINS_CHK
CALL DELAY2mS
MOV A,#06H ;ENTRY MODE SET
CALL WRINS_CHK
CALL DELAY30uS
;-------------------------------------------------------------------
MAIN_START:
XXXX
XXXX
XXXX
XXXX
;-------------------------------------------------------------------
WRINS_CHK:
CALL CHK_BUSY
WRINS_NOCHK:
PUSH A
ANL A,#F0H
CLR RS ;EX: Port 3.0
CLR RW ;EX: Port 3.1
SETB E ;EX: Port 3.2
MOV P1,A ;EX:Port1=Data Bus
CLR E
POP A
SWAP A
WRINS_ONCE:
ANL A,#F0H
CLR RS
CLR RW
SETB E
MOV P1,A
CLR E
MOV P1,#FFH ;For Check Bus Flag
RET
;-------------------------------------------------------------------
CHK_BUSY: ;Check Busy Flag
PUSH A
MOV P1,#FFH
$1
CLR RS
SETB RW
SETB E
MOV A,P1
CLR E
MOV P1,#FFH
CLR RS
SETB RW
SETB E
NOP
CLR E
JB A.7,$1
POP A
RET

Användarvisningsbild
Axbri
Inlägg: 20
Blev medlem: 6 februari 2010, 20:15:47

Re: Problem med 1x8 DOG LCD och PIC

Inlägg av Axbri »

Tack för all hjälp, men tyvärr har jag ännu inte lyckats få igång displayen. Jag har gjort så här:

Kod: Markera allt

char *text = "12345678";

void main() {
  ANSEL  = 0;                              // Configure AN pins as digital I/O
	ANSELH = 0;

  PORTB = 0;
  TRISB = 0;                               // portB = output

  Delay_ms(41);                            // wait

  PORTB = 35;                              // 00100011
  Delay_us (2000);                         // wait
  PORTB = 35;                              // 00100011
  Delay_us (30);                           // wait
  PORTB = 35;                              // 00100011
  Delay_us (30);                           // wait
  PORTB = 34;                              // 00100010
  Delay_us (30);                           // wait
  PORTB = 34;                              // 00100010
  Delay_us (30);                           // wait
  PORTB = 33;                              // 00100001
  Delay_us (30);                           // wait
  PORTB = 39;                              // 00100111
  Delay_us (30);                           // wait
  PORTB = 37;                              // 00100101
  Delay_us (30);                           // wait
  PORTB = 38;                              // 00100110
  Delay_us (30);                           // wait
  PORTB = 32;                              // 00100000
  Delay_ms (30);                           // wait

  Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); // Lcd_Init
  LCD_Cmd(LCD_CLEAR);                      // Clear display
  LCD_Cmd(LCD_CURSOR_OFF);                 // Turn cursor off
  LCD_Out(1,1, text);                      // Print text to LCD
}
bearing
Inlägg: 11497
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Problem med 1x8 DOG LCD och PIC

Inlägg av bearing »

Läs här:
http://www.elektronikforumet.com/wiki/i ... le=HD44780
och ev. här
http://ouwehand.net/~peter/lcd/lcd.shtml

Datan överförs till displayen genom att toggla E. Man lägger data på pinnarna, togglar E, och gör en delay, så att LCD:n hinner utföra kommandot. Vid 4-bit kommunikation måste man dela upp en byte i två nibbles, och toggla E vid överföringen av varje nibble.

Jag är osäker på om du kan använda mikroC-rutinerna överhuvudtaget. Antagligen behöver du skriva nya egna Lcd_Config(), LCD_Cmd() LCD_Out().

EDIT: och här finns kod:
http://www.edaboard.com/ftopic145575.html
just den här koden var dåligt formaterad eftersom att den är postad på ett forum. Googling på: hd44780 pic code, eller liknande borde ge bättre exempelkod. Initeringsrutinen måste ändras så att den skickar data enligt databladet för din display.
Användarvisningsbild
jesse
Inlägg: 9235
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Problem med 1x8 DOG LCD och PIC

Inlägg av jesse »

jag tror du har missat att för varje gång du skickar ut ett värde på databussen (PORTB) så måste du skicka en klockpuls också (på pinne E) , för att displayen ska ta emot data. Vilken utgång har du kopplat till klockan och vilken utgång är kopplad till displayens RS-ingång?

När du skickar data (dvs. text och tecken) ska RS vara 1 och när du skickar instruktioner ska RS vara 0 (t.ex vid initiering).

Jag tror att instruktionen PORTB = 35; innehåller flera fel:

1) du skickar ut ett decimaltal mellan 32 och 39, men det är ju fyra bitar som ska skickas ut.
Det är enklare om du skriver hexadecimal kod, t.ex. 0x23, då ser du bitarna uppdelade fyra och fyra. Eller binärt. t.ex. 0b00010010

2) du skickar ut data utan att toggla klockan?

och eftersom det är fyra-bitars överföring kommer du alltid att skicka 2 gånger en halv byte, så du kan med fördel göra detta till en enda 8-bitars funktion ...
...
hur är det - är det bitarna 0 till 3 på PORTB som är databitar? Vad är då bitarna 4-7?
Som du gör nu så skickar du ut ett decimaltal mellan 32 och 39 till porten, har du verkligen koll på vilka bitar du skickar?

Så här skulle jag strukturera upp det ungefär (OBS! ej färdig eller testad kod - bara ett ungefärligt förslag):

Kod: Markera allt

// förutsätter att RS_BIT och CLOCK_BIT är någon av bitarna 4-7 i PORTB 
#define CLOCK_BIT (1<<4) // exempelvis
#define RS_BIT (1<<5)  // exempelvis
#define DATA RS_BIT
#define INSTRUCTION 0

void display_init() {
      delay_us(41); // inledande paus
      send_instruction(0x30);
      delay_us(1600);
      send_instruction(0x30);
      send_instruction(0x29);
      send_instruction(0x14);
      send_instruction(0x30);
      // osv...
     // (siffrorna har jag inte exakt tagit reda på.. de kanske ska vara annorlunda)
}

void send_instruction(unsigned char siffra) {
      send_eight_bits(siffra, INSTRUCTION);
}

void send_data(unsigned char siffra) {
      send_eight_bits(siffra, DATA);
}

void send_eight_bits(unsigned char siffra, char typ) {
// siffra = åttabitars tecken, typ = instruktion eller data
      send_four_bits(siffra, typ);
      send_fout_bits(siffra >> 4, typ);
}

void send_four_bits(unsigned char bitar, char typ) { // ta hänsyn endast till bit 0-3
      PORTB = (siffra & 0x0F) | typ; // typ är RS biten: 1=data, 0 =instruktion
      // här ettställer du sedan den bit som är klockan (E) CLOCK_BIT
      // jag kan inte PIC så jag vet inte bästa sättet att göra det på
      // sedan nollställer du den biten igen - nu har en hel klockpuls skickats ut
      Delay_us (30); // minsta acceptabla paus mellan tecken.
}
En liten översikt:

Funktioner som anropas utifrån:
display_init() - initierar displayen
send_instruction(unsigned char siffra) - skickar enskild instruktion (8 bitars)
send_data(unsigned char siffra) - skickar tecken till displayen

Interna funktioner:
send_eight_bits(unsigned char siffra, char typ) - delar upp 8-bitar i två fyra-bitars data
send_four_bits(unsigned char bitar, char typ) - skickar en fyra bitars kod med 30 µS delay
Användarvisningsbild
Axbri
Inlägg: 20
Blev medlem: 6 februari 2010, 20:15:47

Re: Problem med 1x8 DOG LCD och PIC

Inlägg av Axbri »

Tack igen för alla tips. Jag har försökt många olika varianter, men jag lyckades ändå inte med 4-bitas interfacet. Så jag gav upp det och testade 8-bitars interfacet istället. Det gick bättre, se nedan.

Bild

Och så här blev koden:

Kod: Markera allt

char *text = "Axbri !";

unsigned char siffra = 0;

void main() {
  ANSEL  = 0;                              // Configure AN pins as digital I/O
  ANSELH = 0;

  PORTB = 0;
  TRISB = 0;                               // portB = output

  delay_ms(40);                            // inledande paus

  Lcd8_init(&PORTC, &PORTB);
  
  PORTC.F4 = 0;
  
  PORTB = 0b00110001;
  PORTC.F6 = 1;
  Delay_us (30);
  PORTC.F6 = 0;
  Delay_ms (1);
  
  PORTB = 0b00011100;
  PORTC.F6 = 1;
  Delay_us (30);
  PORTC.F6 = 0;
  Delay_ms (1);
  
  PORTB = 0b01010001;
  PORTC.F6 = 1;
  Delay_us (30);
  PORTC.F6 = 0;
  Delay_ms (1);
  
  PORTB = 0b01101010;
  PORTC.F6 = 1;
  Delay_us (30);
  PORTC.F6 = 0;
  Delay_ms (1);
  
  PORTB = 0b01110100;
  PORTC.F6 = 1;
  Delay_us (30);
  PORTC.F6 = 0;
  Delay_ms (1);
  
  PORTB = 0b00110000;
  PORTC.F6 = 1;
  Delay_us (30);
  PORTC.F6 = 0;
  Delay_ms (1);
  
  PORTB = 0b00001111;
  PORTC.F6 = 1;
  Delay_us (30);
  PORTC.F6 = 0;
  Delay_ms (1);
  
  PORTB = 0b00000001;
  PORTC.F6 = 1;
  Delay_us (30);
  PORTC.F6 = 0;
  Delay_ms (1);
  
  PORTB = 0b00000110;
  PORTC.F6 = 1;
  Delay_us (30);
  PORTC.F6 = 0;
  Delay_ms (1);
  
  Lcd8_Cmd(LCD_CURSOR_OFF);
  Lcd8_Out(1, 1, text);
}
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4714
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Problem med 1x8 DOG LCD och PIC

Inlägg av Swech »

Kod: Markera allt

  PORTB = 0b00011100;
  PORTC.F6 = 1;
  Delay_us (30);
  PORTC.F6 = 0;
  Delay_ms (1);
Är det inte ett perfekt läge att göra en funktion av detta där du skickar med vad du vill ha ut på portb

Kod: Markera allt

  PORTC.F6 = 1;
  Delay_us (30);
  PORTC.F6 = 0;
  Delay_ms (1);
är identisk för alla rader....

Copy and Paste borde vara avstängt i alla editorer för programmering då det är en styggelse :wink:
Allt som upprepas mer än 1 gång bör skrivas som en egen funktion. Då blir det myyycket lättare att ändra
samt att man inte råkar bli av med en kopierad rad någonstans.

Swech
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Problem med 1x8 DOG LCD och PIC

Inlägg av v-g »

Funktioner och macro är smarta saker som sagt, koden blir också mycket mer lättläst! ;)

Och åtminstone i assembler spar man massor med utrymme :hacker:
Skriv svar