Jump to content
ELFORUM - Forumul Electronistilor
Sign in to follow this  
catalin004

Interfață display pentru PIC16F876A

Recommended Posts

Salut...am nevoie de ajutor in interfatarea unui LCD 2x16 cu pic-ul din titlu...problema este ca folosesc si cativa pini de pe RA, dar vreau ca RA0 si RA1 sa fie analogice....

Problema este ca nu imi afisaza nimic pe ecran...o sa pun o parte din cod mai jos...

//Lcd pinout settings
sbit LCD_RS at RA2_bit;
sbit LCD_EN at RA3_bit;
sbit LCD_D7 at RC3_bit;
sbit LCD_D6 at RC0_bit;
sbit LCD_D5 at RA5_bit;
sbit LCD_D4 at RA4_bit;
//End LCD connections

//Pin direction
sbit LCD_RS_Direction at TRISA2_bit;
sbit LCD_EN_Direction at TRISA3_bit;
sbit LCD_D7_Direction at TRISC3_bit;
sbit LCD_D6_Direction at TRISC0_bit;
sbit LCD_D5_Direction at TRISA5_bit;
sbit LCD_D4_Direction at TRISA4_bit;
//End LCD direction configuration

void main() 
{

LCD_Init();
LCD_CMD(_LCD_CURSOR_OFF);
LCD_CMD(_LCD_CLEAR);

LCD_Out(1,3, "Ceafa de");
LCD_Out(2,6, "porc...");
}

Share this post


Link to post
Share on other sites

Pentru inceput seteaza si registrul "ANSEL" prin care specifici daca pin-ul este folosit ca analog sau digital.

Share this post


Link to post
Share on other sites

Nu stie findca fiecare port are registru propriu: ANSELA, ANSELB, ANSELC, etc... e descris foarte clar in datasheet la capitolul de I/O Ports.

Share this post


Link to post
Share on other sites

Deci am scris ADCON1 = 6, ceea ce face toate porturile digitale...dupa ce programez on-line MCU display-ul merge...daca opresc si pornesc montajul nu mai apare pe linia a 2 a nimic...

Share this post


Link to post
Share on other sites

singura varianta este ADCON1 = 0x04;

Adica AN3 nu il pot folosi pe display.multumesc

Share this post


Link to post
Share on other sites

Da aveti dreptate, este un pic de generatie mai veche si nu are registru ANSEL. PIC-urile de generatie mai noua au registru ANSEL si se pot configura pinii in orice combinatie posibila fara restrictii cum este cu ADCON1.

Share this post


Link to post
Share on other sites

Acesta are restrictii...insa o sa termin cu el cat de curand...i-am facut o placa (mars01 a facut cablajul - ceva de vis - FABRICA) si maine urmeaza sa ii fac cateva meniuri, adica 4 pagini, una principala cu tensiune si curent, una cu duty cycle si una in care sa ii pot schimba sensul( adica 2 relee care fac inversarea de sens) + a patra pentru starea motorului...aceasta din urma poate lipsi...problema cu LCD am rezolvat-o, mutand Enable LCD pe alt pin al proc, am vazut pe Osciloscop care era treaba....

 

Acum ma chinui cu meniul....sa vad ce naiba iese...

seara buna

Share this post


Link to post
Share on other sites

Daca nu secretizati codul, se putea citi exact unde ati gresit.

- 876, nu are portC.

- declaratia: sbit LCD_D6 at RC0_bit; este nula.

un cod pentr 876 care foloseste display pe A si B ca porturi, aveti mai jos.

Atentie la: ANSEL=0b00010010; TRISA=0b11110011; TRISB=0b11100000;

in rest, este bine.. daca tot nu se poate citi codul dvs.

sbit LCD_RS at RA2_bit;
sbit LCD_EN at RA3_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISA2_bit;
sbit LCD_EN_Direction at TRISA3_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

unsigned char ch, x, set;
unsigned int A, I;
unsigned long LA, LI, PO;


