Ir ao conteúdo
  • Cadastre-se

UART por software + UART por hardware


LEOPUENA

Posts recomendados

Oi pessoal.

Estou com um problema ao usar duas portas UART. Criei um circuito para um parque de estacionamento usando a tecnologia RFID com o modulo ID-20 INNOVATION, o modulo funciona a 9600bps e tem saída para TTL e CMOS (depois posto as fotos e videos). Até aí tudo bem, mas para dar continuidade preciso preciso de mais uma porta para comunicar com um computador. Como o micro só tem uma porta UART então decidi usar uma porta virtual (UART por software) e aí começou o problema.

Ao adicionar a comunicação por software acontece que perco a comunicação por hardware, talvez devido ao comando FORCE_SW da directiva #use rs232(). Não encontrei forma de desablitar essa opção portanto as duas portas se tornavam virtuais. Porém os pinos da porta UART não respondem quando configurados para trabalhar por software,,, não sei porquê mas também não importa muito,,, porque podia usar outro pino qualquer.

Ao usar a comunicação por software a taxa de erro é muito alta, a solução foi diminuir a velocidade. mas eu não sei como diminuir a velocidade do modulo ID-20, nem sei se é possivel.

O que quero é uma forma eficaz de fazer a a comunicação por software com 9600bps, ou usar a a comunicação por software em baixa velocidade e usar por hardware com alta velocidade.

Agradeço qualquer ajuda....

Obs.: usando inicialmente o PIC16F877 e CCS Compiler, mas solução com outros uC e outros compiladores tambem são benvindas....

__________

....E por falar em RFID....

???? alguem já usou o modulo RDM630 ????

Link para o comentário
Compartilhar em outros sites

Leo, é uma questão interessante a que você postou. Imaginei que mesmo a UART via SW sendo mais lenta, deveria funcionar numa boa.

Estou lendo sobre o assunto para tentar te ajudar pois não tenho tanta experiência no assunto.

Estou pesquisando no próprio forum do CCS. Tem muito coisa sobre esse assunto por lá. No caso se você quiser indo dando uma olhada: site:ccsinfo.com multiple uart ccs

Ainda estou vendo a possibilidade de usar cada UART em velocidades diferentes.

EDIT: Achei um tópico que o cara tem a mesma dúvida que você: Problem using multiple UARTs

Falou

Link para o comentário
Compartilhar em outros sites

Agradeço a ajuda Matheus, eu vou dar uma olhada no forum.

Imaginei que mesmo a UART via SW sendo mais lenta, deveria funcionar numa boa.

Na verdade em baixa velocidade a comunicação foi bem eficaz, e quanto mais lento melhor e ainda por se tratar de software pode atingir velocidades muito abaixo daquelas geradas pelo hardware. A questão é que estou usar o modulo ID-20 e ele comunica a 9600bps.

Link para o comentário
Compartilhar em outros sites

A principio são 4Mhz, mas eu apenas estou a testar no proteus. Quanto a usar ASM não tenho muita experiência com tratamento de "strings" em ASM, na verdade foi isso que me levou a usar a programação em C, porque os programas que fiz para lcd ficavam muito extensos. Mas se puderes postar as tuas rotinas seria muito bom para eu aperfeiçoar isso.

Olhando para o link passado pelo mathews reparei o uso da opção "STREAM=id" que havia ignorado. vou melhorar o programa e depois posto os resultados.

Link para o comentário
Compartilhar em outros sites

Leo,para não sair do assunto,eu depois te passo ulgumas rotinas RS232 em ASM por soft.

Quando tenho que usar I2C,RS23,2,SPI ou PWM,sempre faço por Software pelo motivo que a maioria dos PICs não são 'amigáveis' na pinagem.

Sempre que voce usa um destes módulos,quase sempre fica com pinos de uma porta comprometido...

Tente usar a frequencia de 20 Mhz,talvez o compilador não tenha otimizado as rotinas.

Da uma verificada no seguinte.

Se voce não usar 'fast_io',o CCS vai remanajer as Entrada e Saidas por conta própria(TRIS),logo,dê uma verifcada se o compilador não está alterando o pino que voce escolheu ,no RS232 por Soft,trocando como saída ou entrada 'erroneamente' por conta própia.

