PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit UART



Nils Wenzler
18.07.2007, 13:22
Hallo
Ich Programmiere momentan zum üben an einem RN-Control 1.4 Mega32 Board.
Ich muss zum weiterkommen endlich die RN232 übertragung zum laufen zu bringen...
Ich habe ein Modul geschrieben um das Uart zu bedienen, allerdings bekomme ich am PC (Benutzte Linux und das MINICOM um etwas anzuzeigen)
nur Datenmüll, sprich es wird etwas übertragen aber es kommt nur Müll an.
Ich habe hier mal meinen Code, könnte sich den jemand mal anschauen?



#include <avr/io.h>
#include <avr/interrupt.h>
#include "avr.h"
#include "uart_cnf.h"
#include "uart.h"
#include "str_int.h"

// local definitions -----------------------------------------------------------
#define UART_UBRR_CALC ((F_CPU)/((UART_BAUD_RATE)*16L)-1)

// global variables ------------------------------------------------------------
uint8_t uartTxCount;

// local variables -------------------------------------------------------------
uint8_t* txData;

// global function implementation ----------------------------------------------
void uartInit(){
UCSRB|=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //RX Complete Interrupt Enable
UCSRC |= (1<<UCSZ1)|(1<<UCSZ0); //8-Bit
UBRRH=(uint8_t)(UART_UBRR_CALC>>8); //set baudrate
UBRRL=(uint8_t) UART_UBRR_CALC;
uartTxCount=0;

sei();
}



uint8_t uartTxBytes(uint8_t* data,uint8_t length){
if(uartTxCount)
return 0;
txData=data;
uartTxCount=length;
UDR=*data;
UCSRB|=(1<<UDRIE); //Data Register Empty Interrupt Enable
return 1;
}
void uartTxUint16(uint16_t i){
uint8_t str[6];
stringWord2Dec(i,str); //convert integer to string
uartTxBytes(&str[1],str[0]); //send string
uint8_t str2="\r\n";
uartTxBytes(str2,2); //carriage return, new line
}

// interrupt routines ----------------------------------------------------------
ISR(USART_UDRE_vect){ //USART TX Data Register Empty Interrupt
if(--uartTxCount)
UDR=*++txData;
else{
UCSRB&=~(1<<UDRIE); //Data Register Empty Interrupt Disable
}
/* This Interrupt do not disable him self. It neccesary do read UDR
* or to disable it in the UCSRB Register. */
}


Danke Gruss Nils
Achja die Variable UART_BAUD_RATE ist 38400 und F_CPU 16000000

ogni42
18.07.2007, 13:30
* Wo wird uartTxCount initialisiert?
* in uartInit erst das Low dann das high Register beschreiben oder besser direkt auf UBRR zugreifen
* In der ISR wird per pre-Increment auf die Daten zugegriffen. Ist das Absicht?
* Ist die CKDIV8 Fuse gesetzt?

In den Datenblättern der ATMegas gibt es Beispielcode (in C) für die serielle Schnittstelle.

Nils Wenzler
18.07.2007, 13:39
1. Meinst du das?
// global variables ------------------------------------------------------------
uint8_t uartTxCount;

Zu meiner schande muss ich gestehen, dass ich nicht alles Durchblicke, da es erstmals darum ging das ich schnell anfangen konnte, da es eine Projektarbeit wird.
Deshalb hat mir bei dem Modul ein Kollege geholfen, und ich blicke es nicht ganz durch...
Hättet ihr einen besseren /anderen UART Modul vorschlag, da ich ohne beim Programmieren nicht weiterkomme...
Gruss Nils

ogni42
20.07.2007, 10:36
Hallo Nlis,

wenn es eine Projektarbeit wird - und gut werden soll, wovon ich mal ausgehe - dann fange am Besten damit an, die Tutorials (hier im wiki und auf mikrocontroller.net) durchzuarbeiten. Das hilft Dir ganz sicher mehr weiter als die Beantwortung von Detailfragen.

So Du schon C Kenntnisse hast, helfen Dir die Tutorials m.E. super weiter, da finden sich auch jede Menge Codebeispiele.