Данный пример иллюстрирует работу с модулями USART (UART) и SPI. Программа написана на CИ и откомпиллирована в WinAVR. Микроконтроллер выбран AT90USB162, прошивается по usb c помощью программатора Flip. При использовании других микроконтроллеров необходимо внести изменения в makefile — прописать микроконтроллер и частоту резонатора.
Скорость COM порта определяется #define USART_SPEED.
{codecitation class=»brush: vb; gutter: true;» width=»700px» }
// SPI AT90USB162
// XTAL = 1MHZ
#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>
#include <avr/interrupt.h>
#define USART_SPEED 4800
#define BAUD ((F_CPU/(USART_SPEED*16UL)) — 1)
//typedef unsigned char byte;
#define MOSI DDB2
#define SCK DDB1
#define SS DDB0
// prototypes
void spi_transmit(unsigned char data);
unsigned char spi_receive(void);
void frame_usart_transmit(void);
void usart_transmit(unsigned char data);
// global variables
unsigned char temp;
void spi_init(void){
DDRB = 0b11110111; // all outputs, MISO — input
SPCR = (0<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<CPOL)|(0<<SPR1)|(1<<SPR0); //!! spi int not enable, master OSC/16 polarity1-0
}
void usart_init(void){
UBRR1H = (unsigned char)(BAUD >> 8);
UBRR1L = (unsigned char)BAUD;
UCSR1B = (0<<RXCIE1)|(0<<TXCIE1)|(1<<RXEN1)|(1<<TXEN1); // int disable, TX & RX ENABLE
UCSR1C = (1<<UCSZ11)|(1<<UCSZ10); // 8bit, parity none, 1stop bit
}
void spi_transmit(unsigned char data){
SPDR = data;
while(!(SPSR & (1<<SPIF))){ // wait until transmitting
}
_delay_ms(5); // delay
}
unsigned char spi_receive (void){
SPDR = 0x00;
while(!(SPSR & (1<<SPIF))){ // wait until transmitting
};
return SPDR;
}
int main (void){
int i;
DDRD = 0b11111110; // int0 — input rx — input
PORTD = 0b00000001; // pull up resistor
for (i=0; i<10; i++){
PORTD ^=0b00000010;
_delay_ms(200);
}
PORTD &=0b11111101;
PORTD |=0b00000010;
usart_init();
for(i=0; i<400; i++){
PORTD ^= 0b00010000; // buzzer
_delay_ms(1);
}
usart_transmit(‘R’);
usart_transmit(‘A’);
usart_transmit(‘D’);
usart_transmit(‘I’);
usart_transmit(‘O’);
usart_transmit(‘D’);
usart_transmit(‘D’);
usart_transmit(‘E’);
usart_transmit(‘D’);
usart_transmit(‘ ‘);
usart_transmit(‘!’);
usart_transmit(‘!’);
usart_transmit(‘!’);
for(i=0; i<400; i++){
PORTD ^= 0b00010000; // buzzer
_delay_ms(1);
}
while(1){
};
}
void usart_transmit(unsigned char data){
while(!(UCSR1A & (1<<UDRE1))){ // UDRE1 = 1 if ready for transmit
}
UDR1 = data;
}
unsigned char usart_reseive(void){
while(!(UCSR1A & (1<<RXC1))){ // RXC1 = 1 if unread data
}
return UDR1;
}
{/codecitation}