www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Interrupt


Autor: Christian S (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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';
}

Autor: Christian S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
handelt sich übrigens um einen Tiny2313

Autor: Christian S (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.