Hi, ich habe erst vor kurzem angefangen mich für die Welt der AVRs zu interessieren. Schnell habe ich mir das hier erhältliche Boards inkl. ISP bestellt, sowie einen Atmel 90S4433. Ich entwickle in C mit WinAVR und progge meinen Chip mit PonyProg2000 unter Win NT. Ich habe 2 Probleme, bei denen ihr mir sicher helfen könnt, ist bestimmt nur 'ne Kleinigkeit. Wenn ich in meiner Main-Methode (nicht innerhalb einer Schleife!!!) einen Character ans UART sende, dann empfängt mein Hyperterminal dieses Zeichen andauernd, hört gar nicht mehr auf. Das gleiche passiert, wenn ich das Zeichen aus einer Methode heraus, die in der Main aufgerufen wird, schicken will. Schicke ich das Zeichen in einem Interrupt, dann funktioniert's wunderbar. Das 2. Problem ist, dass immer, wenn ein Zeichen aus diesem Interrupt gesendet wird, direkt die LED ausgeht. Ich schicke mal ein paar Codeauszüge mit... So schicke ich Zeichen ans UART: void uart_putchar(char c) { if (c == '\n') uart_putchar('\r'); loop_until_bit_is_set(UCSRA, UDRE); UDR = c; } Das ist mein Interrupt: SIGNAL(SIG_UART_RECV) { if(inp(UCSRA) & (1 << RXC)) { switch (inp (UDR)) { case '0': turnOffLEDC5(); break; case '1': turnOnLEDC5(); break; default: break; } uart_putchar(inp(UDR)); } } Meine Main: int main(void) { PORTC = 0xff; DDRC = 0xff; outp((1<<RXCIE) | (1<<TXCIE) | (1<<RXEN) | (1<<TXEN), UCSRB); outp(CONTROLLER_BAUD_RATE, UBRR); uart_putchar('x'); sei(); for(;;) { turnOnLEDC5(); delay(1000000); turnOffLEDC5(); delay(1000000); } return 0; } Bin für jede Hilfe dankbar, Dennis
Warum TXCIE = 1 ? Nimm das raus und es sollte gehen oder schreibe dafür eine extra SIGNAL-Routine. Ich hatte mal dasselbe Problem. Alex
Wie, eine extra Singal-Routine? Trotzdem muss ich doch beim Initialisieren den Interrupt aktivieren? Dennis
Wie Alexander schon geschriebnen hat: der TXC-Intterrupt wird aktiviert. Aber ich sehen keinen Interrupt-Handler fuer diesen. Was wohl passiert: - UART wird initialisiert - Zeichen wir gesendet - TXC Int Flag wird gesetzt (implizit) - Interrupts werden global aktiviert - da TXC Int-Flag gesetzt wird ein Sprung zur Adresse des entsp. Handlers ausgeloest. - Handler existiert nicht, Adresse laeuft ins Leere -> Reset - UART wird initialisiert .... usw. usw. also wohl: UCSRB=(1<<RXCIE) | (0<<TXCIE) | (1<<RXEN) | (1<<TXEN)
Wie oben geschrieben handelte es sich nur um Codefragmente, aber ihr habt wohl trotzdem Recht. :) Vielen Dank!!!
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.