Ir ao conteúdo
  • Cadastre-se

ComunicaÇÃo serial entre 16f628 e 18f452


Eletr

Posts recomendados

Boa tarde, caros amigos.

Estou implementando um circuito onde o PIC 16f628 recebe um sinal de pulsos na sua entrada (timer 1 rb6),configurada em seus registradores para ser uma entrada de contagem. Esse UC trabalha com uma freqüência de 20mhz na entrada ra6 e ra7 e transfere os valores de leitura (criados em uma rotina de interrupções, Flags ,estouros) serialmente (usart) em 9600kbps para um microcontrolador 18f452a recolher esse dado em mostrá-lo em um display gráfico.

Creio que deve haver algum erro na configuração do timer1 do uc 16f628 que está impossibilitando a leitura e o consequente envio do sinal para o 452.

Como o programa é muito extenso colocarei a rotina de leitura e envio serial para que possam ajudar em uma análise mais minuciosa .

PIC 16F628
........
.........
void envia()
{
usart_write(estouro_1);
// usart_write (contagem);
usart_write(contagem_1);
}
void interrupt()
{
if(PIR1.TMR1IF==1) //teste da flag do timer 1
{
tempo++; //incrementa tempo
PIR1.TMR2IF=0;
// PIR1.TMR1IF=0; //zera a flag timer 1
if(tempo==20000)
{
tempo=0;
// contagem=TMR0;
contagem_1=TMR1H;
contagem= estouro*255+contagem;
contagem_1=TMR1H*255 +TMR1L;
envia() ;
// TMR0L=0;
TMR1L=0;
TMR1H=0;
// INTCON.TMR0IF=0;//flag timer 0
// PIR1.TMR1IF=0; //flag timer 1
estouro=0;
estouro_1=0;

}
}
// if(INTCON.TMR0IF==1)
// {
// estouro++; //incrementa estouro
// TMR0L=0;
// INTCON.TMR0IF=0; //zera registradores t0 e t1 INTCON.TMR0IF=0; //apaga flags
// }
if(PIR1.TMR1IF==1) //testa a flag timer 1
{
estouro_1++;
TMR1L=0;
TMR1H=0;
PIR1.TMR1IF=0; //apaga a flag timer 1
}
}

/************************************************************
* PROGRAMA PRINCIPAL *
************************************************************/
//INICIALIZAÇÃO LCD-------------------------------------------------------

void main(void)
{
// {TRISA = 0xff;
TRISA = 0;
TRISA = 0b10101111;
// ADCON1 = 0x06;

TRISB = 0 ;
TRISB = 0b11110010 ;
// TRISC = 0;
// trisc = 0b10110100;
// TRISD = 0 ;
// TRISD = 0xff ;
// TRISE = 0;
// TRISE = 0xff;

usart_init(9600);


//Timer_0--------------------------------------------------------------
// T0CON = 0b11111000;
// TMR0L = 0x00;
// TMR0H = 0x00;
INTCON.GIE=1;
// INTCON.GIEL=0;
// INTCON.GIEH=1;
INTCON.PEIE=1;
// INTCON2.TMR0IP=1;
// RCON.IPEN = 1;




//TIMER_1-----------------------------------------------------------------
T1CON = 0b00000111 ;
TMR1L =0x00;
TMR1H = 0x00;
PIE1.TMR1IE=1;
PIE1.RCIE=0;
PIE1.TXIE=0;
//Timer_2------------------------------------------------------------------
// TMR2 = 0x00; // zera registrador timer_2
// PR2 = 250; // Valor de estouro Timer_2
// PIE1.TMR2IE = 1; // habilita interrup. Timer_2
// T2CON.TMR2ON = 1; // liga Timer_2 e configura prescaler 1.1
// INTCON2.RBPU=1;//PULL DOWN
// T2CON.T2CKPS1=0; //congiguração de preescaler 1:1
// T2CON.T2CKPS0=0; //configuração de prescaller 1:1
// IPR1.TMR2IP=1; //bit que define a prioridade na interrupçãopor igualdad


OS FUSIVEIS QUE UTILIZEI FORAM :

MCLRE_ON
HS_OSC
BOREN_OFF
CP_OFF
PWRTE_OFF
WDT_OFF
LVP_OFF

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para 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...