Uart_atmega16

Persönliche Seite #1578566
Lesenswert?

> Es wird ein Atmega16 verwendet!!
>> /* UART-Init beim AT90S2313 */

Wenn es schon so los geht :)

Probier es es damit:
1
int main(void)
2
{
3
  UCSRB |= (1<<TXEN);                // UART TX einschalten
4
  UCSRC |= (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1 
5
 
6
  UBRRH = UBRR_VAL >> 8;
7
  UBRRL = UBRR_VAL & 0xFF;
8

9
  while(1)
10
  {  
11
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
12
    { 
13
    }
14
    UDR = 'x';
15
  }
16
}
OP #1578623
Lesenswert?

Dieser Code müsste eigentlich mit dem Atmega16 funktionieren!!

#include <stdio.h>
#include <string.h>
#include <avr/io.h>


#ifndef F_CPU

#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 
4000000"
#define F_CPU 4000000UL  // Systemtakt in Hz - Definition als unsigned 
long beachten
                         // Ohne ergeben sich unten Fehler in der 
Berechnung
#endif

#define BAUD 9600UL      // Baudrate

// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = 
kein Fehler.

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  //#error Systematischer Fehler der Baudrate grösser 1% und damit zu 
hoch!
#endif
Persönliche Seite #1578632
Lesenswert?

Bei dem Code in Beitrag "Re: Uart_atmega16" 
sieht man nicht, ob die Fehler aus 
Beitrag "Uart_atmega16" mit Hilfe des 
Listings aus Beitrag "Re: Uart_atmega16" 
verbessert wurden und ob die Anregungen zur Kontrolle der 
Projekteinstellungen aus 
Beitrag "Re: Uart_atmega16" berücksichtigt 
wurden.

Ansonsten gibt es eine AVR Checkliste zum Abarbeiten sonstiger 
Fehlerquellen: 
http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART
#1578664
Lesenswert?

Bekir Resic schrieb:
> Dieser Code müsste eigentlich mit dem Atmega16 funktionieren!!

Welcher Code?
Das was du zeigst, sind ein paar #define
aber den interessanten Teil, den tatsächlich arbeitenden Code, zeigst du 
nicht.

Und solange du das hier
1
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
2
    { UDR = 'x';
3
    }
nicht korrigierst, wird sich da auch weiterhin nichts tun.
Persönliche Seite #1578684
Lesenswert?

Rede nicht das/die Tutorials schlecht!

Im AVR-Tutorial in der Unterseite zum UART wird der Assemblercode 
angezeigt, kein C-Code!

Im AVR-GCC-Tutorial/Der UART wird C-Code angezeigt. Und das Senden 
einzelner Zeichen ist unter 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART#Senden_einzelner_Zeichen 
gezeigt. Und dort ist nicht der Fehler drin, den du in deinem 
Quelltext hast.

Beratungsresistent.
Ich bin raus.
#1578700
Lesenswert?

Bekir Resic schrieb:
> das Main ist oben schon angeführt worden!!

Wo?
Im Eröffnungsposting?

Dann lass dir zum x-ten mal gesagt sein, dass du hier
1
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
2
    { UDR = 'x';
3
    }

falsch abgeschrieben hast.

Der Code im Tuorial macht

   Warte bis das Senderegister frei ist
   Sende das Zeichen

Dein Code macht

   Solange das Senderegister nicht frei ist
      Versuch zu senden.

Man kanns auch etwas anders ausdrücken:
Dein Handbuch verlangt von dir zu warten bis die Tür offen ist, ehe du 
durchgehst. Du hingegen willst nur dann durch die Tür durchgehen, 
solange sie geschlossen ist.
Da darfst du dich nicht wundern, wenns weh tut, auch wenn dein Handbuch 
was anderes sagt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren