PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] UART Interrupt Empfangsproblem FTDI 232



chrisavr1981
12.01.2014, 11:34
Hallo zusammen,

ich stehe völlig auf dem Schlauch, ich sitze hier mit einem Atmega 8 und versuche nur die über UART übergebenen Zeichen wieder auszugeben.
Doch leider gelingt mir nur das Empfangen von Zeichen vom µC -> PC, aber nicht das Empfangen vom PC -> µC.



#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define F_CPU 7372800UL
#define BAUD 9600
#define UBRR_VAL F_CPU/16/BAUD-1

volatile unsigned char receive_char;

ISR(USART_RXC_vect)
{
receive_char = UDR;
UDR = receive_char;
PORTB &=~ (1<<PB1);
_delay_ms(300);
}

void init_uart(unsigned int ubrr)
{
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)(ubrr);
UCSRA = (1 << RXC) | (1 << TXC);
UCSRB = (1 << RXEN) | (1 << TXEN) | (1<<RXCIE);
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
}

void send_char(unsigned char data)
{
while (!(UCSRA & (1<<UDRE)));
UDR = data;
}

void send_string(char *data)
{
while (*data)
{
send_char(*data);
data++;
}
}

int main(void)
{
DDRB |= (1<<PB1);
init_uart(UBRR_VAL);
send_string("TESTING");
sei();
PORTB |= (1<<PB1);
_delay_ms(500);
PORTB &=~ (1<<PB1);
while (1)
{
}
return 0;
}


Es sieht so aus, als würde die ISR RXC Interruptfunktion nie aufgerufen werden.

Ich weiß, dass man keine _delay Funktion in eine Interruptfunktion einbaut, aber ich suche schon sehr lange nach dem Fehler und bekomme diesen nicht raus.
Damit ich sehe, dass das Script auf diesem µC überhaupt bis zur while Schleife läuft, lasse ich schon einmal einen Text auf UART ausgeben, den sehe ich auch schon im Terminal, und auch die LED leuchtet einmal kurz vor sich hin.
Interessant ist auch, dass die LEDs am FTDI 232 auch bei der Eingabe auf der Tastatur kurz aufleuchten.

Der µC ist tatsächlich mit einem externen Quarz 7,3728 versehen und wie folgt habe ich die Fuse Bits gesetzt: -U lfuse:w:0xdf:m -U hfuse:w:0xd9:m.
Wie Ihr jetzt auch sehen könnt, nutze ich avrdude auf einem Linux und mein Terminalfenster ist Minicom.

Was mache ich falsch, ich denke mal ich sehe den Wald vor lauter Bäumen nicht.
Entschuldigt die Dumme Frage nach UART.

Vielen Dank!

markusj
12.01.2014, 12:15
Es sieht so aus, als würde die ISR RXC Interruptfunktion nie aufgerufen werden.
Stimmt die Verdrahtung, sprich: Geht TXD vom FTDI232 auch zu RXD am AVR? Manchmal scheitert es an solchen Kleinigkeiten ;)

Ach ja, dein Testcode ist wenig aussagekräftig, da du die LED nach 500ms in Main ausschaltest. Die ISR schaltet also selbst wenn du etwas empfängst du eine ausgeschaltete LED nochmal aus! Verwende statt dessen Mal folgenden Code:

PORTB ^= (1<<PB1);

mfG
Markus

chrisavr1981
12.01.2014, 15:11
Hallo Markus,

zu 1.
zu allem Überfluss habe ich noch diesen Fehler reingebaut mit dem Low-Schalten des Ports PB1.
Das ist jetzt korrigiert. Leider funktioniert das ganze immer noch nicht.

zu 2.
Können die Anschlüsse immer noch vertauscht sein, wenn ich das gesendete vom µC im Terminal angezeigt bekomme?

Das Register RXCIEN habe ich umgeändert zu RXCIE - ich werde nochmals das Datenblatt studieren.
Was ich auch schon gemacht habe, direkt nur mit Software gearbeitet, es funktioniert trotzdem nicht.

Wsk8
12.01.2014, 15:38
void init_uart(unsigned int ubrr)
{
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)(ubrr);
UCSRA = (1 << RXC) | (1 << TXC);
UCSRB = (1 << RXEN) | (1 << TXEN) | (1<<RXCIE);
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
}

Das ist ein Status Register, da solltest du nix reinschreiben. Ansonsten konnte ich jetzt keine Fehler entdecken.

mfg

chrisavr1981
12.01.2014, 15:54
Hallo Wsk8.

danke für den Hinweis.
Wenn ich doch in meinem Terminal etwas reinschreibe wie beispielsweise: t, solle doch ein t oder irgendetwas zurückkommen oder?
Kann es vielleicht doch an den Fuse Bits liegen?

- - - Aktualisiert - - -


MUSST bzw. willst Du da ne eigene Routine schreiben (wollte ich auch mal). Wenn nicht, dann kann ich die Bibliothek von Peter Dannegger (klick) wärmstens empfehlen. Für den mega8 könnte es sein, dass Du die Puffergröße(n) anpassen wirst. Das Dingelchen läuft mit FIFO, interruptgetrieben, und ich betreibe es fast nur noch ausschließlich für die Kommunikation PC-µC, µC-PC und µC-µC. Bei µC-µC fahre ich mittlerweile mit meinen mega328 oder 1284 bei 20 MHz störungsfrei mit bis zu 1,2 MBd.

Genau das ist es, ich möchte mal, auch nur sowas einfaches wie dieses hier, alleine hinbekommen.
Ich scheitere an den einfachsten dingen. <kopfschüttel>

Wsk8
12.01.2014, 16:22
Hab die eine Zeile entfernt und den Code selbst getestet.
Hab nur 1Mhz und 2400B verwendet, da ich nicht auf 8MHz umstellen wollte. Hat alles einwandfrei funktioniert!!!

mfg

markusj
12.01.2014, 17:13
Können die Anschlüsse immer noch vertauscht sein, wenn ich das gesendete vom µC im Terminal angezeigt bekomme?
Das hängt vom Terminal ab. Wenn es das Echo vom AVR ist funktioniert alles bestens, dann suchst du einen Fehler der gar nicht existiert. Wenn es dagegen einfach nur vom Terminal selbst eine Kopie der gesendeten Nachricht ist hat was nicht ganz mit der Kommunikation geklappt.


Das ist ein Status Register, da solltest du nix reinschreiben.
Nicht ganz, die Statusbits kann man durch beschreiben mit '1' zurücksetzen. Wie bei (fast) allen anderen Interrupt-Flags auch.

mfG
Markus

Wsk8
12.01.2014, 17:37
Nicht ganz, die Statusbits kann man durch beschreiben mit '1' zurücksetzen. Wie bei (fast) allen anderen Interrupt-Flags auch.
Nicht sollen != nicht dürfen ;)

Aber ich hab ja schon geschreiben, dass es nicht am Code liegt. Der funktioniert ganz gut.

mfg

chrisavr1981
12.01.2014, 20:52
hallo zusammen,

der Fehler wurde gefunden, es liegt wohl oder übel am selbstgebauten Entwicklerboard selber.
ich habe noch ein 2. UART to FTDI 232 hiermit funktioniert es einwandfrei.

Entschuldigt bitte die Fragerei!

Und danke für das austesten und das Zeit nehmen um mich zu Supporten!!