Sari la conținut
ELFORUM - Forumul electronistilor

Problema LCD-PIC


Vizitator SimonaAlexandra7

Postări Recomandate

Eu m-am lovit de problema asta. UIte aici:

http://www.elforum.info/topic/103823-lcd-hd4478-nu-vrea-sa-mearga-in-mikroc/

 

Nu am primit nici eu raspuns.

 

Cand compilatoarele astea complexe dau astfel de erori, mai bine o iei de la 0 si gata.

Spun asa dupa ce am cautat destul despre probema din cazul meu.

 

De ex:

http://www.mikroe.com/forum/viewtopic.php?t=21000

// LCD module connectionssbit LCD_RS at RB4_bit;sbit LCD_EN at RB5_bit;sbit LCD_D4 at RB0_PORTB_bit; //change thissbit LCD_D5 at RB1_PORTB_bit; //change thissbit LCD_D6 at RB2_bit;sbit LCD_D7 at RB3_bit;

Cineva sugera o forma de genul asta. Oricum chestii pe care nu le-ati fi banuit.

 

In simularea nu am PIC-ul ala, am doar PIC18F4620

Link spre comentariu

 dar nu inteleg de ce ar fi asa daca nu ai WDT activat.

Din partea frantuzeasca inteleg ca ai nedumeriri la ce i-am zis lu' Vlad. Raspunsul e prin data-sheet si suna ceva de genul "creste curentul consumat..."

Din partea cu WDT, inteleg ca totusi intrebi de comportamentul de la sfarsitul programului fara bucla infinita.

Eu tin minte ca am citit ceva de genul asta si printr-o documentatie de la uChip, da' la o cautare rapida n-am gasit nimic.

In cazul compilerului pe care-l folosesc de ani de zile (picc/xc8) raspunsul e mai usor - citeste citatul pe care l-am pus in postul anterior. :)

Link spre comentariu

Am citit in intregime, de data asta, mesajul tau precedent. Prima oara am renuntat dupa primele paragrafe :56 , textele lungi... Nu am avut si nu am intentia sa contest, doar m-a mirat mesajul tau. E adevarat ca toate programele au bucla necesara si o configurare a registrilor in consecinta.

 

Daca pun programul de mai jos in PIC, dupa ultimul delay de 1sec LCD-ul ramane vesnic gol (de altfel dupa primul delay), nu se reseteaza PIC-ul si, deci, nu reporneste programul. Banuiesc ca la compilatoarele Mikroe nu se aplica textul tau in "Franceza".

 

PS: consumul porneste de pe la 3,5mA (LCD-ul e fara iluminare) si se stabilizeaza apoi pe la 4.2mA. Banuesc ca variatia se datoreaza si multimetrului meu de 10$ la oferta (1 secunda fiind prea putin sa se hotarasca sa afiseze o valoare stabila). Fara WDT activat.

 

PPS: imi e prea lene sa scriu un cod in MPLAB-ul de-l mai am instalat ca sa verific ce zice datasheet-ul. Sa zicem ca ma complac cu compilatorul Mikroe.

' * Test configuration:'     MCU:             PIC 16f690'     Oscillator:      INTOSC 8.0000 MHzprogram _16F690_test' LCD setupdim  LCD_RS as sbit at RC0_bit  LCD_EN as sbit at RC1_bit  LCD_D4 as sbit at RC2_bit  LCD_D5 as sbit at RC3_bit  LCD_D6 as sbit at RC4_bit  LCD_D7 as sbit at RC5_bit  LCD_RS_Direction as sbit at TRISC0_bit  LCD_EN_Direction as sbit at TRISC1_bit  LCD_D4_Direction as sbit at TRISC2_bit  LCD_D5_Direction as sbit at TRISC3_bit  LCD_D6_Direction as sbit at TRISC4_bit  LCD_D7_Direction as sbit at TRISC5_bit' Set-up the PICsub procedure InitMain()    OPTION_REG =   0x80              ' Pull-up disabled    INTCON     =   0x00              ' No INT    CM1CON0    =   0x00              ' No COMP    CM2CON0    =   0x00              ' No COMP    CM2CON1    =   0x00              ' No COMP        CCP1CON    =   0x00              ' No PWM    ANSEL      =   0x00              ' No Analog Is    ANSELH     =   0x00              ' No Analog Is        PORTA      =   0x00              ' Clear PORTA    PORTB      =   0x00              ' Clear PORTB    PORTC      =   0x00              ' Clear PORTC    TRISA      =   0xFF              ' All inputs    TRISB      =   0xF0              ' All inputs    TRISC      =   0xC0              ' RC0-5 outputs, RC6-7 inputsend submain:' Main program  InitMain()  Lcd_Init()                     ' Initialize Lcd  Lcd_Cmd(_LCD_CLEAR)            ' Clear display  Lcd_Cmd(_LCD_CURSOR_OFF)       ' Cursor off  LCD_Out(1,1, "So, what's next?")  LCD_Out(2,1, "hmmm... nothing")  Delay_ms(1000)                 ' Waste 1 sec of my time  Lcd_Cmd(_LCD_CLEAR)            ' Clear display  Delay_ms(1000)                 ' 1 sec of pure... nothingnessend.

