mikrocontroller.net

Forum: Compiler & IDEs AVR UART Datei senden und Empfanfangen


Autor: Marie (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo alle,
ich versucht seite einige zeit zeichen von der tastatur zur 
Hyperterminal via der microcontroller (Atmega16)zu senden aber es klap 
immer nicht. ich habe auch ein beispiel Programm in winavr ordner 
genohmen aber es geht immer nicht.
bitte wenn jemand ein solche programm hat kann er mcih es senden oder 
helfen sie mir meine programme richtig zu schreiben.
N.B. in anhang steht das beispiel programm von Winavr mit einigen 
modifikationen von mir

ich danke Ihnen schon
Marie

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm...

Was soll das Programm machen bzw. wie erkennst du, dass "es geht immer 
nicht" eintritt?

Ich kann in der Hauptroutine main() keine Aktion erkennen, die auf die 
Datenübertragung reagiert. Für mich sieht es so aus, als ob einfach nur 
die ehemalige uart_init() zu main() umgemodelt wurde.

Desweiteren sind die Funktionen uart_getchar() und uart_putchar() 
bereits auf Streams ausgelegt. Das ist eine Stufe komplexer als eine 
einfache Datenübertragung (wie z.B. im AVR-GCC-Tutorial hier bei 
mikrocontroller.net), weil diese Streams eingerichtet auch werden müssen 
(http://www.nongnu.org/avr-libc/user-manual/group__...). Ich 
kann in deinem Beispielcode keine solche Initialisierung erkennen.

Schlussendlich musst du noch checken, ob deine Hardware entsprechend zum 
Beispielcode eingerichtet ist (Frequenz 1 MHz und TX/RX Verbindung zum 
PC über RS232-Pegelwandler und Kabel).

Autor: Marie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du hast ja recht Stefan, ich habe die ahemalige uart_init() zu main 
umgemodelt
das habe ich ich gemacht weil während die kompilierung gabe es immer ein 
fehler weil die main function fällt. ich bitte dich wenn  du ein 
beispiel die nicht kompliziert ist kannst du mir das zeigen?
MFG
Marie

Autor: Marie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das programm soll daten vom Tastatur zu controller empfangen und diesen 
daten zu Hyperterminal des PC senden. und wie ich schon vorher gesagt 
habe ich habe das beispiel programm von WinAvr kopiert und wie du gesagt 
hast es ist eine Stufe Komplexe und ich will gern eine simple beispiel 
haben. ich habe im Tutorial geschaut aber habe ich keine konkrete 
Beispiel gesehen.
Bitte kann jemand mir helfen?
MFG
Marie

Autor: Stefan B. (stefan) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier ein einfaches Programm zum Emfangen und Zurücksenden:
//
// Datei uart.c
// MCU: Atmega16
//
#include <avr/io.h>

// CHECK F_CPU WITH HARDWARE OSZILLATOR SETTING !!!!
#define F_CPU 1000000UL
#define UART_BAUD 9600

void uart_init(void);
unsigned char uart_getc(void);
int uart_putc(unsigned char c);
void uart_puts (char *s);

int main(void)
{
   unsigned char c;

   uart_init();

   uart_puts("hello world!\r\n\r\n");

   while(1)
   {
      // Poll
      c = uart_getc();

      // Funny conversion
      if (c >= 'a' && c <= 'z')
         c += 'A' - 'a';
      else if (c >= 'A' && c <= 'Z')
         c += 'a' - 'A';

      // Echo
      uart_putc(c);
   }

   return 0;
}

void uart_init(void)
{
    UCSRB |= (1<<TXEN) |(1<<RXEN);  // tx/rx enable
    UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1

#if F_CPU < 2000000UL && defined(U2X)
    UCSRA |= (1<<U2X);   /* improve baud rate error by using 2x clk */
    UBRRL = (F_CPU / (8UL * UART_BAUD)) - 1;
#else
    UBRRL = (F_CPU / (16UL * UART_BAUD)) - 1;
#endif
}

int uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
    {
    }

    UDR = c;                      /* sende Zeichen */
    return 0;
}

void uart_puts (char *s)
{
    while (*s)
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
        uart_putc(*s);
        s++;
    }
}

unsigned char uart_getc(void)
{
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
        ;
    return UDR;        // Zeichen aus UDR an Aufrufer zurueckgeben
}

Autor: Marie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich danke dir Stefan. ich habe noch einigen frage: kann ich die String 
von der Tastatur eingeben? und wenn ich das Programm mit interrupt 
steuern will was soll ich noch machen? ich meine wenn ich das Empfangen 
und das Senden mit Interrupt routine schreiben will wie soll ich das 
machen.
MFG
Marie

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.