PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AT90USB1287 Interrupt



Kampi
20.02.2014, 15:43
Hallo Forum,

ich will gerade die Interrupts von meinem AT90USBKey verwenden und habe mir Testweise ein Programm geschrieben, was mir eine Meldung ausgibt wenn ein Interrupt aktiviert wurde.
Im Moment löse ich die Interrupts über den verbauten Joystick aus, aber nach einer bestimmten Anzahl an Interrupts reagiert der Mikrocontroller nicht mehr. Die Anzahl ist dabei aber immer Unterschiedlich...
Weiß jemand woran das liegen kann?

Mein Code ist folgender;


/*
* Interrupt.c
*
* Created: 20.02.2014 07:15:06
* Author: Daniel.KAmpert
*/


#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "uart.h"


void Setup(void);


ISR(INT4_vect)
{
uart_puts("INT4 Interrupt!\n\r");
}


ISR(INT5_vect)
{
uart_puts("INT5 Interrupt!\n\r");
}


int main()
{
Setup();


for (;;)
{

}
}


void Setup(void)
{
// UART initialisieren
uart_init(UART_BAUD_SELECT(57600, 8000000));

// IO als Ausgang einstellen
DDRE &= (0<<DDE4) & (0<<DDE5);

// Pull-up Widerstände einschalten
PORTE |= (1<<PE4) | (1<<PE5);

// Interrupt bei fallender Flanke
EICRB = (1<<ISC41) | (0<<ISC40) | (1<<ISC41) | (0<<ISC40);

// Interrupts aktivieren
EIMSK = (1<<INT4) | (1<<INT5);

// Globale Interrupts freigeben
sei();
}


Danke für die Hilfe!

sternst
20.02.2014, 22:25
Weiß jemand woran das liegen kann?
Vermutlich daran, dass du eine UART-Lib verwendest, die mit einem Puffer und Interrupt gesteuertem Senden arbeitet (Fleury?).

Kampi
20.02.2014, 22:27
Vermutlich daran, dass du eine UART-Lib verwendest, die mit einem Puffer und Interrupt gesteuertem Senden arbeitet (Fleury?).

Ja genau die verwende ich.
Aber müsste der Controller dann nicht wieder einsteigen?

sternst
20.02.2014, 23:32
Ja genau die verwende ich.
Aber müsste der Controller dann nicht wieder einsteigen?Was passiert, wenn im Puffer nicht mehr genug Platz für den zu sendenden String ist? Dann wartet die Lib bis wieder Platz ist. Da du aber aus einem Interrupt heraus sendest, sind Interrupts zu diesem Zeitpunkt deaktiviert.
Keine Interrupts -> kein Senden aus dem Puffer -> kein Platz im Puffer wird frei -> Warten für immer

Kampi
21.02.2014, 08:31
Hey,

mmh super. Dann muss ich mir mal eine Lösung basteln...eventuell ohne Interrupt, weil das Senden sowieso nicht Zeitkritisch ist.
Hab es gestern dann auch mal mit einer LED verwenden. Da klappt es problemlos, von daher scheint das wirklich das Problem zu sein.
Vielen Dank für die Hilfe :)