Hallo, anscheint bin ich leider in Sachen Interrupts blind; ich finde den Fehler in meinem Code nicht. Und zwar soll ein Interrupt beim vollständigen Empfang von einem Byte via UART ausgelöst werden. Da muss ja zusätzliche im UCSR0B-Register RXCIE0 gesetzt werden. Schön und gut, aber zumindest nimmt die ISR USART_RX_vect den Interrupt nicht entgegen. Das was ankommt, habe ich mit einem Speaker am RXD Pin überprüft, dieser knattert schon ordentlich :) Nur löst der Interrupt nicht aus :( Läuft auf einer Atmel AVR ( ATmega168 ) und wurde mit avr-gcc kompiliert. Edit: rote und grüne LED leuchten, also müssen Interrupts funktionierten ;)
Neben bei: er sendet auch nichts o.O
Hallo, ich habe es jetzt geschafft, die UART fast richtig zu initialisieren. Jetzt ist nur noch das Problem, dass der Client das empfangende vom Board nicht darstellen kann. minicom ist aber auf 9600 8N2 eingestellt.
Dein welcomeMsg[] und secondMsg[] sitzen im Flash. Du übergibts welcomeMsg und secondMsg an uart_puts aber dort liest du sie nicht aus dem Flash aus. Behebe das mal. Edit: Was für einen GCC verwendest du denn, dass er z.B. bei DDRD = 0b00000000; nicht schreit? Warum nicht auch hier _BV oder hex Werte?
Christopher G. schrieb: > Dein welcomeMsg[] und secondMsg[] sitzen im Flash. Du übergibts > welcomeMsg und secondMsg an uart_puts aber dort liest du sie nicht aus > dem Flash aus. Behebe das mal. danke für den Tip. Das behebt aber nicht den Fehler, dass er das Zeichen nicht zurücksendet, wenn kein "v" gedrückt worden ist. Da steht quasi sende das empfangende Zeichen zurück. TXD und RXD knattern ja (getrennte Speaker an den Pins) was das Ueug hält. > > Edit: Was für einen GCC verwendest du denn, dass er z.B. bei DDRD = > 0b00000000; nicht schreit? Warum nicht auch hier _BV oder hex Werte? Warum, ist doch ne normale Darstellung. Wenn man von rechts nach links lesen kann, wie man es in dem Business auch beherrschen sollte ;) Aber um die Antwort zu geben: avr-gcc/4.1 (wie im Quelltext steht) und so sieht man in alle kürze die Würze. Hex müsste man noch "umrechnen" und _BV ist hier ein bisschen overkill finde ich.
Sören K. schrieb: > Warum, ist doch ne normale Darstellung. Der GCC versteht das aber idR nicht. Gepatcht oder WinAVR?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
Das uart_getc() ist hier unnötig. Du bist bereits in der RX ISR, da reicht ein einfaches "c = UDR0;". Weiß jetzt grad nicht, wann das Flag gelöscht wird aber es in der ISR zu pollen ist Blödsinn. Bist du dir ausserdem sicher, dass du beim ISR basierten Senden (was jetzt nicht implementiert ist) den TXC Interrupt und nicht den UDRE Interrupt aktivieren willst?
1 | |
2 | |
Ouch! Mach das mal schleunigst wieder raus und kompilier das als eigenes Modul! main.c zu einem Objekt kompilieren, uart.c zu einem Objekt kompilieren, dann beide zur .elf zusammenlinken. Poste dann auch mal den neuesten Stand des Codes und auch das Makefile (sofern eins existiert).
Christopher G. schrieb: [0b00000] >> Warum, ist doch ne normale Darstellung. > Der GCC versteht das aber idR nicht. Gepatcht oder WinAVR? Der gcc versteht das seit geraumer Zeit ohne jeden Patch. Es ist aber nicht ANSI C.
Leute, tut mir leid. Die Lösung ist ganz eine Andere. Einfach nicht mit LPT, sondern mit qualifizierter Spannung arbeiten. Ich hab gerade "aus versehen" mein Netzteil eingesteckt und auf einmal fängt minicom an zu rattern. FACEPALM
Das
1 | |
nimmst du aber bitte trotzdem raus und kompilierst einzelne Module, die du dann zusammenlinkst. Mit der option "-c" kompilierst du die Quelldatei zu einem Objekt. Danach kannst du bei nochmaligen aufruf von gcc (ist auch der Linker) die einzelnen Objektdateien zusammenlinken.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.