www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega8 - USART -> nur nullen


Autor: Di Pi (drpepper) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mein Atmega8 sendet nur nullen, wenn ich per USART_transmit etwas senden 
möchte.
Mein Terminalprogramm ist auf 9600 baud, 2 stoppbits eingestellt. 
Loopback auf TTL-Seite des MAX232 funktioniert problemlos.
Hat vielleicht jemand eine Idee, woran es liegen könnte?

Danke :)

(Es folgt der relevante Codeausschnitt)
#ifndef F_CPU
#define F_CPU 4000000     
#endif

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

#define uchar unsigned char
#define uint unsigned int

#define FOSC 4000000  // Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1

// procedures

void USART_Init(unsigned int ubrr);
void USART_Transmit(unsigned char data);

int main(void)
{  
  USART_Init(MYUBRR); // initialize USART

  for(;;) {  
         USART_Transmit(65);
  }
}

void USART_Init(unsigned int ubrr)
{
  /* Set baud rate */
  UBRRH = (unsigned char)(ubrr>>8);
  UBRRL = (unsigned char)ubrr;
  /* Enable receiver and transmitter */
  UCSRB = (1<<RXEN)|(1<<TXEN);
  /* Set frame format: 8data, 2stop bit */
  UCSRC = (1<<USBS)|(3<<UCSZ0);
}

void USART_Transmit( unsigned char data )
{
  /* Wait for empty transmit buffer */
  while ( !( UCSRA & (1<<UDRE)) )
  ;
  /* Put data into buffer, sends the data */
  UDR = data;
}

Autor: jonny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sendest du denn? Einen String doe nur Zeichen?

meine kleine Datenübetrageung sieht so aus:
//Funktion uart_send:
void uart_send(const char *s)
{
while (*s) {
while (!(UCSRA & (1<<UDRE)))  {   }
UDR = *s++;}
}

// Aufruf der Funktion durch:
uart_send("Test Test Test");

Habe deinen Code jetzt nciht genau durchgeguckt aber kannst es ja mal 
mit meinen Einstellungen Testen:
// BAUS: 9600 | 8 Datenbits | 1 Stoppbit
#define BAUD        9600UL
#define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)  

void uart_init(void)
{
    // Baudrate einstellen (Normaler Modus)
    UBRRH = (unsigned char) (UBRR_BAUD>>8);
    UBRRL = (unsigned char) (UBRR_BAUD & 0x0ff);

    // Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts
    UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);

    // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

Autor: Di Pi (drpepper) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte vorerst nur einzelne Zeichen senden.

Mit deiner Methode kommt zwar was anderes als nullen, aber auch nicht 
das richtige. Abgesehen davon geht dann nach kurzer zeit garnichts mehr. 
Timer halten an, Interrupts lösen nicht aus :/

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Womit taktest du den AVR?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Check mal die Kontaktierung. Hatte mal das selbe Problem, lag an ner 
schlechten Lötverbindung.

Autor: Di Pi (drpepper) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab nen externen 4MHz Quarz. Allerdings auf nem Breadboard.

Autor: Di Pi (drpepper) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht! Danke an alle, die versucht haben, mir zu helfen :)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woran lag es?

MFG
Falk

Autor: Di Pi (drpepper) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe die USART-Initialisierung verändert (keine Ahnung, warum es 
vorher nicht ging):

#define FOSC 4000000  // Clock Speed
#define BAUD 19200
#define MYUBRR FOSC/16/BAUD-1

void USART_Init(void)
{
  /* Set baud rate */
  UBRRH = (unsigned char) (MYUBRR>>8);
  UBRRL = (unsigned char) (MYUBRR);
  /* Enable receiver and transmitter */
  UCSRB = (1<<RXEN)|(1<<TXEN);
  /* Set frame format: 8data, 2stop bit */
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

void USART_Transmit( unsigned char data )
{
  /* Wait for empty transmit buffer */
  while ( !( UCSRA & (1<<UDRE)) );
  /* Put data into buffer, sends the data */
  UDR = data;
}

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Da Pep

>Ich habe die USART-Initialisierung verändert (keine Ahnung, warum es
>vorher nicht ging):

Was hast du geändert, ausser der Baudrate?

>#define FOSC 4000000  // Clock Speed
>#define BAUD 19200
>#define MYUBRR FOSC/16/BAUD-1

Das sollte man lieber so schreiben, um Rundungsfehler zu minimieren

#define MYUBRR FOSC/(16*BAUD)-1

Ausserdem ist es nicht sinnvoll, die Quarzfreqeunz in zwei verschiedenen 
Defines zu definieren. F_CPU ist quasi der Standard.

MFG
Falk

Autor: Di Pi (drpepper) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, Baudrate und URSEL (jaja, ich weiß, ist eh auf 1 initialisiert). Ah, 
und ich habe vorher den UBRR an die Initialisierung übergeben. Jetzt 
greife ich direkt auf MYUBRR zu.

Danke wegen der Rundung.

Kosmetik mache ich später noch :D

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.