Forum: Mikrocontroller und Digitale Elektronik Uart richtig eingestellt


von Tim (Gast)


Lesenswert?

Hallo ich habe im netz einen Quelltext für, einen atmega16 
Zeichensenden, gefunden. Ich bin mir nicht sicher ob er mit 8 Bit und 
einem Stopbit arbeitet. Kann mir sagen ob das so ist und wenn nicht wo 
man das ändern muss.
1
#include <avr/io.h>  
2
#include <util/delay.h>
3
4
#define F_CPU 16000000L
5
#define BAUD 2400
6
#define ubrr_value (  ( F_CPU / (16*BAUD) ) - 1  )
7
 
8
void USART_Init(void);
9
void USART_Transmit(unsigned char data);
10
11
//***********************  main   *********************************
12
13
int main(void) 
14
{
15
uint8_t Speicher1 ;
16
uint8_t Speicher2;
17
DDRC = 0xff;   
18
DDRA = 0x00;                    
19
DDRB = 0x00;
20
USART_Init();
21
22
23
24
while(1) 
25
{        
26
USART_Transmit(0b10000111);  
27
       
28
 return 0;
29
}
30
31
32
//***************UART Initialisieren********************
33
34
void USART_Init(void) 
35
{  
36
    UBRRH = (unsigned char)(ubrr_value>>8);
37
    UBRRL = (unsigned char)ubrr_value;
38
    
39
    UCSRB = (1<<RXEN)|(1<<TXEN);
40
 UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);                                        
41
  
42
}
43
44
45
46
//********************   senden   ****************************
47
48
49
void USART_Transmit(unsigned char data) 
50
{
51
52
    /* Wait for empty transmit buffer */
53
    while ( !( UCSRA & (1<<UDRE)) );
54
    /* Put data into buffer, sends the data */
55
    
56
  UDR = data;
57
   
58
}

von Klausy (Gast)


Lesenswert?

is alles richtig so...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Die Entscheidende Codestelle ist hier:
1
void USART_Init(void) 
2
{  
3
  // Baudrate einstellen
4
  UBRRH = (unsigned char)(ubrr_value>>8);
5
  UBRRL = (unsigned char)ubrr_value;
6
    
7
  // RX und TX enablen
8
  UCSRB = (1<<RXEN)|(1<<TXEN);
9
10
  // Frameformat einstellen
11
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
12
}

Die Bits in UCSRC für ein bestimmtes Frameformat sind im Datenblatt 
erklärt (S. 166 in doc2466.pdf auf der atmel.com Seite 
http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf)

von Tim (Gast)


Lesenswert?

UBRRH = (unsigned char)(ubrr_value>>8);

sind das denn mit dem stoppbit nicht 9 und nicht 8 Zeichen?

von Klausy (Gast)


Lesenswert?

das wird nicht mitgezählt...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Obacht, die Frage schrammt haarscharf am Trollen vorbei.

> UBRRH = (unsigned char)(ubrr_value>>8);

Die Zeile hat mit dem Frameformat nichts zu tun.

8N1 heisst 8 Datenbits, Keine Parität, 1 Stoppbit. Dazu kommt ein 
Startbit. Komplett gehen also pro Datenbyte 10 Bits über die Leitung.

Lies die Erklaärung zu RS232 und obiges Datenblatt.

von Tim (Gast)


Lesenswert?

Kann man den auch ohne Startbit senden denn für meine Anwendung brauche 
ich 8Bit und eine Stopbit.

von Gast (Gast)


Lesenswert?

Wikipedia -> RS232

Es geht nicht ohne Start und Stop.

von Gast (Gast)


Lesenswert?

Außerdem, dein Mega liefert dir nur 8 Datenbits.

von Tim (Gast)


Lesenswert?

Wie muss man das denn schreiben z.B. wenn ich 2 Byte übertragen möchte.
1
USART_Transmit(00010101);
2
USART_Transmit(00101100);

oder so:
1
USART_Transmit(0001010100101100);

von spess53 (Gast)


Lesenswert?

Hi

>Außerdem, dein Mega liefert dir nur 8 Datenbits.

Nicht nur. Je nach Einstllung zwischen 5 und 9.

Mfg Spess

von Klausy (Gast)


Lesenswert?

>Wie muss man das denn schreiben z.B. wenn ich 2 Byte übertragen möchte.

>USART_Transmit(00010101);
>USART_Transmit(00101100);

>oder so:

>USART_Transmit(0001010100101100);

Ließ dir mal in ruhe die funktion eines UART's durch und die Bedeutung 
von Variablen in C (unsigned char)...

von Tim (Gast)


Lesenswert?

>Ließ dir mal in ruhe die funktion eines UART's durch und die Bedeutung
>von Variablen in C (unsigned char)...


Danke aber damit ist mir auch nicht geholfen ich denke das wird gemachet 
wie ich das zuerst geschreiben habe aber ich bin mir nicht sicher.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.