Forum: Mikrocontroller und Digitale Elektronik USART 8N1 ATmega328


von Roman S. (kadege)


Lesenswert?

Hallo,
habe ein Problem mit der seriellen Schnittstelle, an dem ich nicht 
weiterkomme. Ich möchte vom ATmega328 per USART asynchron 8N1 übertragen 
und habe dazu folgenden Code:
1
#include <avr/io.h>          
2
#include <avr/interrupt.h> 
3
#define FOSC 16000000                 // Clock Speed
4
#define BAUD 9600
5
#define MYUBRR FOSC/16/BAUD-1
6
void USART_Init( unsigned int ubrr);
7
void uart_putc(unsigned char c);
8
9
int main( void )
10
  {
11
  USART_Init((uint8_t )MYUBRR);  
12
  UCSR0B |= (1 << TXEN0);              // USART aktiv  
13
  /*UCSR0C &= ~(1 << UMSEL01);          // asynchron
14
  UCSR0C &= ~(1 << UMSEL00);            // asynchron
15
  UCSR0C &= ~(1 << UPM00);            // kein Paritätsbit
16
  UCSR0C &= ~(1 << UPM01);            // kein Paritätsbit
17
  UCSR0C &= ~(1 << USBS0);            // ein Stopbit
18
  UCSR0C &= ~(1 << UCSZ02); */          // 8 Bit
19
  UCSR0C |= (1 << UCSZ00) | (1 << UCSZ01);  
20
  UCSR0C &= ~(1 << UCPOL0);
21
  
22
  uint8_t i=2;
23
    
24
  while(1) 
25
     {
26
     uart_putc(i);
27
     }                      
28
  return 0;   
29
  }        
30
  
31
  
32
void USART_Init( unsigned int ubrr)
33
  {
34
  UBRR0H = (unsigned char)(ubrr >> 8); // BAUD-Rate
35
  UBRR0L = (unsigned char) ubrr;
36
  }
37
38
void uart_putc(unsigned char c)
39
  {
40
  while (!(UCSR0A & (1<<UDRE0)))                    // warten bis Senden moeglich
41
    {
42
    }  
43
  UDR0 = c;                                          // sende Zeichen
44
  }

Hardware wie hier 
[[http://www.mikrocontroller.net/articles/Datei:AVR-RS232.png]], 
Kondensatoren sind Elkos mit 10µF.

Der ATmega 328 wird mit 16 MHz extern getaktet; fuses sind ok und lfuse 
richtig eingestellt, vgl. unten:

avrdude: Device signature = 0x1e950f
avrdude: safemode: lfuse reads as E0
avrdude: safemode: hfuse reads as D9
avrdude: safemode: efuse reads as 7

avrdude: safemode: lfuse reads as E0
avrdude: safemode: hfuse reads as D9
avrdude: safemode: efuse reads as 7
avrdude: safemode: Fuses OK

Es kommt nichts über die Schnittstelle. Ich bin mir nicht sicher, ob die 
"f_osc", die man lt. Datenblatt für die Berechnung des UBRR-Eintrags 
verwenden soll, die CPU-Frequenz ist.

Hat jemand eine Idee? Danke für Eure Hilfe!

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Muss der TX Pin nicht via DDR auf Ausgang gestellt werden? Als Eingang 
wird da nix rauskommen.

von spess53 (Gast)


Lesenswert?

Hi

>Muss der TX Pin nicht via DDR auf Ausgang gestellt werden? Als Eingang
>wird da nix rauskommen.

Nein. Mit UCSR0B |= (1 << TXEN0) übernimmt die USART die Kontrolle über 
den Pin.

MfG Spess

von Michael S. (captain-stone)


Lesenswert?

Hallo Roman,

> Es kommt nichts über die Schnittstelle.

wenn nichts über die Schnittstelle kommt, dann ist die Software erst der 
zweite Schritt. Was sagt das Oszi? Was passiert beim Senden, was beim 
Empfangen von Zeichen von und zu einem Terminal?

Was passiert beim Single Step in den Schnittstellen Registern? Ohne 
diesen Informationen tappst Du nur im Dunkeln.

Der Captain

von Julian K. (tuxoid)


Lesenswert?

Der Code sieht soweit erst einmal korrekt aus. (Die Baudrate würde ich 
mit uint16_t casten, ist aber hier unerheblich für das Problem.)

Außer Transmit Enable und Baudrate brauchst du für dein Code-Beispiel 
eigentlich keine weiteren Einstellungen vornehmen, da der Rest schon per 
Default eingestellt ist: Asynchron, 8N1 usw.

Hast du ein Signal zwischen Controller und MAX232? Wie hast du 
festgestellt, dass da Nichts ist?

Stelle sicher, dass die Berechnung der Baudrate einwandfrei funktioniert 
und der richtige Wert in die UBBRs eingetragen wird.

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.