Ir ao conteúdo

Posts recomendados

Postado

Olá pessoal!

 

Estou com uma dúvida a respeito de como enviar dados através do TX do PIC (Microcontrolador) para dois dispositivos diferentes, quero enviar informações diferentes para cada um, então, queria saber se tem algum PIC que possua dois TX para que eu possa utilizar cada porta ou tem alguma configuração diferente que eu possa usar a mesma porta TX é transmitir distinto os dados somente para um dispositivo por vez.

Eu estou programando em linguagem C e queria mostrar um texto no display e no módulo sim 800L quero enviar uma mensagem SMS diferente.

 

Alguém pode me ajudar por favor?

  • Membro VIP
Postado

Claro. Welcome...

Consulte o site microchip.com e faça busca paramétrica de mc com mais de uma saída serial. Alternativa a isso é usa um mc qualquer - nem precisa ter serial - e pesquisar os algoritimos para bit banging . Com ele você cria uma interface serial virtual feita com sw. Teoricamente você cria quantas interfaces quiser, dentro dos limites do número de pinos, claro.

  • Curtir 1
Postado

@Henrique Souza ,

 

Depende de quais são os dois dispositivos diferentes .....

 

Aproveitando lembranças de um tempo muito, muito antigo ( 1985.... ) , os dispositivos seriais tinham vários sinais de controle, como o RTS e o CTS... se esses seus dispositivos tiverem algo parecido a solução é muito simples !

 

Mas se tiverem apenas os sinais Tx e Rx, aí ou você faz a famosa serial por software ( como disse a @Isadora Ferraz vulgo Bit Banging ) ou usa um tipo de multiplex para selecionar o dispositivo desejado a cada instante . Só que neste último caso seu projeto deve ser o Mestre e os outros dispositivos tem de ser Escravos.

 

Paulo

 

 

  • Curtir 1
Postado

Vamos lá.

Até onde eu sei, a transmissão e recepção PODE conter um nono bit.

Esse nono bit pode ser usado como detetor de paridade, OU COMO BIT DE CONTROLE DE ENDEREÇAMENTO.

Dependendo de seu valor, um ou zero, ele indica se o dado transmitido/recebido é um dado ou um endereço de dispositivo.

Consulte o manual na seção USART. Em especial o bit  ADEN do registro RCSTA.

Consulte também...

PIC16F627A/628A/648A
DS40044A-page 82
Preliminary
 2002 Microchip Technology Inc.
12.3     USART Address Detect Function
12.3.1       USART 9-BIT RECEIVER WITH ADDRESS DETECT

 

Há muito tempo, fiz um tutorial, em anexo, sobre a sequência de eventos que serviriam para se configurar a USART no PIC (16F628A). Possui três unidades: Configuração da USART, transmissão e recepção.  Está em assembler, o que facilita poder transformar em qualquer linguagem.

Bons projetos.

MOR_AL

USART.pdf

Postado

@MOR ,

 

Excelente ideia , meu amigo !

Gostei dos fluxogramas do tutorial, pena que não consigo entender esse negócio de bancos dos Pics .... mas informação muito boa, parabéns pelo artigo !

 

Paulo

  • Curtir 1
Postado

Olá @aphawk, obrigado!

O detalhe dos bancos no PIC é simples.

Alguns 2 registros possuem o mesmo endereço, mas o que os distingue é que se encontram em bancos diferentes. Então, caso deseje acessar um determinado registro, deve-se especificar o banco que ele se encontra antes de acessá-lo, ou nem especificar, caso o banco atual já seja o desejado.

Criei duas macros Banco0  e Banco1 (presentes no fluxograma). Cada uma possui apenas duas instruções em assembler. Então, os blocos retangulares com Banco0 ou Banco1, simplesmente mudam de banco para que o registrador possa ser acessado corretamente.

