Interrupts...

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
flouee
Inlägg: 2
Blev medlem: 6 april 2007, 13:17:14
Ort: göteborg
Kontakt:

Interrupts...

Inlägg av flouee »

Hej!
Jag försöker få en atmega32 att vid overflow på timer2 att skriva ut en liten text på datorskärmen (seriell kommunikation). Själva interruptrutinen fungerar så långt att jag får en diod att blinka. Så fort jag vill skriva ut något blir det dock problem och ingenting händer.

Koden för seriella kommunikationen kommer från http://hubbard.engr.scu.edu/avr/avrlib/ ... ource.html

I simuleringen i avrstudio fastnar man enligt nedan:

Kod: Markera allt

void uartSendByte(u08 txData)
{
	// wait for the transmitter to be ready
	while(!uartReadyTx); <=== Här
uartReadyTx sätts i UART_INTERRUPT_HANDLER(SIG_UART_TRANS), men detta verkar inte göras så fort jag aktiverat TIMSK (nedan). Någon som har en lösning på mitt problem?

Min kod:

Kod: Markera allt

int time_count = 0;
int count2;


ISR(TIMER2_OVF_vect){		// Interrupt function
	time_count++;

	if(time_count == 1000){
		rprintf("\n\r Interrupt!:");
		PORTD = 0xFF;
	}else if(time_count == 3000){
		PORTD = 0x00;
		time_count=0;
	}
}

int main(void){


 	uartInit();                 // initialize UART (serial port)
    uartSetBaudRate(9600);      // set UART speed to 9600 baud
    rprintfInit(uartSendByte);  // configure rprintf to use UART for output            
	PORTC = 0x1;        

	DDRD=0xFF; //output
	TCCR2 = 0b000001;	// TimerCounterControlRegister0 - Prescaler = 1
	TCNT2 = 0x00;		// TimerControl... counter start
	OCR2 = 0x00;	
	TIMSK = TIMSK | 0b01000000;
	sei(); 				// Enables interrupts

	while(1){
	}

	return 0;
}
flouee
Inlägg: 2
Blev medlem: 6 april 2007, 13:17:14
Ort: göteborg
Kontakt:

Inlägg av flouee »

Jag har kollat lite vidare på det, och det går att skriva ut något på seriella porten i while-snurran, samtidigt som dioden blinkar enligt ISR(TIMER2_COMP_vect).

Däremot stannar allt om jag lägger in rprintf("\n\r Interrupt"); i ISR-funktionen. Kan det vara så att den inte hinner skriva ut något innan nästa interrupt kommer och allting börjar på nytt? Hur löser jag det isf? Har testat med högsta precalern och att försöka fördröja nästa utskrift lång tid, utan framgång.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Upprepa efter mig:
"MAN FÅR ALDRIG NÅGONSIN VÄNTA PÅ NÅGOT I EN INTERRUPTRUTIN!"
Messa detta ca: 100 gg varje kväll den nästa månad!

Lösning:

Kod: Markera allt

int time_count = 0;
int count2;
char Flag;

ISR(TIMER2_OVF_vect)
  {      // Interrupt function
  time_count++;
  if(time_count == 1000)
    {
    Flag = 1;    
    PORTD = 0xFF;
    }
  else if(time_count == 3000)
    {
    PORTD = 0x00;
    time_count=0;
    }
  }

int main(void)
  {
  Flag = 0;
  uartInit();                 // initialize UART (serial port)
  uartSetBaudRate(9600);      // set UART speed to 9600 baud
  rprintfInit(uartSendByte);  // configure rprintf to use UART for output           
  PORTC = 0x1;       
  DDRD=0xFF; //output
  TCCR2 = 0b000001;   // TimerCounterControlRegister0 - Prescaler = 1
  TCNT2 = 0x00;      // TimerControl... counter start
  OCR2 = 0x00;   
  TIMSK = TIMSK | 0b01000000;
  sei();             // Enables interrupts
  while(1)
    {
    if(Flag)
      {
      Flag = 0;    
      rprintf("\n\r Interrupt!:");
      }
    }
  }
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

>> flouee

Vanliga nybörjarfelet när det gäller interrupt, näst efter att glömma aktivera global interrupt :wink:

Icecap har naturligtvis helt rätt, använd aldrig en programloop i en ISR!

Du kan lösa det på ett annat sätt än med flagga om du skaffar dig ett UART-bibliotek med en ringbuffert.
Skriv svar