PS:Não gosto de dar opinião sobre o CCS,mas o Leo é muito esforçado e mereçe minha atenção:D

Link para o comentário
Compartilhar em outros sites

Bom consegui resolver o problema, mudei a forma como o programa travava os modulos usando o "STREAM=id". :)

Se voce não usar 'fast_io',o CCS vai remanajer as Entrada e Saidas por conta própria

Por coincidência dei conta disso a bem pouco tempo. Usei as seguintes directivas:

#use delay(clock=4000000)
#use fast_io(C)
#use rs232 (stream=modulo, baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use rs232 (stream=pc, baud=1200, xmit=PIN_C4, rcv=PIN_C5)

E para testar a comunicação usando LCD:

if(kbhit(modulo)){
c=fgetc(modulo);
printf(lcd_putc,"\f%c MODULO",c);
fprintf(modulo,"\f%c MODULO",c);
}



if(kbhit(PC)){
c=fgetc(pc);
printf(lcd_putc,"\f%c PC",c);
fprintf(pc,"\f%c PC",c);
}

Se quiserem depois posso postar o projecto completo.

PS:Não gosto de dar opinião sobre o CCS,mas o Leo é muito esforçado e mereçe minha atenção

!!!Fico muito feliz por saber que posso contar com o vosso apoio!!! :-BEER

mas o que há de errado com o CCS?

Leo,para não sair do assunto,eu depois te passo ulgumas rotinas RS232 em ASM por soft.

Quando tenho que usar I2C,RS23,2,SPI ou PWM,sempre faço por Software pelo motivo que a maioria dos PICs não são 'amigáveis' na pinagem.

Tocaste num assunto bem interessante, são muitas as vezes que esses pinos dão uma dor de cabeça. mas eu normalmente evito soluções por software por não serem eficazes (ou por eu não conseguir torna-las eficazes :D). Portanto gostaria muito que desses as dicas de como fazer em ASM.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Bom consegui resolver o problema, mudei a forma como o programa travava os modulos usando o "STREAM=id". :)

Por coincidência dei conta disso a bem pouco tempo. Usei as seguintes directivas:

#use delay(clock=4000000)
#use fast_io(C)
#use rs232 (stream=modulo, baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use rs232 (stream=pc, baud=1200, xmit=PIN_C4, rcv=PIN_C5)

E para testar a comunicação usando LCD:

if(kbhit(modulo)){
c=fgetc(modulo);
printf(lcd_putc,"\f%c MODULO",c);
fprintf(modulo,"\f%c MODULO",c);
}



if(kbhit(PC)){
c=fgetc(pc);
printf(lcd_putc,"\f%c PC",c);
fprintf(pc,"\f%c PC",c);
}

Se quiserem depois posso postar o projecto completo.

!!!Fico muito feliz por saber que posso contar com o vosso apoio!!! :-BEER

mas o que há de errado com o CCS?

Tocaste num assunto bem interessante, são muitas as vezes que esses pinos dão uma dor de cabeça. mas eu normalmente evito soluções por software por não serem eficazes (ou por eu não conseguir torna-las eficazes :D). Portanto gostaria muito que desses as dicas de como fazer em ASM.

Bom dia, Leo, tudo bem?

Estou passando pelo mesmo problema e gostaria de ver como ficou o seu código. No meu caso eu preciso de USART nativa para controlar um módulo GSM e um USART via software para apenas receber dados de um módulo GPS. Sendo assim, acredito que seja bem parecido e que seu código poderia ajudar.

Agradeço desde já.

Abraço.

Link para o comentário
Compartilhar em outros sites

Estou passando pelo mesmo problema e gostaria de ver como ficou o seu código. No meu caso eu preciso de USART nativa para controlar um módulo GSM e um USART via software para apenas receber dados de um módulo GPS. Sendo assim, acredito que seja bem parecido e que seu código poderia ajudar.

Eu postei parte do codigo em que fiz o teste,,, :

#use delay(clock=4000000)
#use fast_io(C)
#use rs232 (stream=modulo, baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use rs232 (stream=pc, baud=1200, xmit=PIN_C4, rcv=PIN_C5)

.....
.....

