* usando a rs485
* Version : 1.0
* microcontrolador : AVR ATMega328
* descrição : exemplo usando a comunicação rs 485 em modo mestre-escravo
* criado: 3/4/2012 10:10:07
* autor: aguivone moretti fogia
*/
#define F_CPU 16000000 // 16 MHz
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <util/delay.h>
#include <string.h>
#define alterna_pino(x,y) x ^= _BV(y)
#define liga_pino(x,y) x |= _BV(y)
#define desliga_pino(x,y) x &= ~(_BV(y))
char caracter;
///////////////////////////////////////////////funçoes usadas pela usart////////////////////////////////////////////////
void RS485_inicializa(unsigned int BAUD)
{
unsigned int velocidade = F_CPU/16/BAUD-1;
//veja que na simulação do proteus dá erros nas velocidade diferentes de 9600 mas na pratica funciona.
UCSR0A = 0X20;
/* habilita receiver and transmitter buffers */
UBRR0H = (unsigned char)(velocidade>>8);
UBRR0L = (unsigned char)velocidade;
UCSR0B = 0X98;//deve se habilitar somente a interrupção de recepção para não travar o microcontrolador
/* 8 bits , 1 stop bit, assincrono , sem paridade,modo nornal */
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
desliga_pino(PORTD,PD2);
}
void escreve_caracter(unsigned char carac)
{
liga_pino(PORTD,PD2);//pino de controle da RS-485
_delay_loop_1(1);//tempo para estabilizar tensão
while ( !( UCSR0A & (1<<UDRE0)) ); //espera transmitir para enviar um novo
UDR0 = carac;
while ( !( UCSR0A & (1<<UDRE0)) ); //espera transmitir desabilita a transmissão
_delay_loop_1(1);//tempo para garantir o envio
desliga_pino(PORTD,PD2);//pino de controle da RS-485
}
void impri_serial(const char frase[80])
{
unsigned int indice=0;
unsigned int tamanho = strlen(frase);
while(indice<=tamanho)///veja que o programa pode travar se aqui não tiver as duas aspas
{
escreve_caracter(frase[indice]);
indice++;
}
}
//////////////////////////interrupções requerida para usar a recepção serial///////////////////////////////////
ISR(USART_RX_vect)
{
caracter = (char)UDR0;
escreve_caracter(caracter);
}
//////////////////////////////////////////////função principal///////////////////////////////////////////
int main(void)
{
DDRD = 0XFE; //inicializa portD,4 a 7 entrada
RS485_inicializa(9600);
sei();
impri_serial("Inicializado ... \n\r");
impri_serial("pronto !\n\r");
//////////////////////////
int long teste;
for(;;)
{
if(teste > 100000)
{
alterna_pino(PORTB,PB1);
teste=0;
}
teste++;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
Engenheiro eletricista - Desenvolvedor de hardware. Protótipos e projetos. Desenvolvimento de software de interface.(aguivone@gmail.com)
quarta-feira, 4 de abril de 2012
Usando RS485 no AVR STUDIO - ATmega328:
/*
Assinar:
Postar comentários
(
Atom
)
I need to work on RS485 modbus protocol pls help..
ResponderExcluiri tried this program for me it didnt worked simulation ......
I need it in English
Boa noite.
ResponderExcluirAcabei de fazer essa experiência no Proteus, porém não apareceu nenhum caractere no terninal RS232 quando eu digitei no terminal RS485. Conferi os baud-rates no codigo-fonte e no properties do MAX487 e estão como 9600 de baud rate. Poderia me ajudar e resolver o problema? Grato
ok, postei a configuração do proteus que era onde ocorria o erro.
Excluir