Com relação aos meus fluxogramas, você pode notar que os blocos geométricos não são padronizados como é de costume. O losango, que significa um bloco condicional, ocupava muito espaço na página, limitando a quantidade de blocos por página. Todos os meus blocos de instruções são retangulares, mas há um diferencial.

Atribuições são simplesmente blocos retangulares.

Condicionais são blocos retangulares, porém com duas saídas (Sim e Não, 0 ou 1) como respostas à questão no interior do bloco.

Rotinas são blocos retangulares com as palavras internas em negrito.

 

... Criei muitas macros e copiei outras. No momento possuo 32 macros com nomes que são mnemônicos. 

Por Exemplo: RMeV (Registro é Menor que Valor?)

 

Pule se o conteúdo do registro R for menor que o valor V (RMeV)    

RMeV macro R, V, End_R_menor_que_V (a instrução em assembler não possui a palavra macro)

      movlw    V            ; w = V
      subwf    R, w            ; w = R - V
      btfss    STATUS, C        ; Se C = 1 pule. (R >= V)
      goto    End_R_menor_que_V    ; C = 0. (R < V)
      endm        
 

Pule se o conteúdo do registro R1 for menor que o conteúdo do registro R2 (R1MeR2)    

R1MeR2 macro R1, R2, End_R1_menor_que_R2

      movf    R2, w            ; w = R2
      subwf    R1, w            ; w = R1 - R2
      btfss    STATUS, C        ; Se C = 1 pule. (R1 >= R2)
      goto    End_R1_menor_que_R2    ; C = 0. (R1 < R2)
      endm        
 

Não pretendo usar mais a linguagem assembler. A exceção é para programas que possuam até 2k Bytes.

Estou tendo alguma dificuldade para usar o bascavr, que comprei já faz algum tempo. O problema não é a linguagem, que por sinal é bem fácil de entender. Acredito que para se escrever um programa, deve-se conhecer o hardware do microcontrolador. Para o PIC, encontrei um livro muito bom, que trata disso, mas para o atmega ainda não encontrei um livro que descreva o hardware com mais facilidade que o próprio manual. Além disso, o manual se encontra em mídia eletrônica (precisa do PC), que possui 660 páginas... Nem dá para imprimir tudo.

Sua apostila é muito útil, mas sinto falta de um bom livro sobre o ATmega328.

[]'s

MOR_AL

 

Postado

@MOR ,

 

Legal as Macros, me lembrei de quando usava o M80 e o L80.

 

Mas isso de bancos me deixa bem fora de onde me sinto confortável, e prefiro o Asm dos AVR’s, que é linear igual a um 8080 / Z80 .

 

Quanto aos Avrs, o que posso te falar é que tudo dentro de um Atmega é muito parecido com os Pic16, embora tenham um ou outro recurso a mais em cada módulo.

 

Uma boa dica é ler apenas a parte final do datasheet referente a cada módulo, por exemplo os Timers basta você ler no final do capítulo como funcionam os registros referentes a eles, e você consegue intuir como eles funcionam.

 

O que pode te ajudar também é você escrever um pequeno programa em Bascom que inicialize o hardware desejado, e depois rodar um Desassembler ( kkk ) e ver como os registradores foram programados, assim fica bem simples entender o funcionamento.

 

Uma enorme vantagem dos Atmegas é que quase todo pino possui interrupção por mudança de nível, e isso ajuda muito nos projetos mais críticos.

 

Enfim, creio que se você pegar o datasheet do Atmega328 e ler como se programa cada um dos módulos internos dele, você logo aprende como eles funcionam.

 

Eu aprendi lendo os datasheets, mas a experiência anterior que eu tinha com os Z80-Pio, Z80-CTC e Z80-SIO ajudaram muito a entender como funcionava e como programar, e a versão gratuita do Bascom foi o meu Laboratório Particular , pois programava, testava , desassemblava e confirmava o meu aprendizado !

 

Vai por mim, é tão simples como programar para a família do Z80....

 

Paulo

 

 

  • Curtir 1
