Hilfe: RS232 funzt nicht!

Gast #231833
Lesenswert?
• ▲
▼
Mit den Atmega8535 möchte ich Daten via RS232 empfangen und senden.
In meiner Applikation verwende ich als Takt einen ext. 8 Mhz Quarz.
Mein uC kann von der RS232 kein Zeichen empfangen.

Ich habe mir das Datenblatt angeschaut. Da komme ich nicht klar mit.
Wie kommt man darauf, das diese beiden Register:
UCSRB=0xD8; //Baudrate 9600
UBRRL=0x33;
so eingestellt werden müssen?
Sind die beiden Register so richtig ingestellt?

ATMEGA8535 C-Codeausschnitt:
//*****************************************************
interrupt [USART_RXC] void uart_rx_isr(void)
{
  Zeichen = UDR;
}

interrupt [USART_TXC] void uart_tx_isr(void)
{
}

//Hauptprogramm
void main(void)
{
DDRB = 0xFF;
PORTB = 0;
DDRD = 0x00;
PORTD = 0;
PORTC_output();
t6963cinit();
LCD_Clear_Graphics();
LCD_Clear_Text();

UCSRB=0xD8;
UBRRL=0x33;

ACSR=0x80;

#asm("sei")

while (1)
      {
        delay_ms(100);
        lcd_printfz(0, 3,"Zeichen:%2x",Zeichen);
        if (PIND.1 == 1)
          {
           putchar('X');
          }
      };
}
Gast #231834
Lesenswert?
• ▲
▼
also erst uscrc schreiben (ursel bit setzen!)
dann ubbrh und ubbrl schreiben (ursel in ubbrh nicht setzen)
und dann uscrb schreiben

grund für ursel bit ist, dass sich ubbrh und uscrc den selben speicher
teilen

grund für die reihenfolge ist, dass erst die einstellungen
abzuschließen sind, bevor man etwas einschaltet (um fehler zu
vermeiden)
Gast #231835
Lesenswert?
• ▲
▼
wie man darauf kommt:
einfach im datenblatt (was schon recht gut strukturiert ist - habe
schon bescheidenere von anderen herstellern gesehen) die "USART
Register summary" heraussuchen dort dann ein register nach dem anderen
durchgehen.
für die baudrate gibt es formeln oder auch tabellen mit beispielen
(auch im datenblatt)
die restlichen werte entstehen einfach durch das kombinieren der
einzelnen bits.
Es ist aber besser die bytes per schiebe-befehl zusammen zu bauen.
bei codevisionavr (den scheinst du zu verwenden) sind die werte in dem
header enthalten.
z.B.
USCRB = (1<<TXEN)|(1<<RXEN) ...
        (1<<3)   |(1<<4)    ...

Tip für die Zukunft: Den Compiler-Namen mit dazu schreiben. C im
Embedded Bereich ist NICHT genormt, weil einige verwendete dinge nicht
im standard ansi-c stehen.
Gast #231836
Lesenswert?
• ▲
▼
Puhh...ich bin jetzt irgendwie verwirrt.
Könnte Ihr mir ein Beispiel dazu geben?
Mit den Register komme ich durcheinander?

In meinem C Programm verwende ich hierfür nur, UCSRB und UBRRL.

Das register kenn ich nicht:
USCRB und ubbrh und uscrc.
Gast #231839
Lesenswert?
• ▲
▼
So, ich hab mal jetzt ein kleines Programm für den ATMEGA8535 mit
CodeVision AVR geschrieben. Die RS232 verhält sich komisch beim
ATMEGA8535.
Es scheint so zu sein, dass das senden funktioniert.
Nur der empfang funktioniert nicht. Ich kann am Controller nix
empfangen.

*********************************
#include <mega8535.h>
#include <glcd_t6963.h>
#include <delay.h>
#include <math.h>
#include <string.h>
#include <delay.h>
#include <stdlib.h>
#include <stdio.h>

unsigned char SetBaudrate = 0x33;
// Baudrate 9600 Baud (ext.Quarz 8Mhz)
// Stopbit = 1, Parity = none, Data Bits = 8

void USART_Transmit (unsigned char data)
{
 while(!(UCSRA & (0x20)))
   ;
 UDR = data;
}

unsigned char USART_Receive (void)
{
 while(!(UCSRA & (0x80)))
   ;
return UDR;
}

//*****************************************************
//*****************************************************
//Hauptprogramm
void main(void)
{
DDRB = 0xFF;
PORTB = 0;
DDRD = 0x00;
PORTD = 0;
t6963cinit();
LCD_Clear_Graphics();
LCD_Clear_Text();

UBRRL = SetBaudrate;
UCSRB=0x18;
UCSRC=0x86;

ACSR=0x80;

#asm("sei")

while (1)
      {
       delay_ms(150);
       LCD_printfz(0,1,"Zeichen:%2x",USART_Receive());
      };
}
Gast #231840
Lesenswert?
• ▲
▼
Kann niemand zu dem C-Code was sagen?

*********************************
#include <mega8535.h>
#include <glcd_t6963.h>
#include <delay.h>
#include <math.h>
#include <string.h>
#include <delay.h>
#include <stdlib.h>
#include <stdio.h>

unsigned char SetBaudrate = 0x33;
// Baudrate 9600 Baud (ext.Quarz 8Mhz)
// Stopbit = 1, Parity = none, Data Bits = 8

void USART_Transmit (unsigned char data)
{
 while(!(UCSRA & (0x20)))
   ;
 UDR = data;
}

unsigned char USART_Receive (void)
{
 while(!(UCSRA & (0x80)))
   ;
return UDR;
}

//*****************************************************
//*****************************************************
//Hauptprogramm
void main(void)
{
DDRB = 0xFF;
PORTB = 0;
DDRD = 0x00;
PORTD = 0;
t6963cinit();
LCD_Clear_Graphics();
LCD_Clear_Text();

UBRRL = SetBaudrate;
UCSRB=0x18;
UCSRC=0x86;

ACSR=0x80;

#asm("sei")

while (1)
      {
       delay_ms(150);
       LCD_printfz(0,1,"Zeichen:%2x",USART_Receive());
      };
}

Antwort schreiben

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.

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.