Forum: Mikrocontroller und Digitale Elektronik AT89C2051. Kann nichts empfangen


von Tobias (Gast)


Lesenswert?

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);
  }

}

von Peter D. (peda)


Lesenswert?

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..

von TomA (Gast)


Lesenswert?

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

von Tobias (Gast)


Lesenswert?

Hallo,

ja der geht auch in den Interrupt rein falls das TI-Bit gesetzt ist.

MfG

von Bernhard S. (b_spitzer)


Lesenswert?

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...

: Bearbeitet durch User
von Tobias (Gast)


Lesenswert?

Hallo,

danke, ich hab die Freigabe des Interrupts für den Timer1 zurückgezogen 
und nun funktionierts.

MfG Tobias

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.