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

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

// 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;

}

 

Добавить комментарий


Защитный код
Обновить