AT89C2051. Kann nichts empfangen

Gast #4376246
Hallo,

ich kommuniziere mit meinem AT89C2051 mit einem anderen µC über UART.
Die Baudrate liegt bei 9600.

Mein Problem ist, dass ich zwar vom AT89C2051 zum anderen µC Senden 
kann( und er empfängt es auch) allerdings kann ich keine Daten 
empfangen.

Ich hab am Pin des RX nachgeguckt und dort kommen die Daten richtig an.

mein Quellcode ist noch recht unvollständig, aber es geht ums Prinzip:

void Timer1_Init(void)
{
  TH1 = 0xFA;
  TL1 = TH1;                          // init Timer1
    TMOD &= ~0xf0;                      // TMOD: timer 1 in 8-bit 
autoreload
    TMOD |=  0x20;
  IE |= 0x08;      // Interrupt enablen
  TR1 = 1;                            // START Timer1
}

void UART_Init(void)
{
  SCON = 0x50;
  IE |= 0x10;
}

void UART_tx(unsigned char val)
{
  SBUF = val;
}


void UART_ISR(void) interrupt 4
{
  if(TI)
  {
    TI=0;
  }

  if(RI)
  {
    RI = 0;

    gewZuLED = 0xFF;

        //AnweisungsInterpreter(SBUF);
  }

}
#4376304
Tobias schrieb:
> mein Quellcode ist noch recht unvollständig

Das kannste aber laut sagen, da ist ja nichtmal ein main() drin.

Tobias schrieb:
> aber es geht ums Prinzip:

Nö, es geht immer erstmal um Compilierbarkeit!
Niemand hat Lust rumzuraten, was nun wirklich in Deinem Code steht, ob 
z.B. ein Include oder Typ falsch ist, ein Interrupthandler fehlt usw. 
usw..
Gast #4376350
Hallo Tobias,

gibst du Interrupts generell frei, also steht irgendwo im Code "EA = 1", 
oder "IE |= 0x80", oder Ähnliches? Sonst wird das nichts mit 
interruptgesteuerten Empfang.

Senden geht in deinem Programm auch ohne Interrupt.

Gruß. Tom
#4377673
Erstens: WO schaltest Du EA auf 1? Nur, weil Du endlos senden kannst, 
heißt das noch nicht, dass auch die ISR angesprungen wird. Du hast ja 
schließlich keine Abfrage von TI in deiner Senderoutine drin.
Zweitens: WO liest Du aus SBUF? Oder nimmst Du Zeichen=getchar( ); ?

EDIT:
1
  IE |= 0x08;      // Interrupt enablen
Macht nicht wirklich Sinn. Hier schaltest Du den Interrupt für den Timer 
1 frei, der macht aber die Baudrate, da ist der Interrupt eher 
uninteressant bis komplett falsch (bei Mode 2 und TH1 auf 0xFA immerhin 
alle 6 MZ ein Interrupt!!)

Mit
1
  IE |= 0x80;      // Interrupt enablen
würde EA wirklich auf 1 gesetzt werden...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 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.