Forum: Mikrocontroller und Digitale Elektronik AVR ATmega168 - Probleme mit Interrupt bei UART Empfang


von Sören K. (burnersk)


Angehängte Dateien:

Lesenswert?

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

von Sören K. (burnersk)


Lesenswert?

Neben bei: er sendet auch nichts o.O

von Sören K. (burnersk)


Angehängte Dateien:

Lesenswert?

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.

von Christopher G. (cbg)


Lesenswert?

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?

von Sören K. (burnersk)


Lesenswert?

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.

von Christopher G. (cbg)


Lesenswert?

Sören K. schrieb:
> Warum, ist doch ne normale Darstellung.
Der GCC versteht das aber idR nicht. Gepatcht oder WinAVR?

1
ISR( USART_RX_vect )
2
{
3
  /* TODO: do sth.  */
4
  PORTC ^= _BV( PC2 ); /* debug: enable green led  */
5
6
  unsigned char c;
7
  c = uart_getc(); /* get received byte  */
8
  if( c == 'v' )
9
    uart_puts( welcomeMsg ); /* transmit "Hello, this is myAVR!"  */
10
  else
11
    uart_putc( c ); /* return only the received byte  */
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
/* include librarys  */
2
#include      "uart.c"
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).

von Hc Z. (mizch)


Lesenswert?

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.

von Sören K. (burnersk)


Lesenswert?

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

von Christopher G. (cbg)


Lesenswert?

Das
1
#include "uart.c"
 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.

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.