-
        

Ergebnis 1 bis 9 von 9

Thema: UART Interrupt Empfangsproblem FTDI 232

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    05.01.2014
    Beiträge
    23

    UART Interrupt Empfangsproblem FTDI 232

    Anzeige

    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.

    Code:
    #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!

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    29
    Beiträge
    1.221
    Zitat Zitat von chrisavr1981 Beitrag anzeigen
    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:
    PHP-Code:
    PORTB ^= (1<<PB1); 
    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    05.01.2014
    Beiträge
    23
    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.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    void init_uart(unsigned int ubrr)
    {
    UBRRH = (unsigned char)(ubrr>>;
    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

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    05.01.2014
    Beiträge
    23
    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 - - -

    Zitat Zitat von oberallgeier Beitrag anzeigen
    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>

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    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

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    29
    Beiträge
    1.221
    Zitat Zitat von chrisavr1981 Beitrag anzeigen
    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.

    Zitat Zitat von Wsk8 Beitrag anzeigen
    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
    Tiny ASURO Library: Thread und sf.net Seite

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    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

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    05.01.2014
    Beiträge
    23
    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!!

Ähnliche Themen

  1. UART zu RS 232
    Von Gremlin im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 12
    Letzter Beitrag: 19.02.2012, 20:16
  2. Neue USB/UART-Kabel von FTDI
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 20.10.2011, 13:30
  3. UART per Interrupt
    Von sunshine im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 19.03.2011, 23:56
  4. ATXMEGA UART Empfangsproblem
    Von aussternengemacht im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 16.11.2010, 16:58
  5. UART Interrupt
    Von jagdfalke im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 13.12.2005, 20:44

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •