PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATXMEGA UART Empfangsproblem



aussternengemacht
15.11.2010, 12:43
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:
--------------------
#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.[color=blue]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

steveLB
15.11.2010, 20:17
Vielleicht findest hier mehr Hilfe
http://www.mikrocontroller.net/topic/111825
http://www.mikrocontroller.net/topic/197651

aussternengemacht
16.11.2010, 15:58
Vielleicht findest hier mehr Hilfe
http://www.mikrocontroller.net/topic/111825
http://www.mikrocontroller.net/topic/197651

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