Interruptdriven läsning av USART ATtiny2313 med avr-gcc?
Re: Interruptdriven läsning av USART ATtiny2313 med avr-gcc?
Var det typon cykze hittade som var problemet?
Re: Interruptdriven läsning av USART ATtiny2313 med avr-gcc?
Japp, uppenbarligen så tittade jag i fel headerfil
Nu finns hursomhelst koden där med rättning för den som vill använda den

Nu finns hursomhelst koden där med rättning för den som vill använda den

Re: Interruptdriven läsning av USART ATtiny2313 med avr-gcc?
Fint att det löste sig!
En kommentar till varför det var så att "det ibland kom varning, ibland inte".
Det berodde säkert på att du inte gjort några ändringar i den filen mellan kompileraringarna,
tar du inte 'rebuild all' så kompilerar den bara filer som du gjort ändringar i (sanning med modifikation, men i stort sett)
En kommentar till varför det var så att "det ibland kom varning, ibland inte".
Det berodde säkert på att du inte gjort några ändringar i den filen mellan kompileraringarna,
tar du inte 'rebuild all' så kompilerar den bara filer som du gjort ändringar i (sanning med modifikation, men i stort sett)
Re: Interruptdriven läsning av USART ATtiny2313 med avr-gcc?
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.
Re: Interruptdriven läsning av USART ATtiny2313 med avr-gcc?
> grotta ner sig i headerfiler - på gott och ont
Mest på gott, skulle jag vilja säga!
Problemet med dokumentation är att den inte alltid stämmer. Headerfilerna och källkoden stämmer för det mesta om man bara att hittar rätt!
Om man tycker det är jobbigt har väl att göra med vana och verktyg. Jag använder så gott som utestlutande Emacs och tror kanske att 'GUI' är mest bjäfs. Det gäller i vilket fall att lägga tid på att konfigurera sina verktyg så att arbetet blir effektivt.
Om jag vill veta hur ett makro ser ut sätter jag bara musen på makroanropet, trycker på en musknapp/modifierare/snabbtangent och har makrodefinitionen på 0.1 sekunder. På samma sätt med all annan dokumentaion, vare sig den finns i headerfiler, källkod, manual-, info- eller html-filer.
Eftersom jag har ett AVR-system konfigurerat så tog det mig inte fem sekunder att konstatera att USART_RXC_vect inte finns!
Jag rekommenderar Emacs för alla som programmerar seriöst. För ett enstaka hobbyprojekt kanske det inte lönar sig att lära sig den dock. Det tar ett tag, tyvärr.
Mest på gott, skulle jag vilja säga!
Problemet med dokumentation är att den inte alltid stämmer. Headerfilerna och källkoden stämmer för det mesta om man bara att hittar rätt!
Om man tycker det är jobbigt har väl att göra med vana och verktyg. Jag använder så gott som utestlutande Emacs och tror kanske att 'GUI' är mest bjäfs. Det gäller i vilket fall att lägga tid på att konfigurera sina verktyg så att arbetet blir effektivt.
Om jag vill veta hur ett makro ser ut sätter jag bara musen på makroanropet, trycker på en musknapp/modifierare/snabbtangent och har makrodefinitionen på 0.1 sekunder. På samma sätt med all annan dokumentaion, vare sig den finns i headerfiler, källkod, manual-, info- eller html-filer.
Eftersom jag har ett AVR-system konfigurerat så tog det mig inte fem sekunder att konstatera att USART_RXC_vect inte finns!
Jag rekommenderar Emacs för alla som programmerar seriöst. För ett enstaka hobbyprojekt kanske det inte lönar sig att lära sig den dock. Det tar ett tag, tyvärr.
Re: Interruptdriven läsning av USART ATtiny2313 med avr-gcc?
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.

EDIT: Funderade på om jag skulle ändra min kod i tråden så att den fungerande koden ligger där, jag ändrade lite till sedan, så blev det riktitgt bra

Re: Interruptdriven läsning av USART ATtiny2313 med avr-gcc?
Eller lägg nya rätta koden i ett nytt inlägg och gör en notis+länk i första inlägget i tråden.
Re: Interruptdriven läsning av USART ATtiny2313 med avr-gcc?
Lägger den fungerande koden nedan

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++){
}
}
};