Eu m-am lovit de problema asta. UIte aici:

http://www.elforum.info/topic/103823-lcd-hd4478-nu-vrea-sa-mearga-in-mikroc/

 

Nu am primit nici eu raspuns.

 

Cand compilatoarele astea complexe dau astfel de erori, mai bine o iei de la 0 si gata.

Spun asa dupa ce am cautat destul despre probema din cazul meu.

Dane, pai cum sa primesti raspunsuri daca nu postezi decat: nu merge, am conectat bine totul, trebuie sa reincep? Sincer, tu vrei analiza bazata pe 3 lulele, 3 surcele de informatii furnizate?

Link spre comentariu

Salut thunderer, dupa aceasta linie

 

Lcd_Cmd(_LCD_CLEAR) ' Clear display
Delay_ms(1000) ' 1 sec of pure... nothingness

 

ce crezi ca afiseaza afisorul?

Nimic. Cu aceasta linie ai cerut sa se stearga orice mesaj pe afisor chiat dupa o secunda dupa afisarea mesajului

 

LCD_Out(2,1, "hmmm... nothing")

Delay_ms(1000)

Lcd_Cmd(_LCD_CLEAR)

 
 

Si eu lucrez cu mikroC, ba chiar i-mi place chiar foarte mult -sunt incepator- si am cateva teste cu afisoare.

Uite un exemplu:

https://www.youtube.com/watch?v=syoYcGleENI&index=3&list=FLez0bK7BJ4BDYgNQwzK6ZRA

 

Dupa-amiaza o sa incerc si eu programul si o sa fac o simulare in ISIS.

Editat de Vizitator
Link spre comentariu

In cazul particular de mai sus (Basic de la Mikroe) compilatorul adauga in final un "goto $+0".

 

Main() este o functie ca oricare alta, numai ca ea nu este apelata de nimeni (asa cum se intampla in cazul sistemelor de operare).

Functie de compilator, se poate intampla sa se restarteze uC , sa se execute la infinit main() sau sa ramana in loop infinit.

 

Este indicat sa pui o bucla de genul while(1) la sfarsitul functiei main.

Editat de Vezi Muti
Link spre comentariu

Salut thunderer, dupa aceasta linie

 

Lcd_Cmd(_LCD_CLEAR) ' Clear display

Delay_ms(1000) ' 1 sec of pure... nothingness

 

ce crezi ca afiseaza afisorul?

Nimic. Cu aceasta linie ai cerut sa se stearga orice mesaj pe afisor chiat dupa o secunda dupa afisarea mesajului

 

LCD_Out(2,1, "hmmm... nothing")

Delay_ms(1000)

Lcd_Cmd(_LCD_CLEAR)

Am pus secunda de pauza ca, in caz se reseteaza si o ia de la capat, sa am timp sa vad o pauza destul de lunga. Evident ca stiam ca dupa LCD_Clear se sterge totul. Vezi mesajul de mai sus unde zic de asta (citat din mine: dupa ultimul delay de 1sec LCD-ul ramane vesnic gol (de altfel dupa primul delay))

 

In cazul particular de mai sus (Basic de la Mikroe) compilatorul adauga in final un "goto $+0".

 

Main() este o functie ca oricare alta, numai ca ea nu este apelata de nimeni (asa cum se intampla in cazul sistemelor de operare).

Functie de compilator, se poate intampla sa se restarteze uC , sa se execute la infinit main() sau sa ramana in loop infinit.

 

Este indicat sa pui o bucla de genul while(1) la sfarsitul functiei main.

