Beim Interrupt Variable übergeben in die Main

Gast #2758350
Wir haben wieder ein kleines Problemchen. Wir machen ein Interrupt und 
initialisieren in diesem Interrupt eine Variable. Wenn wir dann 
allerdings wieder in unser main-Programm springen wird diese auf Eins 
gesetzt und der vorher initialisierte Wert wird überschrieben. Hat einer 
ne Idee was wir ändern könnten/müssen damits funktioniert?
Interrupt funktioniert, serielle Datenübertragung funktioniert, Display 
funktioniert, volatile und sonstige Varianten alles schon ausprobiert, 
alles läuft einwandfrei, nur die Variable will nich so wie wir wollen.
hier noch unser Quellcode:

#define F_CPU 12000000
#include <inttypes.h>
#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "lcd-routines.h"

#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1
#define CTS (PINB & 1)

/*Funktionsprototypen*/
void USART_Transmit( unsigned char data );
void USART_Init( unsigned int ubrr);
void Schreibe_in_Binaer(unsigned char test);

/*globale Variablen*/
unsigned char receive_old=0;
volatile unsigned char receive=1;

/*Interrupt*/
ISR(USART_RXC_vect)
{
  receive = UDR;
  lcd_setcursor(0,1);
  Schreibe_in_Binaer(receive);
}


/*Hauptprogramm*/
int main(void)
{
  DDRD = 0xF0;
  lcd_init();
    USART_Init( MYUBRR);
  sei();

  while(1)
  {
    /*Lauflicht*/
    PORTD = 0x80;
    _delay_ms(400);
    PORTD = 0x40;
    _delay_ms(200);
    PORTD = 0x20;
    _delay_ms(200);
    PORTD = 0x10;
    _delay_ms(400);
    PORTD = 0x20;
    _delay_ms(200);
    PORTD = 0x40;
    _delay_ms(200);
    USART_Transmit(0x53);
    //Befehl wird empfangen

    lcd_setcursor(0,2);
    Schreibe_in_Binaer(receive);

  }

  return 0;
}


void USART_Init( unsigned int ubrr)
{
/* Set baud rate */
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(1<<TXCIE);
/* Set frame format: 8data, 1stop bit */
UCSRC = (1<<URSEL)|(3<<UCSZ0);//(1<<USBS)|
}

void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( (!( UCSRA & (1<<UDRE)))|| CTS )
;
/* Put data into buffer, sends the data */
UDR = data;
}

//Ausgabe eines Bytes in Binärem Code
void Schreibe_in_Binaer(unsigned char test)
{
  int i;
  unsigned char schreib[9];
  for(i=0; i<8; i++)
  {
    if (test & 1<<(7-i))
    {
      schreib[i] = '1';
    }
    else
    {
      schreib[i] = '0';
    }
  }
  schreib[8]=0;
  lcd_string( schreib);
}
#2759113
Vermutlich macht der Controller immer einen Reset und "receive" wird 
dann logischer weise wieder auf 1 gesetzt.

Was passiert denn wenn du den Init-Wert von "receive" änderst?
> volatile unsigned char receive=123;

Ich schätze es steht dann immer 123 in receive? Wenn dem so ist, führt 
dein Controller wohl einen Reset durch.

Kommt wohl dann daher weil du "TXCIE" aktiviert hast aber keine passende 
ISR dazu.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.