Forum: Compiler & IDEs Uart_atmega16


von Bekir R. (bere)


Angehängte Dateien:

Lesenswert?

Hallo,
Ich habe den Code von mikrocontroller.net ausprobiert, aber bei der 
Seriellen Schnittstelle tut sich nichts. Es wird ein Atmega16 
verwendet!!
Könnte mir jemand bei diesem Problem helfen?

Lg Resic Bekit

von Stefan B. (stefan) Benutzerseite


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
}

von Thomas B. (escamoteur)


Lesenswert?

Außerdem, hast Du im Projekt den richtigen Prozessor und Taktfrequenz 
eingestellt sonst passt da gar nichts.

Gruß
Tom

von Bekir R. (bere)


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

von Bekir R. (bere)


Lesenswert?

Aber es tut sich trotzdem nichts beim Programm!!

von Stefan B. (stefan) Benutzerseite


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

von Karl H. (kbuchegg)


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.

von Bekir R. (bere)


Lesenswert?

das Main ist oben schon angeführt worden!!

von Bekir R. (bere)


Lesenswert?

Genau so wird der Code fürn Atmega16 im AVR-Tutorial angezeigt.

lg Resic Bekir

von Stefan B. (stefan) Benutzerseite


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.

von Karl H. (kbuchegg)


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.

von Bekir R. (bere)


Lesenswert?

Nein Nein die Tutorials sind super..
Danke für die Info

Mfg Resic Bekir

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.