mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART 20mhz 115200 Fehler


Autor: Rudolf Schenker (rudolfschenker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Habe ein Problem mit den UART leider muss ich vor jeden Senden 105us 
warten da es sonst zu Überschneidungen der Bytes kommt, ich benutze 
einen max3232 sowie einen atmega88 auf 20mhz irgend jemand eine Idee 
woran es liegen könnte evtl. Fehlerate zu hoch ?

Gruss Rudolf
MAIN
#define F_CPU 20000000UL

#include <stdio.h>
#include <string.h>  
#include <avr/io.h>  
#include <avr/interrupt.h>
#include <util/delay.h>
#include "usart.h"

// Defines
#define sleep() asm volatile ("nop")

//Prototypen


//Hauptprogramm

//Globale Variablen
uint8_t temp;



int main (void)
{  

USART0_init();
USART0_puts((uint8_t *)"Hello\n");

sei();  //irq enable

  
  while(1)   //hauptschleife
  {
                     //casten
//
//    USART0_write(0x41);
//    USART0_write(0x42);
//    USART0_write(0x43);
//    _delay_ms(1000);

    //nix
  }  
// cli(); //int deaktivieren
  return (1);
}


ISR(USART_RX_vect)
{
  temp = UDR0;  //daten vom uart
    USART0_write(temp);
}
USART.C
// -------------
// --- usart ---
// -------------

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>


//USART0 TX Complete
//ISR(USART_TX_vect)
//{
//}

//USART0 Data Register Empty
//ISR(USART_UDRE_vect)
//{
//}

void USART0_init()
{
  // settings: 115200 8-n-1
  // real baud = 119047
  // error = 3.3394097222222197%
  // Set baud rate
  UBRR0H = 0;
  UBRR0L = 20;
  UCSR0A = (1<<U2X0);
  // Enable receiver and transmitter
    UCSR0B = (1<<RXCIE0)|(1<<RXEN0) | (1<<TXEN0);
  // Set frame format
  UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);


}

void USART0_write(uint8_t data)
{
   _delay_us(105);  //sonst fehler
  
  // Wait for empty transmit buffer
  while ( !( UCSR0A & (1<<UDRE0)) ) ;
  // Put data into buffer, sends the data
  UDR0 = data;
}

uint8_t USART0_read()
{
// Wait for data to be received
while ( !(UCSR0A & (1<<RXC0)) );
return UDR0;
}


void USART0_puts(unsigned char *txt)
{ 
  while (*txt) USART0_write(*txt++); 
}

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.