Avançar para o conteúdo principal

Projecto Comunicação RX/TX Serie entre 2 PIC18F4520





Boa noite a todos os que têm acompanhado este blog.

Hoje irei falar um pouco de um projeto que tenho vindo a desenvolver na área da micro eletrotécnica.
Ainda com um grande caminho a percorrer tenho-me aventurado nesta área fascinante que envolve eletrotécnica e programação.

Hoje apenas irei colocar a lógica do Projeto, a sua implementação  física ainda numa fase de simulação e o código fonte de cada PIC.

Bem, para fazer tudo isto ainda numa fase de prototipagem vamos apenas usar software, assim podemos ver facilmente como funciona e não corremos o risco de queimar componentes :).

A nível de software irei usar:

Proteus 8

Este software irá servir para simularmos todo o nosso circuito eletrónico, contem milhares de componentes e micro-controladores tais como PIC e AVR. 
É bastante simples de usar e bastam dois cliques para carregar o nosso ficheiro HEX para dentro da PIC.

Download em :

MikroC for PIC

Este software é desenvolvido pela MikroElectrónica para PIC's, principalmente da MicroChip é um ótimo IDE para programar.
Com ele podemos  programar toda a lógica de funcionamento da PIC utilizandouma linguagem de mais alto nível (linguagem C neste caso, podemos optar por Basic ou Pascal) que o Assembler da MicroChip, podendo assim ter mais rentabilidade e facilidade na programação destes micro-controladores que são as PIC.

Download em:
_______________________________________________________________

Apresentado o software necessário passo a mostrar o prototipo do circuito simulado no Proteus.

Neste prototipo vamos colocar:
Duas PIC18F4520 onde a PIC2 vai enviar uma mensagem à PIC1 e no final da PIC1 receber a mensagem, apresenta no LCD a mensagem Sucesso.

Temos também 2 Led's ligados em cada PIC, o LED RED fica acesso quando a PIC está a RECEBER ou a ENVIAR, o LED GREEN acende quando a PIC termina de ENVIAR ou de RECEBER.

Coloquei também um simulador de terminal para visualizar em tempo real o que a PIC está a receber. Este tipo de terminal simula um Computador, no entanto relembro que para implementar fisicamente a ligação não pode ser assim direta é necessário criar uma interface entre a PIC e a Porta serie RS232 do Computador, na maioria dos casos usamos um Integrado MAX232 para o efeito.

Componentes necessários:
2x PIC18F4520
2x Crystal 16Mhz
4x Capacitor 22pf
2x LED Green
2x LED Red
1x LCD 16x2 8bits

Opcional Simulador Terminal

Para este tipo de projeto é sempre importante termos o Datasheet do Micro-controlador.
Para o caso em questão podemos fazer download do mesmo em:

Passando agora à parte de programação 

Código fonte da PIC1 (linguagem C) 
Esta PIC está responsável por receber mensagens e mostrar no LCD que a mensagem foi recebida com sucesso.

//Ligações LCD
sbit LCD_EN at RD0_bit;
sbit LCD_RS at RD1_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_EN_Direction at TRISD0_bit;
sbit LCD_RS_Direction at TRISD1_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;

char uart_rd;

//Funcão que recebe os dados UART
void receber(){
  while(1){
          if(UART_Data_Ready() == 1){
            uart_rd = UART1_Read(); //Função de Leitura carácter a carácter
            if(uart_rd == '#'){ // O carácter '#' marca o inicio da mensagem
              while(uart_rd != 13){ // O carácter 13 (carriage return) marca o fim da mensagem
               if(UART_Data_Ready() == 1){
                 uart_rd = UART1_Read();
                 UART1_Write(uart_rd); //Escreve a mensagem no terminar do computador
                 RA1_bit = 1; //Coloca o Porto RA1 em High Voltage (Liga o LED)
               }
              }
          RA1_bit = 0; // Coloca o Porto RA1 em Low Voltage (Desliga o LED)
          UART1_Write(13);
          Lcd_Cmd(_LCD_CLEAR); //Limpa todo o conteudo do LCD
          lcd_Out(1,1,"Sucesso"); //Escreve na Primeira Linha a iniciar na Primeira Coluna a String "Sucesso"
          RA0_bit = 1;
          Delay_ms(1000); //Aguarda 1 segundo para voltar a receber mais mensagens
          RA0_bit = 0;
          Lcd_Cmd(_LCD_CLEAR);
        }
      }
    }
}

//Função main
void main() {
TRISA =0; //Ativa todos os Portos da Bloco A para modo OUPUT
TRISD = 0; //Ativa todos os Portos da Bloco D para modo OUPUT
Lcd_Init(); //Inicia o modulo LCD

Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF); //Desactiva o Cursor

  // Comunicação Serie
UART1_Init(12000); //Inicializa o modulo UART com 12000 bps
Delay_ms(100); //Aguarda 100 milisegundos para que o modulo estabeleça
receber(); //Invoca a função receber
}


