USART med MPCM på en AVR
Postat: 22 juli 2010, 12:59:44
Håller nu på med att försöker att få MPCM att funkar mellan just nu 2 st avr:er har fått det att funka utan MPCM men efter som jag ska ha flera sedan så börja jag kolla på MPCM. Problmet jag har är att jag tar en en knapp tryckning på mastern och skickar den till slaven som sak skiva ut det till PORTB men det som kommer ut på PORTB är adressen inte data. Så skulle behöva lite hjälp med att fatt vad jag har missuppfattat.
MASTER koden:
SLAVE kod :
Tack på förhand.
MASTER koden:
Kod: Markera allt
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
int main (void)
{
DDRC = 0x00;
DDRB = 0xFF;
UCSRC = (1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<TXCIE)|(1<<RXCIE)|(1<<UCSZ2);
UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
for (;;) // Loop forever
{
while ((UCSRA & (1 << UDRE)) == 0) {}; // Do nothing until UDR is ready for more data to be written to it
UCSRB |= (1<<TXB8);
UDR = 0x02;
while ((UCSRA & (1 << UDRE)) == 0) {};
PORTB = PINC;
UCSRB &= ~(1<<TXB8);
UDR = PINC;
}
}
SLAVE kod :
Kod: Markera allt
#include <avr/io.h>
#include <avr/interrupt.h>
#define bit_on(BYTE, BIT) BYTE |= 1 << BIT
#define bit_off(BYTE, BIT) BYTE &= ~(1 << BIT)
#define F_CPU 8000000
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
#define rx_address 0x02
int main (void)
{
DDRB = 0xFF;
DDRC = 0xFF;
UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
UCSRC = (1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(1<<TXCIE)|(1<<UCSZ2);
UCSRA |= (1<<MPCM);
sei();
PORTB = 0xFF;
PORTC = 0x00;
for (;;) // Loop forever
{
// Do nothing - echoing is handled by the ISR instead of in the main loop
}
}
ISR(USART_RXC_vect)
{
unsigned char inData;
inData = UDR; //Read data register
if(UCSRB & (1<<RXB8)) //Address frame?
{
if((inData) == rx_address) //Verify address
{
UCSRA &= ~(1<<MPCM);//Disable MPCM filtering
bit_on(PORTC,4);
}
else // not our address, ignore any data
{
UCSRA |= (1<<MPCM);//Enable MPCM filtering
bit_off(PORTC,4);
}
bit_off(PORTC,3);
}
else //Data Frame received
{
bit_on(PORTC,3);
PORTB = inData;
UCSRA |= (1<<MPCM); //Enable MPCM
}
}