www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fehler in UART-Routine gesucht (C)


Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich versuche gerade meine Assemblerroutinen in C umzusetzen.
Leider bisher ohne Erfolg. Speziell geht es um die Initialisierung der 
UART.
Wahrscheinlich ein einfacher Anfängerfehler
#define F_CPU 8000000

#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include <inttypes.h>


//------------------------------------------------------------------------
//   Definitionen
//------------------------------------------------------------------------
#define BAUD 9600                               // definiert Baudrate
#define UBRR_VAL  ((F_CPU+BAUD*8)/(BAUD*16)-1)  // berechnet Wert für Baudratenregister (Wert gerundet)


//------------------------------------------------------
//   Deklaration der Funktionen
//------------------------------------------------------
void initUART (void);        // Befehl an Display


//------------------------------------------------------
//   Mainfunktion
//------------------------------------------------------
int main (void) 
{            

   while(1);                 
}



//------------------------------------------------------
//  
//------------------------------------------------------
void initUART(void)  
{   

  UCSRB |= (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);   // Empfang aktivieren
  UCSRC |= (3<<UCSZ0);             // Frame Format: Asynchron 8N1

  UBRRH = UBRR_VAL >> 8;        // Baudrate übergeben
  UBRRL = UBRR_VAL;
}

Kann mir jemand sagen warum die I/O-Register alle als undeclared geführt 
werden?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pacer schrieb:

> Kann mir jemand sagen warum die I/O-Register alle als undeclared geführt
> werden?

Falscher Prozessor in den Project Options eingestellt?

Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt, ich hab zwar Mega8 und auch mal Mega88 eingestellt,
aber ich hab wohl trotzdem einiges durcheinander geworfen.
void initUART(void)  
{   

 #if defined Mega8
  UCSRB |= (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);   // Empfang aktivieren
  UCSRC |= (3<<UCSZ0);             // Frame Format: Asynchron 8N1

  UBRRH = UBRR_VAL >> 8;        // Baudrate übergeben
  UBRRL = UBRR_VAL;
 #endif


 #if defined Mega88
  UBRR0H = UBRR_VAL >>8;
  UBRR0L = UBRR_VAL;

  UCSR0C |= (3<<UCSZ00);
  UCSR0B |= (1<<TXEN0) | (1<<RXEN0);       
 #endif

}
Das hier sollte funktionieren, oder?
Der Compiler bringt jetzt keinen Fehler mehr.

Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt kommen zwar Zeichen an, aber leider nicht lesbar.
#define F_CPU 7372800
#define Mega88
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include <inttypes.h>
#include <stdlib.h>



//------------------------------------------------------------------------
//   Definitionen
//------------------------------------------------------------------------
#define BAUD 9600UL                             // definiert Baudrate
#define UBRR_VAL  ((F_CPU+BAUD*8)/(BAUD*16)-1)  // berechnet Wert für Baudratenregister (Wert gerundet)


//------------------------------------------------------
//   Deklaration der Funktionen
//------------------------------------------------------
void initUART (void);        // Befehl an Display
int uart_putc(unsigned char c);    // Sendet Zeichen an RS232
void uart_puts (char *s);      // übergibt einzelne Zeichen einer Zeichenkette an uart_putc

//------------------------------------------------------
//   Mainfunktion
//------------------------------------------------------
int main (void) 
{  
   char s[7];
   int16_t i = -12345;


   initUART();  
   
   itoa( i, s, 10 ); // 10 fuer radix -> Dezimalsystem
   uart_puts( s );
        

   while(1);                 
}



//------------------------------------------------------
//  
//------------------------------------------------------
void initUART(void)  
{   

 #if defined Mega8
  UCSRB |= (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);   // Empfang aktivieren
  UCSRC |= (3<<UCSZ0);             // Frame Format: Asynchron 8N1

  UBRRH = UBRR_VAL >> 8;        // Baudrate übergeben
  UBRRL = UBRR_VAL;
 #endif


 #if defined Mega88
  UBRR0H = UBRR_VAL >>8;
  UBRR0L = UBRR_VAL;


  UCSR0C |= (3<<UCSZ00);
  UCSR0B |= (1<<TXEN0) | (1<<RXEN0);       
 #endif

}



int uart_putc(unsigned char c)
{

 #if defined Mega88
    while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich */
    {
    }                             
 
    UDR0 = c;                      /* sende Zeichen */
    return 0;
 #endif

 #if defined Mega8
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
    {
    }                             
 
    UDR = c;                      /* sende Zeichen */
    return 0;
 #endif
 }


void uart_puts (char *s)
{
    while (*s)
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
        uart_putc(*s);
        s++;
    }
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.