AVR ATmega168 - Probleme mit Interrupt bei UART Empfang

OP #1532590
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 
;)
Angehängte Dateien:
#1533563
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?
OP #1533713
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.
#1534120
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).
#1534605
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren