Ср июл 03, 2019 19:40:35
#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define BUFFER_SIZE 128
#define StartTransmit_SET_OUTPUT DDRA |= (1 << 0)
#define StartTransmit_LOW PORTA |= (1 << 0)
#define StartTransmit_HIGH PORTA &= ~(1 << 0)
#define LED_SET_OUTPUT DDRA |= (1 << 4)
#define LED_LOW PORTA |= (1 << 4)
#define LED_HIGH PORTA &= ~(1 << 4)
volatile unsigned char slaveID = 50;
unsigned char frame[BUFFER_SIZE];
unsigned char funktion=1;
bool broadcastFlag=0;
void USART_Init()
{
UBRR0H = 0;
UBRR0L = 6;
UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}
unsigned int calculateCRC(uint8_t bufferSize)
{
unsigned int temp, temp2, flag;
temp = 0xFFFF;
for (unsigned char i = 0; i < bufferSize; i++)
{
temp = temp ^ frame[i];
for (unsigned char j = 1; j <= 8; j++)
{
flag = temp & 0x0001;
temp >>= 1;
if (flag)
temp ^= 0xA001;
}
}
temp2 = temp >> 8;
temp = (temp << 8) | temp2;
temp &= 0xFFFF;
return temp;
}
void USART_Transmit( unsigned char data )
{
StartTransmit_LOW;
_delay_ms(5);
while ( !( UCSR0A & (1<<UDRE0)) );
UDR0 = data;
_delay_ms(5);
StartTransmit_HIGH;
_delay_ms(5);
}
void USART_Transmit_String()
{
int i=0;
unsigned char c = frame[0];
while(c != '\0')
{
c = frame[i];
if(c!='\0') {USART_Transmit(c);}
i++;
}
}
void exceptionResponse(unsigned char exception)
{
if (!broadcastFlag)
{
frame[0] = slaveID;
frame[1] = (funktion | 0x80);
frame[2] = exception;
unsigned int crc16 = calculateCRC(3);
frame[3] = crc16 >> 8;
frame[4] = crc16 & 0xFF;
USART_Transmit_String();
}
}
ISR (USART0_RX_vect)
{
while ( !(UCSR0A & (1<<RXC0)) );
slaveID = UDR0;
}
int main(void)
{
USART_Init();
StartTransmit_SET_OUTPUT;
LED_SET_OUTPUT;
LED_LOW;
sei();
while(1)
{
exceptionResponse(2);
_delay_ms(5000);
}
}
Ср июл 03, 2019 20:11:57
Ср июл 03, 2019 20:33:23
Ср июл 03, 2019 23:01:13
Чт июл 04, 2019 15:00:27