Tag: LCD

Palavra-chave
Destaque/Sem destaque
Resolvida/Não Resolvida
Aberta/Encerrada
0 votos
930 visualizações

Ola Pessoal eu gostaria de vossa ajuda.
Eu sou iniciante a programar micro-controladores, e estou programando o micro de 8bits da familia 18f no Mplab x, e estou tendo dificuldades nisso.
EU fiz o código para a livraria do C18, compilou sem erro, mas não está simulando no Proteus.
Por isso tentei mudar para livraria XC8, mas essa livraria n encontrei a biblioteca para LCD e nem Biblioteca pra Delays, passei pela google, dei varias pesquisadas, e nada parece tar resolvendo o meu problema, gostaria que pudessem me ajudar a solucionar esse problema:
Ai tem o código abaixo para o C18.

#include <p18f4550.h>
#define _XTAL_FREQ = 20000000
#pragma config MCLRE = OFF, LVP = OFF, WDT = OFF, PLLDIV = 5, CPUDIV = OSC1_PLL2
#pragma config FOSC = HS, PBADEN = OFF, XINST = OFF
#include <delays.h>
#include <xlcd.h>

void DelayFor18TCY( void )
{
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
}
void DelayPORXLCD (void)
{
  Delay1KTCYx(75); // Delay of 15ms
                   // Cycles = (TimeDelay * Fosc) / 4
                   // Cycles = (15ms * 20MHz) / 4
                   // Cycles = 75,000
  return;
}
void DelayXLCD (void)
{
  Delay1KTCYx(25); // Delay of 5ms
                   // Cycles = (TimeDelay * Fosc) / 4
                   // Cycles = (5ms * 20MHz) / 4
                   // Cycles = 25,000
  return;
}
void Init_lcd(void){
    OpenXLCD( EIGHT_BIT & LINES_5X7 );
    while( BusyXLCD() );
    WriteCmdXLCD( EIGHT_BIT & LINES_5X7 );
    WriteCmdXLCD( BLINK_ON );
    WriteCmdXLCD( SHIFT_DISP_LEFT );
}

void main(void) {
    TRISD = 0x00;
    OSCCONbits.IRCF=0b1110;
    OSCCONbits.SCS=0b00;
    ADCON1bits.PCFG0=0b0000;

    Init_lcd();
    putrsXLCD( "Hello World" );
    SetDDRamAddr(0x40);
    while(1){
    LATDbits.LATD0 = 0xff;
    Delay10KTCYx(75);
    LATDbits.LATD0 = 0x00;
    Delay10KTCYx(75);
    }

}

Poderiam me ajudar por favor!

0 votos
1k visualizações

Saudações,
Estou fazendo um projeto com o sensor de temperatura e umidade DHT22 junto com o PIC 16F628A, porém percebi que o problema está na função que lê os bits do sensor. Alguém poderia me indicar onde está o problema? O meu LCD não aparece nada, somente aparece se eu comentar as linhas que recebem readData(). Esse é o código do PIC:

/*********************** FUNÇOES DO SENSOR DHT22 ****************************************************/
//Envia sinal de start para o sensor
void startSignal() {
set_tris_a(0b00000000); //Configura RA1 como output
output_low(DATA); //Pino DATA envia 0 para o sensor
delay_ms(25);
output_high(DATA); //Pino DATA envia 1 para o sensor
delay_us(30);
set_tris_a(0b00000010); //Configura RA1 como input
}

//Checa resposta do sensor
unsigned short checkResponse() {
delay_us(40);
if(!input(DATA)) delay_us(80);
if(input(DATA)) {
delay_us(50);
return 1;
}
return 0;
}

//Função para ler os dados do sensor DHT22
unsigned short readData() {
unsigned short j=0, contaTempo=0, dataByte=0;

if(timeOut) break;

for(j = 0; j <= 7; j++) {
    contaTempo = 0;
    while(!input(DATA)){ // Espera até que a porta DATA vá para High
        delay_us(1);
        contaTempo++;
        if(contaTempo > 100) {
            timeOut = 1; 
            break;
        }
    }

    delay_us(40);

    if(!input(DATA)) { //Se continuar em Low apos 40us, bit = 0

        dataByte &= ~(1 << (7 - j)); //Zera bit (7-j)
    }
    else { //Se estiver em High apos 40us, bit = 1
        dataByte |= (1 << (7 - j)); //Seta bit (7-j)

        while(input(DATA)){ //Espera até que a porta DATA vá para Low
            delay_us(1);
            contaTempo++;
            if(contaTempo > 100) {
                timeOut = 1; 
                break;
            }
        }
    }
}
return dataByte;

}
/***************************************************************************/