Postado
Em 05/02/2020 às 12:17, aphawk disse:

pena que não consigo entender esse negócio de bancos dos Pics

 

15 horas atrás, aphawk disse:

mas a experiência anterior que eu tinha com os Z80

Essa eu não entendi. Uma das belezas do Z80 que o distinguia do 8080 é ter justamente 2 bancos de registradores. Não usava as facilidades disso? Fazem décadas que não vejo um Z80 pela frente e passei muitos anos sem qualquer contato com MPUs mas disso eu bem, me lembro.

  • Haha 1
Postado

@Sérgio Lembo ,

 

O que distinguia do 8080 era o uso dos registradores de indexação,  instruções bem poderosas que usavam eles e claro centenas de instruções a mais.... o famoso banco alternativo eu nunca precisei usar, apenas usava os pares de registradores como 16 bits e isso era mais que o suficiente para mim!

 

Mas no Z80 podia programar sem imaginar que sequer existia esse banco alternativo, e esse banco alternativo não influía no endereçamento da memória.

 

Já nos Pics não dá para fazer nada sem ficar mudando de banco toda hora, e o endereçamento de memória também não é linear. Isso  me fez desistir rapidinho deles ....   tudo que eu programei era linear, claro que nos 8086 em diante tinha registradores extras para acessar memória que tornavam não linear caso se usasse mais de 64K, mas podia fazer um programa completo dentro de 64K sem me preocupar com quase nada de bancos.

 

Enfim, falar de passado não vai acrescentar nada para os programadores e experimentadores de hoje em dia né ?


Mesmo assim acho que seria muito interessante a todos que estão iniciando ler como era possível nos Apple rodar programas com 2 microcontroladores totalmente diferentes , usando a mesma memória RAM, e ver como o 6502 passava o controle ao Z80 e como o

Z80 devolvia o controle ao 6502.

Esse era o milagre da placa Videx CPM 80 colunas !

Isso sim era Engenharia !

 

Paulo

Postado

@Isadora Ferraz

Em 04/02/2020 às 20:43, Isadora Ferraz disse:

Claro. Welcome...

Consulte o site microchip.com e faça busca paramétrica de mc com mais de uma saída serial. Alternativa a isso é usa um mc qualquer - nem precisa ter serial - e pesquisar os algoritimos para bit banging . Com ele você cria uma interface serial virtual feita com sw. Teoricamente você cria quantas interfaces quiser, dentro dos limites do número de pinos, claro.

Entendi mais ou menos, porque nunca ouvi falar deste bit banging, mas da para programar em linguagem C? ele simula uma outra porta do pino e transforma em TX (transmissor ) ne?

Postado

@aphawk

Essa sofisticação multiprocessada eu não peguei. Tinha o privilégio de fazer o programa para uma placa Z80 proprietária nossa num terminal da IBM, mas tinha que ser em assembler. O C e suas bibliotecas apareceram depois e eu na inocência tentava mandar um trem de dados para a tela com comando único, foi quando descobri que necessitava do controle de tráfico TX RX, 70% das letras eram perdidas. Faz parte do aprendizado. Foi bom.

  • Membro VIP
Postado
4 horas atrás, Henrique Souza disse:

da para programar em linguagem C? ele simula uma outra porta do pino e transforma em TX (transmissor ) ne?

Sim... né.

algo como (digito on line)
 

void tx(dado)
{
unsigned char i;
for (i=0;i<8;i++)
	{
	RB0=dado;//lsb primeiro
	dado>>=1;
	asm('nop');asm('nop');//...ajuste do baudrate
	}
}

...

tx(0x55);//onda quadrada

 

Postado
5 horas atrás, Sérgio Lembo disse:

