Данный пример иллюстрирует работу с модулями USART (UART) и SPI. Программа написана на CИ и откомпиллирована в WinAVR. Микроконтроллер выбран AT90USB162, прошивается по usb c помощью программатора Flip. При использовании других микроконтроллеров необходимо внести изменения в makefile – прописать микроконтроллер и частоту резонатора.

Программа печатает по Com порту сообщение “RADIODED !!!”.
Скорость COM порта определяется #define USART_SPEED.
Скорость работы с com-портом задана 4800 бит/с.
Код программы:

{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}

Просмотров всего: 31, сегодня: 1

Напишите комментарий