mikrocontroller.net

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


Autor: Sören K. (burnersk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 
;)

Autor: Sören K. (burnersk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Neben bei: er sendet auch nichts o.O

Autor: Sören K. (burnersk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Christopher G. (cbg)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sören K. (burnersk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christopher G. (cbg)
Datum:

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

ISR( USART_RX_vect )
{
  /* TODO: do sth.  */
  PORTC ^= _BV( PC2 ); /* debug: enable green led  */

  unsigned char c;
  c = uart_getc(); /* get received byte  */
  if( c == 'v' )
    uart_puts( welcomeMsg ); /* transmit "Hello, this is myAVR!"  */
  else
    uart_putc( c ); /* return only the received byte  */
}
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?
/* include librarys  */
#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).

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sören K. (burnersk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christopher G. (cbg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das
#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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.