Essa sofisticação multiprocessada eu não peguei. Tinha o privilégio de fazer o programa para uma placa Z80 proprietária nossa num terminal da IBM, mas tinha que ser em assembler. O C e suas bibliotecas apareceram depois e eu na inocência tentava mandar um trem de dados para a tela com comando único, foi quando descobri que necessitava do controle de tráfico TX RX, 70% das letras eram perdidas. Faz parte do aprendizado. Foi bom.

 

 Pois é, e eu dominava toda a sequência do protocolo RS-232, e ainda assim nada funcionava ... e perdi um tempão para fazer as telas funcionarem pois o terminal que eu utilizava era ANSI qqr coisa e ficava uma bagunça enorme ... até descobrir que tinha de carregar o driver ansi.sys dentro do Config do DOS foi um inferno kkkk

 

Bons tempos !

 

 

6 horas atrás, Henrique Souza disse:

@Isadora Ferraz

Entendi mais ou menos, porque nunca ouvi falar deste bit banging, mas da para programar em linguagem C? ele simula uma outra porta do pino e transforma em TX (transmissor ) ne?

 

Oras, existem dezenas de bibliotecas pro C que fazem isso, meu amigo !

Algumas permitem várias interfaces seriais ao mesmo tempo !

 

Na verdade essa biblioteca emula uma interface serial real, com os pinos de TX/RX , e funciona muito bem. voce usa dois pinos para isso.

 

Veja aqui uma para uso na IDE do Arduíno :

 

http://arduiniana.org/libraries/newsoftserial/

 

 

Paulo

Postado
46 minutos atrás, aphawk disse:

Oras, existem dezenas de bibliotecas pro C que fazem isso, meu amigo !

Algumas permitem várias interfaces seriais ao mesmo tempo !

Li o PDF que o @MOR postou. A impressão que tive é um aproveitamento do formato I2C onde todos escutam mas somente o endereçado leva em conta o conteúdo.

  • Curtir 1
Postado

@Sérgio Lembo

É! Realmente todos escutam. Só o que tem o endereço enviado é que lê os dados seguintes. 

Aliás, deve-se informar um endereço código, reconhecido por todos, como fim de transmissão. Na verdade nem precisaria, mas seria algo como uma confirmação. Ou então, os bytes de dados devam possuir um número reconhecido pelos outros do grupo. Mas nesse caso, uma perda de um byte deixaria a comunicação dessincronizada.

 

17 horas atrás, Henrique Souza disse:

@Isadora Ferraz

Entendi mais ou menos, porque nunca ouvi falar deste bit banging, mas da para programar em linguagem C? ele simula uma outra porta do pino e transforma em TX (transmissor ) ne?

Pelo visto, nosso colega não percebeu que bastaria enviar um byte de endereço antes, para poder se comunicar com até 255 outros microcontroladores. Isso tudo com apenas UM PINO TX e UM PINO RX.

Mas a melhor solução é aquela que a gente entende. Então, procure entender uma que lhe convém e continue dalí.

Boas programações.

MOR_AL

 

  • Curtir 2
  • Membro VIP
Postado

Moris, pelo que entendi o colega quer mais saídas no hw e não necessariamente por sw gerindo endereços. A parte slave dele não deve estar preparada pra decodificar endereço único = I2C. Deduzo que o receptor slave dele seja "burrinho".

Amigo @Henrique Souza  se for I2C, vá de Moris. E claro, vá de I2C do hw do seu mc sem uso de bit banging..

Postado

@Isadora Ferraz ,

 

No post inicial o querelante menciona o módulo SIM800L, que é um módulo que usa comunicação serial assíncrona TTL.

E pretende mandar uma mensagem ao display, o qual já não mencionou qual a tecnologia empregada.

 

Se o display dele também for serial comum ( o que é raro ou caro hoje em dia kkk ) , então precisa mesmo emular uma segunda interface serial para isso.

 

Já se for qualquer outro tipo ( I2C, TWI, etc ... ) , o problema está resolvido caso o PIC dele tenha essa interface nativa no hardware.

 

Paulo

 

 

  • Curtir 1
Postado
Em 06/02/2020 às 20:29, Isadora Ferraz disse:

Sim... né.

algo como (digito on line)
 


void tx(dado)
{
unsigned char i;
for (i=0;i<8;i++)
	{
	RB0=dado;//lsb primeiro
	dado>>=1;
	asm('nop');asm('nop');//...ajuste do baudrate
	}
}

...

tx(0x55);//onda quadrada

 

Pesquisei no google e youtube, mas só achei explicações em inglês, então, você poderia me informar onde encontro o procedimento em português ou se souber algum site que explica bem sobre bit banging eu poderia traduzir para português.

Agradeço muito se me ajudar.

adicionado 1 minuto depois
1 minuto atrás, Henrique Souza disse:

Pesquisei no google e youtube, mas só achei explicações em inglês, então, você poderia me informar onde encontro o procedimento em português ou se souber algum site que explica bem sobre bit banging eu poderia traduzir para português.

Agradeço muito se me ajudar.

@Isadora Ferraz 

adicionado 7 minutos depois
Em 07/02/2020 às 09:32, MOR disse:

@Sérgio Lembo

É! Realmente todos escutam. Só o que tem o endereço enviado é que lê os dados seguintes. 

Aliás, deve-se informar um endereço código, reconhecido por todos, como fim de transmissão. Na verdade nem precisaria, mas seria algo como uma confirmação. Ou então, os bytes de dados devam possuir um número reconhecido pelos outros do grupo. Mas nesse caso, uma perda de um byte deixaria a comunicação dessincronizada.

 

Pelo visto, nosso colega não percebeu que bastaria enviar um byte de endereço antes, para poder se comunicar com até 255 outros microcontroladores. Isso tudo com apenas UM PINO TX e UM PINO RX.

Mas a melhor solução é aquela que a gente entende. Então, procure entender uma que lhe convém e continue dalí.

Boas programações.

MOR_AL

 

@MOR

Olá MOR!

 

Eu não conheço muito bem esta parte de envio de dados TX, mas pelo que os amigos disseram deste teu jeito é mais fácil, então, você poderia me informar um site ou tópico que me explique detalhadamente como funciona isto e os comandos a ser feito?

 

Agradeceria muito sua ajuda.

  • Membro VIP
Postado

Amigo, inglês (técnico) é um prerequisito pra casos como este. A alternativa que te dou é usar o google translator. Mas o simples exemplo que te dei penso ser uma relativamente boa introdução aos princípios do bitbanging. Bem, pelo menos pra quem domina minimamente a linguagem c e o conhecimento também mínimo do hw do mc. Caso ainda estejas engatinhando, sugiro iniciar pelo hello world  pisca led algo como:
 

#define led RB0 //PORTB.0... ou como seu compilador define os pinos
unsigned char t;
for(;;) {led^=1;while (t--);}

entenda/domine/comente

Postado
11 horas atrás, Henrique Souza disse:

Olá MOR!

 

Eu não conheço muito bem esta parte de envio de dados TX, mas pelo que os amigos disseram deste teu jeito é mais fácil, então, você poderia me informar um site ou tópico que me explique detalhadamente como funciona isto e os comandos a ser feito?

Tudo que fiz sobre esse assunto, estudei no livro do Fabio Pereira. "Microcontroladores PIC - Técnicas Avançadas,

Vamos lá!

Na postagem #4 disponibilizei três rotinas de comunicação via USART.

1 - USART_Config, que prepara o PIC para a operação com a USART.

2 - USART_Tx, que transmite o byte com 8 ou 9 bits.

3 - USART_Rx, que recebe o byte com 8 ou 9 bits.

As rotinas estão em pseudo código. Sabendo o que ten que ser feito, fica fácil transforma-la para a linguagem que mais lhe convier, como a linguagem C.

Essas são sub-rotinas usadas na transmissão e na recepção. As rotinas de transmissão e de recepção são:

USART_Verifica_Int.thumb.jpg.ffb4191bafaffef9eb6fa40b8e11b8b7.jpg

Hoje eu desafogaria a rotina de interrupção, mas está funcionando.

A rotina de erro exterioriza um código referente ao erro. Pode ser sonoro ou visual. É uma forma de identificar a localização do problema, durante a fase de depuração do programa.

Erro_Config.thumb.jpg.181ba818401bac4484a077921dabc0b8.jpg

 

Explicação do fluxograma...

1 - Todos os blocos são retangulares.

2 - Blocos com letras em negrito são rotinas.

3 - Blocos condicionais possuem duas saídas, que representam as respostas das condições. Sim (S) e não (N), zero (0) ou um (1).

4 - Outras palavras junto a saída do bloco significa endereço (um label). Ex.: Voltaqui:

 

 

Bom. Encerro aqui minha participação no tópico. Agora, caso deseje continuar, basta fazer o seu programa baseado nos fluxogramas apresentados. Eu já testei e funcionam.

Bons projetos.

MOR_AL

  • Curtir 1
  • Obrigado 2
  • 2 semanas depois...
Postado
Em 10/02/2020 às 09:49, MOR disse:

Tudo que fiz sobre esse assunto, estudei no livro do Fabio Pereira. "Microcontroladores PIC - Técnicas Avançadas,

Vamos lá!

Na postagem #4 disponibilizei três rotinas de comunicação via USART.

1 - USART_Config, que prepara o PIC para a operação com a USART.

2 - USART_Tx, que transmite o byte com 8 ou 9 bits.

3 - USART_Rx, que recebe o byte com 8 ou 9 bits.

As rotinas estão em pseudo código. Sabendo o que ten que ser feito, fica fácil transforma-la para a linguagem que mais lhe convier, como a linguagem C.

Essas são sub-rotinas usadas na transmissão e na recepção. As rotinas de transmissão e de recepção são:

USART_Verifica_Int.thumb.jpg.ffb4191bafaffef9eb6fa40b8e11b8b7.jpg

Hoje eu desafogaria a rotina de interrupção, mas está funcionando.

A rotina de erro exterioriza um código referente ao erro. Pode ser sonoro ou visual. É uma forma de identificar a localização do problema, durante a fase de depuração do programa.

Erro_Config.thumb.jpg.181ba818401bac4484a077921dabc0b8.jpg

 

Explicação do fluxograma...

1 - Todos os blocos são retangulares.

2 - Blocos com letras em negrito são rotinas.

3 - Blocos condicionais possuem duas saídas, que representam as respostas das condições. Sim (S) e não (N), zero (0) ou um (1).

4 - Outras palavras junto a saída do bloco significa endereço (um label). Ex.: Voltaqui:

 

 

Bom. Encerro aqui minha participação no tópico. Agora, caso deseje continuar, basta fazer o seu programa baseado nos fluxogramas apresentados. Eu já testei e funcionam.

Bons projetos.

MOR_AL

@MOR Você saberia como me dar um exemplo de programação em linguagem C enviando dois sinais TX para dispositivos diferentes, sendo um para o display e outro para o virtual terminal por exemplo no proteus? 

Postado

Olá pessoal!

 

Eu queria saber se é possível configurar duas portas TX no microprocessador Atmega 328p?

 

Por exemplo:

Alguém saberia como me dar um exemplo de programação em linguagem C enviando dois sinais TX para dispositivos diferentes, sendo um para o display e outro para o virtual terminal do proteus? 

  • Membro VIP
Postado
11 horas atrás, Henrique Souza disse:

um exemplo de programação em linguagem C enviando dois sinais TX para dispositivos diferentes

que tal isso pra um dispositivo...

e isso pra outro...

void tx1(dado)
{
unsigned char i;
for (i=0;i<8;i++)
	{
	RB1=dado;//lsb primeiro
	dado>>=1;
	asm('nop');asm('nop');//...ajuste do baudrate.. olha a utilidade do nop aí...
	}
}

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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