- LiTime Speicher und Akkus         
Ergebnis 1 bis 3 von 3

Thema: ATXMEGA UART Empfangsproblem

  1. #1

    ATXMEGA UART Empfangsproblem

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo. Ich bin ziemlich verzweifelt beim Versuch, von der seriellen Leitung zu lesen. Bitte helft! Ich benutze das aktuelle AVR Studio, AVRISP mkII, ein selbstgebasteltes board und einen hugepine USB<-> seriell-Wandler+Terminalprogramm unter WinVista

    Prozessor: ATXMEGA192A3
    USART D0 (PinD3/D2)

    Problem: Im Test reagiert der µC nicht auf an ihn gesendete Daten. Auch im Simulator2 passiert überhaupt nichts, wenn ich das RXCIF Flag beim USARTD0 manuell setze. Eine Interruptversion habe ich ebenfallsausprobiert. Die I.-Routine wird aber nicht angesprungen. Zeichen zum PC senden klappt perfekt.

    Code ohne Interrupt:
    --------------------
    [color=darkblue]#include <avr/io.h>
    #define LEDPORT PORTA
    #define LED 7

    int main(void) {
    PORTD.OUTSET |= PIN3_bm; // Für den Transmitter
    PORTD.DIRSET |= PIN3_bm; // "
    //keine Clockconfig--> int. 2MHz Takt nutzen --> BSEL = 12 für 9600baud
    USARTD0.BAUDCTRLA = 12;
    // 8bit UART, no parity, 1 stopbit
    USARTD0.CTRLC |= USART_CMODE_ASYNCHRONEOUS_gc|USART_CHSIZE_8BIT_gc;
    // Receiver einschalten
    USARTD0.CTRLB |= USART_RXEN_bm;

    LEDPORT.DIRSET |= (1<<LED);

    while (1) {
    while (!(USARTD0.STATUS & USART_RXCIF_bm));
    LEDPORT.OUTTGL |= (1<<LED);
    }
    return 0;
    }


    Code mit Interrupt: (***:= geändert)
    -------------------
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #define LEDPORT PORTA
    #define LED 7
    volatile char c;

    // *** RXC ISR ***
    ISR (USARTD0_RXC_vect) {
    c = USARTD0.DATA;
    }
    // *********************

    int main(void) {
    PORTD.OUTSET |= PIN3_bm; // Für den Transmitter
    PORTD.DIRSET |= PIN3_bm; // "
    //keine Clockconfig--> int. 2MHz Takt nutzen --> BSEL = 12 für 9600baud
    USARTD0.BAUDCTRLA = 12;
    // 8bit UART, no parity, 1 stopbit
    USARTD0.CTRLC |= USART_CMODE_ASYNCHRONEOUS_gc|USART_CHSIZE_8BIT_gc;

    // *** RXC Interrupt auf high priority ***
    USART.CTRLA |= USART_RXCINTLVL_Hi_gc;
    // *****************************************

    // Receiver einschalten
    USARTD0.CTRLB |= USART_RXEN_bm;

    LEDPORT.DIRSET |= (1<<LED);


    // *** Interruptcontroller: Highlevelinterrupts aktivieren ***
    PMIC.CTRL |= PMIC_HILVLEN_bm;
    // globale Interrupts aktivieren
    sei();


    while (1) {
    if (c == 111)
    LEDPORT.OUTTGL |= (1<<LED);
    }
    // ************************************************** ********

    return 0;
    }


    Habe auch schon den Transceiver mitaktiviert und diverse andere Sachen probiert, u.a. eine saubere Clockconfig, PortD Dir Änderungen...

    Wieso kann nichts empfangen werden? Wer kann helfen?

    Danke im Voraus,
    Christian

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von steveLB
    Registriert seit
    24.10.2005
    Beiträge
    481
    [X] <-- Nail here for new Monitor

  3. #3
    OK Danke.
    Ich verweise mal auf den zweiten Link. Dort habe ich das Problem nämlich ebenfalls geposted und auch ein wenig feedback bekommen.

    Gruß,
    Christian

Berechtigungen

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

LiTime Speicher und Akkus