Forum: Mikrocontroller und Digitale Elektronik Probleme mit Interrupt


von Christian S (Gast)


Lesenswert?

Hallo,
habe problem mit meinem Programm:
Das Zeichen "1" wird korrekt übertragen, aber beim betätigen einer
Taste werden nur irgendwelche zufälligen Zeichen übertragen, woran kann
das liegen? Habe auch schon ausprobiert das Zeichen direkt in der ISR zu
senden -> hat noch weniger geklappt, da wurden ganze Strings mit
zufälligen zeichen übertragen :-(

Code:

#include <inttypes.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/io.h>
#include <avr/sleep.h>

#ifndef F_CPU
   #define F_CPU 4000000UL           /* Oszillator-Frequenz in Hz */
#endif

volatile uint8_t taste;

/* Funktionsprototypen */
/***********************/
void USART_Init(uint16_t baud);
void USART_Transmit(uint8_t data);

/* Hauptprogramm */
/*****************/
int main(void)
{
   DDRD &=~((1<<PD2) | (1<<PD3)); // INT0 und INT1 sind Eingänge
   PORTD |= (1<<PD2) | (1<<PD3);  // INT0 und INT1 interne Pullup
   set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // Sleepmode: Powerdown
   USART_Init(25);                     // USART mit 9600Baud
   USART_Transmit('1');
   GIMSK |= (1<<INT1) | (1<<INT0);      // INT0 und INT1 aktivieren
   MCUCR |= (1<<SE);      // Sleep-Enable
   MCUCR &=~((1<<ISC11) | (1<<ISC10) | (1<<ISC01) | (1<<ISC00));
//INT1 und INT0 auf Lowlevel

   do
   {
          sei();
    sleep_mode();
          USART_Transmit(taste);
   }while(1);

   return(0);
}


/* Funktionen */
/**************/

void USART_Transmit(uint8_t data)
{
   /* Wait for empty transmit buffer */
   while ( !( UCSRA & (1<<UDRE)) );

   /* Put data into buffer, sends the data */
   UDR = data;
}


void USART_Init(uint16_t baud)
{
   /* Set baud rate */
   UBRRH = (unsigned char)(baud>>8);
   UBRRL = (unsigned char)baud;

   /* Enable transmitter */
   UCSRB = 1<<TXEN;

   /* Set frame format: 8data, 1stop bit */
   UCSRC = (1<<USBS)|(3<<UCSZ0);
}


/* Interrupts */
/**************/

/* Unbelegte Interrupts ignorieren */
EMPTY_INTERRUPT(__vector_default);

INTERRUPT(SIG_INT0)
{
   taste = 'x';
}

INTERRUPT(SIG_INT1)
{
   taste = 'y';
}

von Christian S (Gast)


Lesenswert?

handelt sich übrigens um einen Tiny2313

von Christian S (Gast)


Lesenswert?

Hat sich erledigt, habe nah "USART_Transmit(taste);" ein delay von
15ms, jetzt funktioniert es!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.