//PROGRAMA PRINCIPAL
void main(void) {
set_tris_a(0b00000000);
set_tris_b(0b00000000);
output_a(0);
output_b(0);
setup_ccp1(CCP_OFF);
lcd_init(); //Inicializa LCD
printf(lcd_putc, “\f”); //Limpa LCD

while(TRUE) {

    delay_ms(2000);
    timeOut = 0;
    //inicia leitura do sensor
    startSignal();
    if(checkResponse()) {

        umidade_byte1 = readData();     //primeiro byte da umidade: bit 15 ~ bit 8
        umidade_byte2 = readData();     //segundo byte da umidade bit: 7 ~ bit 0
        temperatura_byte1 = readData(); //primeiro byte da temperatura: bit 15 ~ bit 8
        temperatura_byte2 = readData(); //segundo byte da temperatura: bit 7 ~ bit 0
        paridade_byte = readData();     //byte da paridade bit: 7 ~ bit 0

        if(timeOut){                           // If reading takes long time
            printf(lcd_putc,"\f");                       // LCD clear
            lcd_gotoxy(2, 6);                     // Go to column 5 row 1
            printf(lcd_putc, "Time out!");
        }
        else {
            if(paridade_byte == ((umidade_byte1 + umidade_byte2 + temperatura_byte1 + temperatura_byte2) & 0xFF)) {
                umidade_2byte = umidade_byte1;
                umidade_2byte = (umidade_2byte << 8) | umidade_byte2;
                temperatura_2byte = temperatura_byte1;
                temperatura_2byte = (temperatura_2byte << 8) | temperatura_byte2;

                if(temperatura_2byte > 0x8000) { //Se temperatura for maior que 1000 0000 (binario)
                    temperatura_2byte &= 0x7FFF; //Temperatura recebe 14bits, pois o bit 15 representa sinal
                    temperatura =  temperatura_2byte;
                    temperatura = ( temperatura / 10) * -1; //Corrige temperatura
                    sinal = '-';
                }
                else {
                    sinal = ' ';
                    temperatura =  temperatura_2byte;
                    temperatura = ( temperatura / 10) * -1; //Corrige temperatura
                }
                umidade = umidade_2byte;
                umidade = umidade / 10; //Corrige umidade

                lcd_gotoxy(1,5);                                                   // Define o ponto de inicio da frase L1C5                                             
                printf(lcd_putc,"Temp: %02.1f \xDFC", temperatura);                // Escreve no LCD Temperatura em Celsius     [printf(lcd_putc, "%f " "\xdf" "C", temperatura)];
                lcd_gotoxy(2,5);                                                   // Define o ponto de inicio da frase L2C5
                printf(lcd_putc,"Temp: %02.1f \xDFF", ((temperatura * 1.8) + 32)); // Escreve no LCD Temperatura em Fahrenheit
                /*lcd_gotoxy(3,5);                                                   // Define o ponto de inicio da frase L3C5
                printf(lcd_putc,"Temp: %02.1f \xDFK", temperatura + 273.15);       // Escreve no LCD Temperatura em Kelvin*/
                lcd_gotoxy(4,5);                                                   // Define o ponto de inicio da frase L4C5
                printf(lcd_putc,"Umid: %02.1f %c", umidade, 0x25);                 // Escreve no LCD Umidade em %
            }
            else {
                printf(lcd_putc, "\f");              // Limpa LCD
                lcd_gotoxy(2, 3);                    // Define o ponto de inicio da frase L2C3
                printf(lcd_putc, "Checksum Error!"); // Escreve no LCD (Erro de paridade dos dados)
            }
        }
    }
    else {
        lcd_gotoxy(2, 3);                     // Define o ponto de inicio da frase L2C3
        printf(lcd_putc, "  No response   "); // Escreve no LCD
        lcd_gotoxy(3, 3);                     // Define o ponto de inicio da frase L2C3
        printf(lcd_putc, "from the sensor");  // Escreve no LCD
    }
}

}

Mostrando 2 resultados