Asta e un exemplu de cum sa nu faci, d-aia lipseste bucla infinita.

 

Listing-ul ASM (care dovedeste ce ai zis despre goto $+0), care miscare duce PIC-ul unde? Ca nu mai face nimic: nu reset, nu repetare de Main, ci mai degraba un vesnic NOP. As putea pune o intrebare pe forumul Mikroe.

_InitMain:;16F690_enc.mbas,42 :: 		sub procedure InitMain();16F690_enc.mbas,43 :: 		OPTION_REG =   0x80              ' Pull-up disabled	MOVLW      128	MOVWF      OPTION_REG+0;16F690_enc.mbas,44 :: 		INTCON     =   0x00              ' No INT	CLRF       INTCON+0;16F690_enc.mbas,46 :: 		CM1CON0    =   0x00              ' No COMP	CLRF       CM1CON0+0;16F690_enc.mbas,47 :: 		CM2CON0    =   0x00              ' No COMP	CLRF       CM2CON0+0;16F690_enc.mbas,48 :: 		CM2CON1    =   0x00              ' No COMP	CLRF       CM2CON1+0;16F690_enc.mbas,50 :: 		CCP1CON    =   0x00              ' No PWM	CLRF       CCP1CON+0;16F690_enc.mbas,52 :: 		ANSEL      =   0x00              ' No Analog Is	CLRF       ANSEL+0;16F690_enc.mbas,53 :: 		ANSELH     =   0x00              ' No Analog Is	CLRF       ANSELH+0;16F690_enc.mbas,55 :: 		PORTA      =   0x00              ' Clear PORTA	CLRF       PORTA+0;16F690_enc.mbas,56 :: 		PORTB      =   0x00              ' Clear PORTB	CLRF       PORTB+0;16F690_enc.mbas,57 :: 		PORTC      =   0x00              ' Clear PORTC	CLRF       PORTC+0;16F690_enc.mbas,59 :: 		TRISA      =   0xFF              ' All inputs	MOVLW      255	MOVWF      TRISA+0;16F690_enc.mbas,60 :: 		TRISB      =   0xF0              ' All inputs	MOVLW      240	MOVWF      TRISB+0;16F690_enc.mbas,61 :: 		TRISC      =   0xC0              ' RC0-5 outputs, RC6-7 inputs	MOVLW      192	MOVWF      TRISC+0;16F690_enc.mbas,62 :: 		end subL_end_InitMain:	RETURN; end of _InitMain_main:;16F690_enc.mbas,65 :: 		main:;16F690_enc.mbas,67 :: 		InitMain()	CALL       _InitMain+0;16F690_enc.mbas,68 :: 		Lcd_Init()                     ' Initialize Lcd	CALL       _Lcd_Init+0;16F690_enc.mbas,69 :: 		Lcd_Cmd(_LCD_CLEAR)            ' Clear display	MOVLW      1	MOVWF      FARG_Lcd_Cmd_out_char+0	CALL       _Lcd_Cmd+0;16F690_enc.mbas,70 :: 		Lcd_Cmd(_LCD_CURSOR_OFF)       ' Cursor off	MOVLW      12	MOVWF      FARG_Lcd_Cmd_out_char+0	CALL       _Lcd_Cmd+0;16F690_enc.mbas,72 :: 		LCD_Out(1,1, "So, what's next?")	MOVLW      1	MOVWF      FARG_Lcd_Out_row+0	MOVLW      1	MOVWF      FARG_Lcd_Out_column+0	MOVLW      83	MOVWF      ?LocalText_main+0	MOVLW      111	MOVWF      ?LocalText_main+1	MOVLW      44	MOVWF      ?LocalText_main+2	MOVLW      32	MOVWF      ?LocalText_main+3	MOVLW      119	MOVWF      ?LocalText_main+4	MOVLW      104	MOVWF      ?LocalText_main+5	MOVLW      97	MOVWF      ?LocalText_main+6	MOVLW      116	MOVWF      ?LocalText_main+7	MOVLW      39	MOVWF      ?LocalText_main+8	MOVLW      115	MOVWF      ?LocalText_main+9	MOVLW      32	MOVWF      ?LocalText_main+10	MOVLW      110	MOVWF      ?LocalText_main+11	MOVLW      101	MOVWF      ?LocalText_main+12	MOVLW      120	MOVWF      ?LocalText_main+13	MOVLW      116	MOVWF      ?LocalText_main+14	MOVLW      63	MOVWF      ?LocalText_main+15	CLRF       ?LocalText_main+16	MOVLW      ?LocalText_main+0	MOVWF      FARG_Lcd_Out_text+0	CALL       _Lcd_Out+0;16F690_enc.mbas,73 :: 		LCD_Out(2,1, "hmmm... nothing")	MOVLW      2	MOVWF      FARG_Lcd_Out_row+0	MOVLW      1	MOVWF      FARG_Lcd_Out_column+0	MOVLW      104	MOVWF      ?LocalText_main+0	MOVLW      109	MOVWF      ?LocalText_main+1	MOVLW      109	MOVWF      ?LocalText_main+2	MOVLW      109	MOVWF      ?LocalText_main+3	MOVLW      46	MOVWF      ?LocalText_main+4	MOVLW      46	MOVWF      ?LocalText_main+5	MOVLW      46	MOVWF      ?LocalText_main+6	MOVLW      32	MOVWF      ?LocalText_main+7	MOVLW      110	MOVWF      ?LocalText_main+8	MOVLW      111	MOVWF      ?LocalText_main+9	MOVLW      116	MOVWF      ?LocalText_main+10	MOVLW      104	MOVWF      ?LocalText_main+11	MOVLW      105	MOVWF      ?LocalText_main+12	MOVLW      110	MOVWF      ?LocalText_main+13	MOVLW      103	MOVWF      ?LocalText_main+14	CLRF       ?LocalText_main+15	MOVLW      ?LocalText_main+0	MOVWF      FARG_Lcd_Out_text+0	CALL       _Lcd_Out+0;16F690_enc.mbas,74 :: 		Delay_ms(1000)                 ' Waste 1 sec of my time	MOVLW      11	MOVWF      R11+0	MOVLW      38	MOVWF      R12+0	MOVLW      93	MOVWF      R13+0L__main2:	DECFSZ     R13+0, 1	GOTO       L__main2	DECFSZ     R12+0, 1	GOTO       L__main2	DECFSZ     R11+0, 1	GOTO       L__main2	NOP	NOP;16F690_enc.mbas,75 :: 		Lcd_Cmd(_LCD_CLEAR)            ' Clear display	MOVLW      1	MOVWF      FARG_Lcd_Cmd_out_char+0	CALL       _Lcd_Cmd+0;16F690_enc.mbas,76 :: 		Delay_ms(1000)                 ' 1 sec of pure... nothingness	MOVLW      11	MOVWF      R11+0	MOVLW      38	MOVWF      R12+0	MOVLW      93	MOVWF      R13+0L__main3:	DECFSZ     R13+0, 1	GOTO       L__main3	DECFSZ     R12+0, 1	GOTO       L__main3	DECFSZ     R11+0, 1	GOTO       L__main3	NOP	NOPL_end_main:	GOTO       $+0; end of _main
Link spre comentariu

