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); } }
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..
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
Hallo, ja der geht auch in den Interrupt rein falls das TI-Bit gesetzt ist. MfG
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.