Interruptdriven läsning av USART ATtiny2313 med avr-gcc?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: Interruptdriven läsning av USART ATtiny2313 med avr-gcc?

Inlägg av speakman »

Var det typon cykze hittade som var problemet?
Användarvisningsbild
manw
Inlägg: 207
Blev medlem: 16 november 2005, 11:16:17
Ort: Södermalm

Re: Interruptdriven läsning av USART ATtiny2313 med avr-gcc?

Inlägg av manw »

Japp, uppenbarligen så tittade jag i fel headerfil :oops:

Nu finns hursomhelst koden där med rättning för den som vill använda den :wink:
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: Interruptdriven läsning av USART ATtiny2313 med avr-gcc?

Inlägg av stekern »

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)
hatten
Inlägg: 94
Blev medlem: 9 maj 2008, 22:16:23
Ort: Uppsala

Re: Interruptdriven läsning av USART ATtiny2313 med avr-gcc?

Inlägg av hatten »

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.
SvenW
Inlägg: 1156
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: Interruptdriven läsning av USART ATtiny2313 med avr-gcc?

Inlägg av SvenW »

> 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.
Användarvisningsbild
manw
Inlägg: 207
Blev medlem: 16 november 2005, 11:16:17
Ort: Södermalm

Re: Interruptdriven läsning av USART ATtiny2313 med avr-gcc?

Inlägg av manw »

hatten 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.
Aha, processorspecifikt, vad smidigt. Jag försökte titta i nån lista i avr-gcc manualen, och det blev fel :twisted:
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 :wink:
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: Interruptdriven läsning av USART ATtiny2313 med avr-gcc?

Inlägg av speakman »

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.
Användarvisningsbild
manw
Inlägg: 207
Blev medlem: 16 november 2005, 11:16:17
Ort: Södermalm

Re: Interruptdriven läsning av USART ATtiny2313 med avr-gcc?

Inlägg av manw »

Lägger den fungerande koden nedan 8)

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