Ir ao conteúdo
  • Cadastre-se

Rs232 + timer no PIC = problema?


Felizardow

Posts recomendados

Esse é um dos problemas que eu quebro a cabeça um tempão, faço mais de 100 buscas no google, acho o problema mas não consigo resolvê-lo...

Eu estou fazendo meu primeiro projeto com microcontroladores, especificamente com PICs, e para isso estou testando tudo no PROTEUS...

Esse projeto se baseia em um relógio digital simples, e está tudo funcionando... até eu querer conectar um simples Virtual Console para acompanhar uma conversão A2D e só receber símbolos estranhos(veja imagem)...

imagem0wc5.th.jpg

Beleza, deve ser um problema de sincronização... Checo a baudrate... Checo o código, 1, 2, 3 vezes e nada, continua dando esse problema...

Nessas horas você já perdeu muito, mais tempo do que esperava, e você começa a apelar. Primeiro, troquei o microcontrolador que estava usando, para ver se era algum problema específico com aquele modelo. Nada feito, continuou o mesmo problema! Então, deve ser no código!!! Comecei a comentar o código todo, deixando só o mínimo para o console. FUNCIONOU:

imagem1bx4.th.jpg

(Aproveitando pra vocês verem o esquema atrás)

Então o problema É NO CÓDIGO... Descomentando linha por linha, achei a linha que gerava o problema...


setup_timer_0(RTCC_INTERNAL);

Agora que fica bizarro! Porque o interrupt de overflow do timer0 causa isso?

Será que é alguma interferência na função que esse overflow gera? Então vamos comentar toda ela!

Comentando toda ela, ficando uma função do tipo:


#INT_TIMER0
void teste() { ; }

ele continua gerando o problema!

Alguém tem alguma ideia de alguma razão que o interrupt do timer0 pode estar afetando a transmissão para o terminal? Obrigado.

PS1:

Não posso usar uma fonte externa de clock (como um cristal) porque se por pra simular isso no PROTEUS ele fica super-hyper-lerdo !

Demora uns 10 mins reais pra simular 1 segundo! Então tenho que fazer pelo clock interno do chip mesmo, e acredito que isso não deveria ser um grande problema

Código (CCS)


#INCLUDE <16F877.h>
#use delay (clock=1000000)
#use rs232(baud=9600, xmit=PIN_D0,rcv=PIN_D1)
//Funções
void ShowHours(int H,M);
void ShowChar(int A,B,C,D);
void temporizador();
void botM ();
void botH ();
//Variáveis
int contsegs = 0, MINS = 0, HORAS = 0;
long conta=0;

void main() {
//Configura Interrupts
setup_timer_0(RTCC_INTERNAL); //1 Mhz Clock -> 0,25 Mhz Tock -> 0,175 Mhz Tock/256 -> 966,56 Hz
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0); //<- A linha maldita
//Configura SPI
setup_spi(SPI_MASTER|SPI_L_TO_H);
while (TRUE){
delay_ms(250);
printf("teste\n\r");
if (input_state(PIN_B0)==1) {
botM();
output_low(PIN_B0);
} else if (input_state(PIN_B1) == 1) {
botH();
output_low(PIN_B1);
}
ShowHours(HORAS,MINS);
}
}

void ShowHours(int H,M) {
ShowChar( (int)H/10,H%10,(int)M/10,M%10);
}
void ShowChar(int A,B,C,D) {
char Matriz[10]={0b01000000,0b01111001,0b10100100,0b00110000,0b00011001,0b00010010,0b00000010,0b01111000,0b10000000,0b00011000};
spi_write(Matriz[A]); //Escreve o primeiro DISPLAY
spi_write(Matriz[b]); //Escreve o segundo DISPLAY
spi_write(Matriz[C]); //Escreve o terceiro DISPLAY
spi_write(Matriz[D]); //Escreve o quarto DISPLAY
output_low(PIN_C4);
output_high(PIN_C4);
}


void botM () {
MINS++;
if (MINS == 60) { // 1 HORA!
HORAS++;
if (HORAS == 24) { HORAS = 0; } //1 DIA!
MINS = 0;
}
contsegs = 0;
}


void botH () {
HORAS++;
if (HORAS == 24) { HORAS = 0; } //1 DIA!
contsegs = 0;
}

#INT_TIMER0
void temporizador() {
conta++;
if (conta == 976) { //AJUSTAR DEPOIS COM O CRYSTAL!
contsegs++;
if (contsegs == 60) { //1 MINUTO!
MINS++;
if (MINS == 60) { // 1 HORA!
HORAS++;
if (HORAS == 24) { HORAS = 0; } //1 DIA!
MINS = 0;
}
contsegs = 0;
}
conta = 0;
//Piscando os LEDs...
if (input_state(PIN_C6)) {
output_low(PIN_C6);
} else {
output_high(PIN_C6);
}
}
}

---------------------------------

edit

Bom pessoal, consegui consertar isso de uma forma simples...

Eu usei o UART1 para transmitir, e aí o problema desapareceu !

Eu realmente não sei o porquê que estava acontecendo aquele problema, e gostaria de saber, se alguem cogitar alguma ideia, eu testo aqui :D

De qualquer forma, obrigado

Link para o comentário
Compartilhar em outros sites

  • 10 meses depois...

Cara estou com um problema que era parecido com o seu. So meu projeto eu estou querendo que dois pics se comuniquem para que um deles atue como um relógio e este envie para o outro PIC a informação do tempo, melhor, que envie para o outro pic o valor contido em uma variavel usada para contar milisegundos. Quem puder ajudar ai galera eu agradeço.

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