Sida 2 av 2

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

Postat: 21 januari 2009, 13:47:23
av speakman
Var det typon cykze hittade som var problemet?

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

Postat: 21 januari 2009, 13:57:53
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:

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

Postat: 21 januari 2009, 14:44:52
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)

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

Postat: 22 januari 2009, 10:49:59
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.

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

Postat: 22 januari 2009, 12:45:27
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.

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

Postat: 22 januari 2009, 13:03:41
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:

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

Postat: 22 januari 2009, 13:12:37
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.

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

Postat: 25 januari 2009, 00:36:17
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++){
		}
	}
};