mikrocontroller.net

Forum: Compiler & IDEs Uart_atmega16


Autor: Bekir Resic (bere)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es wird ein Atmega16 verwendet!!
>> /* UART-Init beim AT90S2313 */

Wenn es schon so los geht :)

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

  while(1)
  {  
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
    { 
    }
    UDR = 'x';
  }
} 

Autor: Thomas Burkhart (escamoteur)
Datum:

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

Gruß
Tom

Autor: Bekir Resic (bere)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bekir Resic (bere)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber es tut sich trotzdem nichts beim Programm!!

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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_Checkl...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
    { UDR = 'x';
    }
nicht korrigierst, wird sich da auch weiterhin nichts tun.

Autor: Bekir Resic (bere)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das Main ist oben schon angeführt worden!!

Autor: Bekir Resic (bere)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau so wird der Code fürn Atmega16 im AVR-Tutorial angezeigt.

lg Resic Bekir

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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-Tu... 
gezeigt. Und dort ist nicht der Fehler drin, den du in deinem 
Quelltext hast.

Beratungsresistent.
Ich bin raus.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
    { UDR = 'x';
    }

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.

Autor: Bekir Resic (bere)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein Nein die Tutorials sind super..
Danke für die Info

Mfg Resic Bekir

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.