Ir ao conteúdo

Problema com USART do PIC16f877a


Ir à solução Resolvido por DANIEL BALBINO,

Posts recomendados

Postado

Estou com um problema parecido, emulei via software um serial no pic 12f675  onde ele faz a leitura de dois potênciometros e manda via USART para o pic16f877a. No proteus funcionou direito mas quando fui simular o hardware o 16f877a não interpreta direito.j

 

 

Alguém pode me ajudar??????

  • Solução
Postado

O codigo foi esse no 12F675

 

#include <12f675.h>
#device adc=10
#use delay(clock=4000000)
#fuses  INTRC_IO,NOWDT, noprotect
#use rs232(baud=9600, xmit=PIN_A2,rcv=PIN_A3,bits=8)
 
 
 
float tensão;
 
long int tensao1;
 
 
void main()
{
   setup_adc_ports(AN0_ANALOG|AN1_ANALOG);
   setup_adc(ADC_CLOCK_INTERNAL);  
   
   while(true)
    {
      set_adc_channel(0);
      delay_ms(100);
      tensão= (5.0/1024)* read_adc()*20;  
      tensao1=tensão*100;
      printf("\r\n%c",tensao1);
      
      output_high(PIN_A4);
      delay_ms(100);
      output_low(PIN_A4);
      delay_ms(100);       
     
      
  
          }
          
}
 
NO RECEPTOR QUE É O 16F877A FOI:
 
#include <16f877a.h>
#device ADC=10
#use delay(clock=8000000)
#USE RS232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,bits=8)
 
#fuses HS,NOWDT,BROWNOUT,PUT,NOLVP
 
#include "LCD4B.c"
 
 
 
 
 
float   tensão, ad0;
char dado[7];
 
#int_rda
 void rda_isr()
 
{
        dado[0]=getchar();
        dado[1]=getchar();
        dado[2]=getchar();
        dado[3]=getchar(); 
        
        
      
}
 
void main()
   {
                  
      
       enable_interrupts(global);
       enable_interrupts(int_rda);
       
      setup_adc_ports(AN0_AN1_AN3);
      setup_ADC(ADC_CLOCK_DIV_8);    
      
      lcd_ini();
      delay_ms(200);
   
       printf(lcd_escreve,"PIC16F877A");
       printf(lcd_escreve,"\rPROJETO VERSAO 00");
       delay_ms(200);      
   
      
    
 
 while(true)
       {      
           
                                                  
         set_adc_channel(0);
         delay_us(100);
         ad0=read_adc();
         tensão=5*ad0/1024;
         tensão=tensão*20; 
         
         
         printf(lcd_escreve,"\fTENSAO=%fV\r\n",tensão); 
         printf(lcd_escreve,"COR=%c%c.%c%c",dado[0],dado[1],dado[2],dado[3]); //Nessa parte que recebe a informação fica com uns caracteres zuados variando(mostrando que ele está recebendo alguma informação) quando manda para o LCD,mas no PROTEUS imprime normalmente e qualquer outro programa o LCD imprime as duas linhas mostrando que o problema não e no hardware do LCD.valeu!!!! //  
        
       
                
           delay_ms(300);
          
            
               
           
           }
        
           
       }
       

O hardware A PRINCIPIO ESTA OK MAS MESMO ASSIM NÃO PEGA E NO CASO DO OSCILADOR INTERNO COLOQUEI OUTROS DOIS PICS12F675 PARA TESTAR E NADA TAMBÉM.

 

NO PROTEUS ESTA RODANDO TUDO LEGAL MAS quando LIGO O TX DO 12F AO RX DO 16F COMEÇA A LOUCURA!!

 

 

valeu pela força pessoal!!!, ABRAÇOS!!!!


@MatheusLPS

 

@Isadora Ferraz

 

@Fervolt

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!