Re: Interruptdriven läsning av USART ATtiny2313 med avr-gcc?
Postat: 21 januari 2009, 13:47:23
Var det typon cykze hittade som var problemet?
Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
Aha, processorspecifikt, vad smidigt. Jag försökte titta i nån lista i avr-gcc manualen, och det blev felhatten skrev:Jag antar att detta inte kommer som någon nyhet för de flesta, men i dokumentationen för avr-libc finns en lista över alla interruptvektorer som är relativt smidig att använda. Då slipper man i alla fall grotta ner sig i headerfiler - på gott och ont.
Kod: Markera allt
//Serial communication example for Attiny2313 and avr-gcc.
//Mats Nordwinger 2009-01-25, Released - Under GPL 8)
#include <avr/io.h>
#include <avr/interrupt.h>
// Prototypes
void InitUSART (unsigned char baudrate);
void InitInterrupt();
void WriteString(char *car);
unsigned char ReceiveByte (void);
void TransmitByte (unsigned char data);
void Delay(int msek);
// Interrupt on input buffer byte complete.
ISR(USART_RX_vect){
TransmitByte (ReceiveByte () + 1); // Echo the received character + 1.
PORTB |= (0x01 << 0); // LED on, to indicate recieved char.
}
// Main program
int main (void){
char hello[] = "Hello World! ";
InitUSART (207); // Set the baudrate to 2400 bps using 8MHz
InitInterrupt();
DDRB=0xFF; //Assign portB to output
PORTB=0x00; //All portB bits to zero
while (1){
// Blink LED, just to tell someting's going on
Delay(500);
PORTB |= (0x01 << 0);
Delay(500);
PORTB &= ~(0x01 << 0);
WriteString(hello);
TransmitByte(0x0A); // LF
TransmitByte(0x0D); // CR
}
} // End main program
// Initialize USART
void InitUSART (unsigned char baudrate){
// Set the baud rate
UBRRL = baudrate;
//Enable Transmitter and Receiver and Interrupt on receive complete
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
// 8 data bits, 1 stop bit
UCSRC = (1 << UCSZ1) | (1 << UCSZ0);
}
// Enable global interrupt.
void InitInterrupt(){
cli(); //Disable interrupt
sei(); //Enable interrupt
}
// This function sends strings to USART
void WriteString(char *car){
while(*car != '\0'){
TransmitByte(*car);
car++;
}
}
// Read USART incoming data
unsigned char ReceiveByte (void){
// Wait for incomming data
while (!(UCSRA & (1 << RXC)));
// Return the data
return UDR;
}
// Write data to USART outpu buffer
void TransmitByte (unsigned char data){
// Wait for empty transmit buffer
while (!(UCSRA & (1 << UDRE)));
// Start transmission
UDR = data;
}
//Delay "calibrated" for 8MHz
void Delay(int msek){
unsigned int i=0, j=0;
for(j=0;j<msek;j++){
for(i=0;i<350;i++){
}
}
};