Código fonte da PIC2 (linguagem C)
Esta PIC é responsável por enviar a mensagem "Ola PIC1".
O carácter '#' indica inicio de mensagem e o carácter 13 (carriage return) indica fim de mensagem.

char msg[] = "Ola PIC1\r";
int i ;

//Função que envia dados para UART
void enviar(){

     while(1){
      UART1_Write('#'); //Indicador de inicio de Mensagem
      for(i = 0; i< strlen(msg);i++){
        UART1_Write(msg[i]); //Envio do primeiro carácter
        Delay_ms(20); //Espera de 20 milissegundos, esta espera é importante quando lidamos com Hardware
        RA1_bit =1; // Liga o LED do Porto RA1
      }
    UART1_Write(13); //Fim de mensagem
    RA0_bit = 1; //Liga do LED do Porto RA0
    Delay_ms(100);
    RA0_bit = 0; //Desliga do LED do Porto RA0
    Delay_ms(1000); //Aguarda 1 segundo até enviar a próxima mensagem
 }
}

//Função main
void main() {
TRISA =0; //Ativa todos os Portos da Bloco A para modo OUPUT

  // Comunicação Serie
UART1_Init(12000); //Inicializa o modulo UART com 12000 bps
Delay_ms(100); //Aguarda 100 milissegundos para que o modulo estabeleça
enviar(); //Invoca a função receber
}

Ok por hoje é tudo, espero que tenham gostado e que vos entusiasme a criar projetos interessantes e revolucionários.

Obrigado pela tua leitura.

Partilhar também é aprender.


Bruno Horta@2014

Comentários

Mensagens populares deste blogue

3 Formas de configurar o Wi-Fi no ESP8266

3 Formas de  configurar o Wi-Fi no ESP8266 O nosso famoso ESP8266 veio para ficar, cada vez mais este microcontrolador é utilizado para desenvolver dispositivos fantásticos, é verdade que o ESP pode ser utilizado como um simples MCU , mas é a sua capacidade de se ligar a uma rede Wi-Fi, faz dele a escolha perfeita no que toca dipositivos IoT . Este artigo tem foco em três diferentes soluções que permitem programar o ESP de forma a que este se consiga ligar a uma rede Wi-Fi. É sabido que da primeira vez que o ESP é energizado este tem de conhecer ou vir a conhecer o SSID e a Password configurada no Access Point ao qual o queremos conectar de forma a fazer para da rede e ter acesso à Internet se assim for necessário. Vamos então ver como implementar as três soluções, analisar cada uma delas e ponderar os prós e contras e cada uma delas. Passemos ao caso mais simples, ao qual denomino de “Hard Coded” , esta é a forma mais utilizada por quem começa a utilizar

Instalação do SQLPLUS da ORACLE em LINUX

Bom dia a todos Hoje vou explicar como podemos instalar o SQLPLUS da Oracle em sistemas Linux que utilizem gestão de pacotes RPM, entre eles CENTOS, FEDORA etc.. O SQLPLUS é uma excelente ferramenta de administração de SGDB da Oracle e apresenta-se sob o formato de linha de comandos o que permite aos Administradores de Base de Dados um maior poder sobre o SGDB. Antes de mais é necessário ter uma conta Oracle, esta pode ser feita atraves de um registo no site e é totalmente gratuito. Após termos conta devemos ir à secção de Download -> Databases -> Oracle Instant Client URL:   http://www.oracle.com/technetwork/indexes/downloads/index.html É apresentada uma lista sistemas operativos suportados e no nosso caso vamos escolher    Instant Client for Linux x86-64   para versões 64 Bits Ao escolhermos o Sistema Operativo a Oracle mostra-nos todas aplicações de Cliente para as diversas versões de Base de dados. A ultima versão é a 12 no entanto devemos fazer o downl

Mosquitto MQTT - Como Apagar todas as Mensagem Retain

Olá malta, hoje venho partilhar convosco algo que pode dar muito jeito quando andamos a testar cenários em que temos mensagens MQTT Retained . Um mensagem com a Flag Retain fica guardada no Broker MQTT até que seja subscrita por outra . Uma solução rápida para eliminar a mensagem Retain será publicar no mesmo tópico uma mensagem vazia , no entanto se tivermos muitos tópicos com mensagens Retain pode dar muito trabalho por isso uma forma simples será eliminar a base de dados do Mosquitto e todas as mensagem Retain são perdidas. Este cenário pode parecer uma pouco Brute Force mas se pensar-mos bem, assim que os nossos sensores/atuadores se ligarem novamente ao Broker MQTT vão publicar novamente a mensagem Retain que realmente interessa :) Procedimento sudo service mosquitto stop sudo rm /var/lib/mosquitto/ mosquitto.db sudo service mosquitto start DONE.... Espero ter ajudado :) Grande Abraço