Jump to content

  • Log In with Google      Sign In   
  • Create Account

Photo

Interfață display pentru PIC16F876A


  • Please log in to reply
9 replies to this topic

#1 OFFLINE   catalin004

catalin004

    Electronist

  • Membru activ
  • PipPipPipPipPip
  • 3,860 posts
  • Locatie:Bals-Olt

Posted 20 December 2017 - 01:05 PM

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...");
}


Cu_reclama

Cu_reclama
  • Membri
    ********

#2 OFFLINE   Bandi Szasz

Bandi Szasz

    Membru

  • Membru activ
  • PipPip
  • 494 posts

Posted 20 December 2017 - 01:09 PM

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



#3 OFFLINE   catalin004

catalin004

    Electronist

  • Membru activ
  • PipPipPipPipPip
  • 3,860 posts
  • Locatie:Bals-Olt

Posted 20 December 2017 - 01:18 PM

mikroC-ul nu stie de ANSEL....



#4 OFFLINE   Bandi Szasz

Bandi Szasz

    Membru

  • Membru activ
  • PipPip
  • 494 posts

Posted 20 December 2017 - 01:37 PM

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



#5 OFFLINE   catalin004

catalin004

    Electronist

  • Membru activ
  • PipPipPipPipPip
  • 3,860 posts
  • Locatie:Bals-Olt

Posted 20 December 2017 - 01:37 PM

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...



#6 OFFLINE   catalin004

catalin004

    Electronist

  • Membru activ
  • PipPipPipPipPip
  • 3,860 posts
  • Locatie:Bals-Olt

Posted 20 December 2017 - 02:23 PM

singura varianta este ADCON1 = 0x04;

Adica AN3 nu il pot folosi pe display.multumesc



#7 OFFLINE   Bandi Szasz

Bandi Szasz

    Membru

  • Membru activ
  • PipPip
  • 494 posts

Posted 20 December 2017 - 03:36 PM

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. 



#8 OFFLINE   catalin004

catalin004

    Electronist

  • Membru activ
  • PipPipPipPipPip
  • 3,860 posts
  • Locatie:Bals-Olt

Posted 20 December 2017 - 07:08 PM

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



#9 OFFLINE   WME

WME

    Nou venit

  • Membru activ
  • Pip
  • 13 posts
  • Locatie:Constanta

Posted 13 February 2018 - 12:51 AM

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, 13 February 2018 - 01:08 AM.


Cu_reclama

Cu_reclama
  • Membri
    ********

#10 OFFLINE   Elison

Elison

    Membru

  • Membru activ
  • PipPip
  • 297 posts
  • Locatie::

Posted 13 February 2018 - 03:54 AM

 

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, 13 February 2018 - 03:56 AM.





4 user(s) are reading this topic

0 members, 4 guests, 0 anonymous users