Sugerując się tym tematem
https://www.elektroda.pl/rtvforum/topic1380925.html
Napisałem prostą obsługę rs485 dla dwóch mega16 jeden to master drugi slave. Niestety nic się nie dzieje błąd tkwi w kodzie lub połączeniu na płytce albo w obu.
Master:
slave:
Schemat(przepraszam że trochę chaotyczny):
układ max485: RE i DE podłączone do PD4,R0 do Rxd a Di do Txd następnie pomiędzy linie A I B oporniki 120 ohm jako terminatory na końcach linii, dwa oporniki 1,2k ten z A do GND a ten z B do Vcc ma to zapewnić poprawną polaryzację.
Korzystam z wewnętrznego oscylatora ustawionego na 8 mhz, rs232 przy prędkości 9600 działa na takim zegarze.
Niestety układ nie działa.
https://www.elektroda.pl/rtvforum/topic1380925.html
Napisałem prostą obsługę rs485 dla dwóch mega16 jeden to master drugi slave. Niestety nic się nie dzieje błąd tkwi w kodzie lub połączeniu na płytce albo w obu.
Master:
#include <avr/io.h>
#include <inttypes.h>
#include <util/delay.h>
#include <stdio.h>
#include <avr/interrupt.h>
void USARTInit(uint16_t ubrr_value)
{
UBRRL = ubrr_value;
UBRRH = (ubrr_value>>8);
UCSRC = 0x86;
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
PORTD &=~_BV(4);
_delay_ms(1);
}
void USARTWriteChar(char data)
{
//while(!(UCSRA & (1<<UDRE)))
// {}
UDR=data;
}
void main()
{
sei();
DDRA=0xff;
PORTA=0xff;
USARTInit(51);
while(1){
PORTD |= _BV(4); //nadawanie
USARTWriteChar('b'); //umownie b to adres modułu
PORTD &=~_BV(4);//RS485 - odbior
_delay_ms(500);
PORTA=0xf0;
}
}
ISR(USART_RXC_vect)
{
char received_byte;
received_byte = UDR;
if(received_byte == 'x'){
PORTA=0x0f;
}
}slave:
#include <avr/io.h>
#include <inttypes.h>
#include <util/delay.h>
#include <stdio.h>
#include <avr/interrupt.h>
void USARTInit(uint16_t ubrr_value)
{
UBRRL = ubrr_value;
UBRRH = (ubrr_value>>8);
UCSRC = 0x86;
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
PORTD &=~_BV(4);
_delay_ms(1);
}
void main()
{
sei();
USARTInit(51);
while(1){
}
}
ISR(USART_RXC_vect)
{
char received_byte;
received_byte = UDR;
if(received_byte == 'b'){
PORTD |= _BV(4); //nadawanie
UDR = 'x'; // odpowiedź dla mastera
}
PORTD &=~_BV(4);//odbiór
}Schemat(przepraszam że trochę chaotyczny):
układ max485: RE i DE podłączone do PD4,R0 do Rxd a Di do Txd następnie pomiędzy linie A I B oporniki 120 ohm jako terminatory na końcach linii, dwa oporniki 1,2k ten z A do GND a ten z B do Vcc ma to zapewnić poprawną polaryzację.
Korzystam z wewnętrznego oscylatora ustawionego na 8 mhz, rs232 przy prędkości 9600 działa na takim zegarze.
Niestety układ nie działa.