USART AVR-GCC problem

OP #1081546
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?
1
$regfile = "m32def.dat"
2
$crystal = 16000000
3
$baud = 9600
4
$hwstack = 32
5
$swstack = 10
6
$framesize = 40
7

8
Do
9
  Print "x"
10
  Waitms 500
11
Loop
12

13
End

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

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

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

37
int main (void) {
38
  USART_Init(UBRR_VAL);
39
  
40
  while(1){
41
    USART_Transmit('x');
42
    USART_Transmit('\r');
43
    USART_Transmit('\n');
44
    _delay_ms(500);
45
  }
46
  
47
  return 0;
48
}
#1081557
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;
       .......

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.