USART 8N1 ATmega328

OP #3457474
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!
#3457753
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
#3457762
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.

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.