if(kbhit(modulo)){
c=fgetc(modulo);
printf(lcd_putc,"\f%c MODULO",c);
fprintf(modulo,"\f%c MODULO",c);
}



if(kbhit(PC)){
c=fgetc(pc);
printf(lcd_putc,"\f%c PC",c);
fprintf(pc,"\f%c PC",c);
}

O programa final ainda não está completo mas deixo aqui aquilo que fiz até agora, apenas falta desenvolver a parte do computador.




////////////////////////////////////////////////////////
// ELECTROPUBLITEC //
// CONTROLO DE ACESSO POR RFID //
// CRIADO POR LEOPUENA AOS 14-11-2012 //
// ULTIMA MODIFICAÇÃO AOS 29-12-2012 //
////////////////////////////////////////////////////////

#include <16F877A.h>
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for
#use delay(clock=4000000)

#use fast_io(C)
#use rs232 (stream=modulo, baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use rs232 (stream=pc, baud=1200, xmit=PIN_C4, rcv=PIN_C5,TIMEOUT=8000)

#include <LCD.C>
#include <string.h>

#byte portb=0x06

char c;
char res[16];
char rx[16];
char card1[16];
char card2[16];
char card3[16];
char verm [16];
char azul [16];
char amar [16];


////////////////////////////////////////////////////////////////////////////////
void inicial(){

fprintf(pc,"\f");

fputs(" #####################################################",pc);
fputs(" ######### UMA-2012 ##########",pc);
fputs(" ######### PARQUE DE ESTACIONAMENTO ##########",pc);
fputs(" ######### COM RFID ##########",pc);
fputs(" #####################################################",pc);
fputs(" ######### A ##########",pc);
fputs(" ######### B ##########",pc);
fputs(" #####################################################",pc);
fputs(" ######### ELECTROPUBLITEC ##########",pc);
fputs(" #####################################################",pc);
fputs("",pc);fputs("",pc);

}


void main()
{

set_tris_a(0x11);
set_tris_b(0xff);
set_tris_e(0);
set_tris_d(0);
set_tris_c(0b10101000);
output_d(0x00);

port_b_pullups(TRUE);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();

printf(lcd_putc,"\fELECTROPUBLITEC 2012\n UMA");
inicial();
delay_ms(1000);
printf(lcd_putc,"\f PARQUE\n RFID");


while (TRUE){



if(kbhit(PC)){

c=fgetc(pc);
if(c==13){
fputs(" #####################################",pc);
fputs(" ## DIGITE A OPCAO ##",pc);
fputs(" #####################################",pc);
fputs(" ## 1=VERIFICAR IDs GRAVADAS ##",pc);
fputs(" ## 2=GRAVAR NOVA ID ##",pc);
fputs(" ## 3=APAGAR/BLOQUEAR IDs ##",pc);
fputs(" ## 4=VERIFICAR VAGAS ##",pc);
fputs(" ## 0=CANCELAR ##",pc);
fputs(" #####################################",pc);
c=fgetc(pc);

switch(c){
case '1': fputs("IDs GRAVADAS",pc); break;
case '0': fputs("CANCELADO...",pc); delay_ms(2000); inicial(); break;
case 0 : fputs("TIMEOUT...",pc); delay_ms(2000); inicial(); break;
default: fputs("OPCAO INVALIDA...",pc); delay_ms(2000); inicial(); break;
}
} printf(lcd_putc,"\f PARQUE\n RFID");
}


if(kbhit(modulo)){ //TESTA SE CHEGOU ALGUMA INFORMAÇÃO DO MODULO
output_high(pin_a0);
switch(portb){

case 0xff: fgets(rx,modulo);
strcpy(res,"DESCONHECIDO");
if(strcmp(rx,card1)==0) strcpy(res," CARD 1");
if(strcmp(rx,card2)==0) strcpy(res," CARD 2");
if(strcmp(rx,card3)==0) strcpy(res," CARD 3");
if(strcmp(rx,verm) ==0) strcpy(res," VERMELHO");
if(strcmp(rx,azul) ==0) strcpy(res," AZUL");
if(strcmp(rx,amar) ==0) strcpy(res," AMARELO");
printf(lcd_putc,"\f");delay_ms(300);
printf(lcd_putc,"ID RECEBIDA\n%s",res);
break;

case 0x7f: fgets(card1,modulo);
printf(lcd_putc,"\fGRAVANDO ID\nCARD 1");
fprintf(pc,"GRAVANDO ID --> CARD 1");
delay_ms(2000); break;

case 0xbf: fgets(card2,modulo);
printf(lcd_putc,"\fGRAVANDO ID\nCARD 2");
fprintf(pc,"GRAVANDO ID --> CARD 2");
delay_ms(2000); break;

case 0xdf: fgets(card3,modulo);
printf(lcd_putc,"\fGRAVANDO ID\nCARD 3");
fprintf(pc,"GRAVANDO ID --> CARD 3");
delay_ms(2000); break;

case 0xef: fgets(verm,modulo);
printf(lcd_putc,"\fGRAVANDO ID\nVERMELHO");
fprintf(pc,"GRAVANDO ID --> VERMELHO");
delay_ms(2000); break;

case 0xf7: fgets(azul,modulo);
printf(lcd_putc,"\fGRAVANDO ID\nAZUL");
fprintf(pc,"GRAVANDO ID --> AZUL");
delay_ms(2000); break;

case 0xfb: fgets(amar,modulo);
printf(lcd_putc,"\fGRAVANDO ID\nAMARELO");
fprintf(pc,"GRAVANDO ID --> AMARELO");
delay_ms(2000); break;
}

delay_ms(1500);
printf(lcd_putc,"\f PARQUE\n RFID");
lcd_gotoxy(17,2);
printf(lcd_putc,"ELECTROPUBLITEC");
output_low(pin_a0);
}

}
}