void Apa (void)
{
 A=0;
 for (x=0; x<10; x++) {A+=ADC_Read(4);}
 A=A/x;
 LA=(long)A*5000;
 LA=LA/1024;
 ///ch=LA/1000;
 ///if (ch==0) {LCD_Chr(2,12,32);}
 ///else {LCD_Chr(2,12,48+ch);}
 ///ch=(LA/100) %10;
 ///Lcd_Chr_CP(48+ch);
 /////Lcd_Chr_CP('.');
 ///ch=(LA/10) %10;
 ///Lcd_Chr_CP(48+ch);
 ///ch=(LA/1) %10;
 ///Lcd_Chr_CP(48+ch);
 /////Lcd_Chr_CP('V');
 }

void Curent (void)
{
 I=0;
 for (x=0; x<10; x++) {I+=ADC_Read(1);}
 I=I/x;
 LI=(long)I*7750;
 LI=LI/1024;
 ch=LI/1000;
 if (ch==0) {LCD_Chr(2,1,32);}
 else {LCD_Chr(2,1,48+ch);}
 ch=(LI/100) %10;
 Lcd_Chr_CP(48+ch);
 Lcd_Chr_CP('.');
 ch=(LI/10) %10;
 //Lcd_Chr_CP(48+ch);
 //ch=(LI/1) %10;
 Lcd_Chr_CP(48+ch);
 Lcd_Chr_CP('A');
 }


void main()
{
          //OSCCON=0b01101000;        // internal 4MHz
          OSCCON=0b01111000;          // internal 8MHz
          while (OSCCON.IOFS==0);     // when stabilize internal
          ANSEL=0b00010010;            // an4, an1 selected
          PORTA=0;
          TRISA=0b11110011;
          PORTB=0;
          TRISB=0b11100000;
          CMCON=0x07;               // disable comparators
          Lcd_Init();
          Lcd_Cmd(_LCD_CURSOR_OFF);
          Lcd_Cmd(_LCD_CLEAR);
          Delay_ms(10);
          Lcd_out(2,7, "=");
          Lcd_out(2,15, "kW");

while(1)
         {

          void , alea' doua de mai sus.
 si ce sa faca acum.
          }
}
Edited by WME

Share this post


Link to post
Share on other sites

 

Daca nu secretizati codul, se putea citi exact unde ati gresit.

- 876, nu are portC.

- declaratia: sbit LCD_D6 at RC0_bit; este nula.

un cod pentr 876 care foloseste display pe A si B ca porturi, aveti mai jos.

Atentie la: ANSEL=0b00010010; TRISA=0b11110011; TRISB=0b11100000;

in rest, este bine.. daca tot nu se poate citi codul dvs.


void main()
{
          //OSCCON=0b01101000;        // internal 4MHz
          OSCCON=0b01111000;          // internal 8MHz
          while (OSCCON.IOFS==0);     // when stabilize internal
          ANSEL=0b00010010;            // an4, an1 selected
          PORTA=0;
          TRISA=0b11110011;
          PORTB=0;
          TRISB=0b11100000;
          CMCON=0x07;               // disable comparators
          Lcd_Init();
          Lcd_Cmd(_LCD_CURSOR_OFF);
          Lcd_Cmd(_LCD_CLEAR);
          Delay_ms(10);
          Lcd_out(2,7, "=");
          Lcd_out(2,15, "kW");
}
while(1)
         {

          void , alea' doua de mai sus.
 si ce sa faca acum.
          }
}

 

In pagina 13 din datasheet 16F876, la adresa 07h apare PORTC, iar la adresa 87h apare si TRISC, deci portul C exista.

Tot in pagina 13 se vede ca nu exista registrul ANSEL, iar acest lucru era precizat putin mai sus, chiar in acest topic.

Edited by Elison

Share this post


Link to post
Share on other sites
Posted (edited)

Scuze.

Codul si raspunsul, a fost pentru 16F88.

Am gresit. iertare!

 

Edited by WME

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×