mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART AVR-GCC problem


Autor: Paul F. (zwanzischmark)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verzweifel an einer USART übertragung in C! Mit dem Bascom Programm 
funktioniert es ohne Probleme. Gleicher Controller mit dem C Programm 
funktioniert nicht. Ich habe mal mit dem Oszi mitgeloggt. Die Daten 
kommen raus, aber VIEL zu langsam (mehr als Faktor 10 zu langsam). Die 
Makefile sollte stimmen mit Taktfrequenz usw. es kann eigentlich nur an 
der Baudrate liegen, aber die Berechnung ist ja aus dem Turorial von 
hier. Hat jemand ne idee?
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 10
$framesize = 40

Do
  Print "x"
  Waitms 500
Loop

End

#include <avr/io.h>
#include <util/delay.h>
 
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 16000000"
#define F_CPU 16000000UL    // Systemtakt in Hz
#endif
 
#define BAUD 9600UL          // Baudrate
 
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
 
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif

void USART_Init(unsigned int baud) {
  /* Set baud rate */
  UBRRH = (unsigned char)(baud>>8);
  UBRRL = (unsigned char)baud;
  /* Enable receiver and transmitter */
  UCSRB = (1<<RXEN)|(1<<TXEN); 
  /* Set frame format: 8data, 1stop bit */
  UCSRC = (1<<UCSZ0)|(1<<UCSZ1);          
}

void USART_Transmit(unsigned char data) {
  /* Wait for empty transmit buffer */
  while (!( UCSRA & (1<<UDRE)));
  /* Put data into buffer, sends the data */
  UDR = data;
}

int main (void) {
  USART_Init(UBRR_VAL);
  
  while(1){
    USART_Transmit('x');
    USART_Transmit('\r');
    USART_Transmit('\n');
    _delay_ms(500);
  }
  
  return 0;
}

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
du hast das URSEL - bit nicht gesetzt. So schreibst du wieder in UBRRH.
UCSRC = (1<<URSEL) | (1<<UCSZ0) | (1<<UCSZ1);

Gruß

P.S. : Außerdem kannst du dir schenken UBBRVAL mit der Funktion zu 
übergeben.
       Du hast es doch schon global definiert. Also einfsch:
       void USART_Init(unsigned int baud) {
       /* Set baud rate */
       UBRRH = (unsigned char)(UBRR_VAL>>8);
       UBRRL = (unsigned char)UBRR_VAL;
       .......

Autor: Paul F. (zwanzischmark)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh man... vielen dank

der code ist ja hauptsächlich aus der Manual, weil ich meinen Fehler 
einfach nicht gefunden hab. Jetzt kann ich natürlich optimieren ;)

danke

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die mit deinen Einstellungen Baudrate beträgt so um die 610Baud, kommt 
also deinen Beobachtungen mehr als Faktor zehn zu lahm sehr nah.

Kein Problem und viel Erfolg.

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.