Isso foi testado no proteus e funciona sem problemas, e com velocidades diferentes.

Link para o comentário
Compartilhar em outros sites

  • 3 meses depois...

E aí, Leopuena e amigos...

Estou reativando esse tópico para obter mais informações sobre uart por software...

Estou com uma situação bem parecida com a apresentada pelo leopuena o problema é que terei de alterar o Baud Rate em alguns momentos, devido a alta quantidade de transferência de dados que chega próximo de 50KB...

A minha pergunta é a seguinte, se alguém já usou UART por Software com baud rate de 115200bps? Será que funciona? Pretendo rodar o uC, com clock de 40MHz...

Link para o comentário
Compartilhar em outros sites

Para voce alterar o Baund rate em certos momentos on the fly,se voce estiver usando o Windows,essas mudanças podem demorar até 30 segundos a cada mudança.

Quando tiver que fazer alterações no baund rate ,em tempo real,no Windows tive que usar a rotina de leitura/escrita em Assembly pois só assim oWindows mudava de velocidade no mesmo instante.

Link para o comentário
Compartilhar em outros sites

Primeiramente, desculpa a minha demora em responder as perguntas...

Os 18F têm essa capacidade, mas nunca tentei. Mas não vejo necessidade de alterar a velocidade durante o programa, ele pode funcionar na velocidade máxima. E será muito mais difícil fazer por soft nessa velocidade.

Infelizmente eu preciso criar interface que irá entrar num sistema que já está pronto e comercializado. Preciso inserir um periférico que roda a 115200bps em outro a 9600bps (que no momento de maior transferência de dados irá subir a velocidade para 115200bps, é nesse instante que está a minha dúvida)... Ao que tudo indica vou retomar o projeto dessa interface e quando terminar, posto aqui o resultado...

Link para o comentário
Compartilhar em outros sites

Primeiramente, desculpa a minha demora em responder as perguntas...

Infelizmente eu preciso criar interface que irá entrar num sistema que já está pronto e comercializado. Preciso inserir um periférico que roda a 115200bps em outro a 9600bps (que no momento de maior transferência de dados irá subir a velocidade para 115200bps, é nesse instante que está a minha dúvida)... Ao que tudo indica vou retomar o projeto dessa interface e quando terminar, posto aqui o resultado...

A comunicação precisa ser ao mesmo tempo? Às vezes é possível multiplexar a porta serial, podendo se comunicar com um dispositivo por vez.

Agora se a comunicação for simuntânea, então use um pic com duas UARTS como o PIC18F23K22.

Link para o comentário
Compartilhar em outros sites

  • mês depois...

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