Salut

Cu seria aceasta de lcd-uri eu am patit de doua ori la fel ca tine.

Una era de la contrast iar a doua era de la timpi  care erau de aprox 2 ori mai mari.

Asa ca am cautat pe net , am gasit pe cineva care se plingea la fel , am luat o rutina de lucru cu lcd-ul si am umblat la timpi pina a pornit.

Doar ca lcd-urile mele erau de pe Ebay .....

Nu spun ca e la fel, doar o parere.

Stima

 

Link spre comentariu
Vizitator SimonaAlexandra7

AM REZOLVAT PROBLEMA!!!!!!!!!!!!!!!  Intr-adevar,trebuia sa pun LAT....Acum merge perfect.. VA MULTUMESC MULT DE TOT!!!! :aplauze  :aplauze

Link spre comentariu

Listing-ul ASM (care dovedeste ce ai zis despre goto $+0), care miscare duce PIC-ul unde? Ca nu mai face nimic: nu reset, nu repetare de Main, ci mai degraba un vesnic NOP. As putea pune o intrebare pe forumul Mikroe.

 

 

@thunderer: Nu cred ca este cazul sa pui intrebarea pe forum Mikroe.

Chiar nu ai idee ce face "goto $+0" ? 

In niciun caz nu face NOP-uri.

 

 

simona@: Bine ca s-a rezolvat problema LCD-ului. Cu ocazia asta ai inchis si discutia.

Link spre comentariu

Chiar nu ai idee ce face "goto $+0" ? 

In niciun caz nu face NOP-uri.

 

Chiar nu poti lasa tonul pedant la conectare? :nas:

Ce-ti cade daca explici direct ce face "goto $+0", fara sa insiri ce NU face? Nici eu nu stiu sigur, da' presupun ca sare la adresa curenta ($) + 0 (adica sta :rade:). Cum nu stiu ce face NOP (daca e pe post de instructiune si modifica PC, desi probabul ca da), nu am idee daca-s echivalente.

Dar NU, NU astept nici sa-mi confirmi, nici sa-mi infirmi. O sa ma lamuresc singur la un moment dat.

simona@: Bine ca s-a rezolvat problema LCD-ului.

Dar nu datorita tie. :limb:

Editat de Liviu M
Link spre comentariu

Pai cu ce difera un NOP de "la loc comanda!" adica la aceeasi comanda (linie de cod) care l-a trimis mai departe?

;16F690_enc.mbas,76 :: 		Delay_ms(1000)                 ' 1 sec of pure... nothingness	MOVLW      11	MOVWF      R11+0	MOVLW      38	MOVWF      R12+0	MOVLW      93	MOVWF      R13+0L__main3:	DECFSZ     R13+0, 1	GOTO       L__main3	DECFSZ     R12+0, 1	GOTO       L__main3	DECFSZ     R11+0, 1	GOTO       L__main3	NOP	NOPL_end_main:	GOTO       $+0; end of _main

Postez din nou ultimele linii de program: la comanda goto $+0 ce face? Unde sare? La NOP sau la goto $+0? Aceasta L_end_main pare a fi bucla infinita creata de compilator in semn de mila catre programator, nu?!

 

Link spre comentariu
Vizitator mihail.stoica

Primul rand cu dreptunghiuri negre inseamna la LCD-ul nu este initializat

Exemplu de conexiuni

// B0 -> D4// B1 -> D5// B2 -> D6// B3 -> D7// B4 -> RS// B5 -> EN

 

exemplu de program scris in MPLAB X (htc.h pentru PIC16F876, xc.h pentru PIC16F peste 1000, PIC18F..)

 

#include <htc.h>#include <stdio.h>#include <stdlib.h>

 

void main(void){

  TRISB=0;

  init_lcd();

  write_string("Test");

  for(;;){

  }

{

 

// lcd.h

 

#ifndef LCD_H#define  LCD_H#define _XTAL_FREQ 8000000#define data_PORT LATBextern void strobe_instr(char val_ch);extern void strobe_data(char val_ch);extern void init_lcd(void);extern void write_instruction(char val_char);extern void write_data(char val_char);extern void write_string(char *string);extern void build_cust_char(unsigned char loc, unsigned char *cust_char);extern void lcd_goto(unsigned char pos);#endif

 

// lcd.c

 

#include <htc.h>#include "lcd.h"void strobe_instr(char val_ch){   data_PORT = (val_ch | 0b00100000) & 0b11101111; // EN=1,RS=0   __delay_us(40);   data_PORT = val_ch & 0b11001111; // EN=0,RS=0}void strobe_data(char val_ch){   data_PORT = val_ch | 0b00110000; // EN=1,RS=1   __delay_us(40);   data_PORT = val_ch & 0b11011111; // EN=0,RS=1}void init_lcd(void){ __delay_ms(30);   strobe_instr(0x03);   __delay_ms(5);   strobe_instr(0x03);   __delay_us(200);   strobe_instr(0x03);   __delay_us(200);   strobe_instr(0x02);   __delay_ms(2);   write_instruction(0x28);   write_instruction(0x0C);   write_instruction(0x01);   __delay_ms(2);   write_instruction(0x06);}void write_instruction(char val_char){   strobe_instr((val_char >> 4) & 0x0F);   strobe_instr(val_char & 0x0F);}void write_data(char val_char){   strobe_data((val_char >> 4) & 0x0F);   strobe_data(val_char & 0x0F);}void write_string(char *string){   while(*string)   write_data(*string++);}void build_cust_char(unsigned char loc, unsigned char *cust_char){   write_instruction(0x40+(loc*8));   while(*cust_char){   write_data(*cust_char++);   }}void lcd_goto(unsigned char pos){  write_instruction(0x80+pos);}

 

Functiile mikroelektronika ocupa un port intreg

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări