AVR UART Datei senden und Empfanfangen

Gast #574617
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
Angehängte Dateien:
Persönliche Seite
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__avr__stdio.html). 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).
Gast
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
Gast
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
Persönliche Seite
Hier ein einfaches Programm zum Emfangen und Zurücksenden:
1
//
2
// Datei uart.c
3
// MCU: Atmega16
4
//
5
#include <avr/io.h>
6

7
// CHECK F_CPU WITH HARDWARE OSZILLATOR SETTING !!!!
8
#define F_CPU 1000000UL
9
#define UART_BAUD 9600
10

11
void uart_init(void);
12
unsigned char uart_getc(void);
13
int uart_putc(unsigned char c);
14
void uart_puts (char *s);
15

16
int main(void)
17
{
18
   unsigned char c;
19

20
   uart_init();
21

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

24
   while(1)
25
   {
26
      // Poll
27
      c = uart_getc();
28

29
      // Funny conversion
30
      if (c >= 'a' && c <= 'z')
31
         c += 'A' - 'a';
32
      else if (c >= 'A' && c <= 'Z')
33
         c += 'a' - 'A';
34

35
      // Echo
36
      uart_putc(c);
37
   }
38

39
   return 0;
40
}
41

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

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

55
int uart_putc(unsigned char c)
56
{
57
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
58
    {
59
    }
60

61
    UDR = c;                      /* sende Zeichen */
62
    return 0;
63
}
64

65
void uart_puts (char *s)
66
{
67
    while (*s)
68
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
69
        uart_putc(*s);
70
        s++;
71
    }
72
}
73

74
unsigned char uart_getc(void)
75
{
76
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
77
        ;
78
    return UDR;        // Zeichen aus UDR an Aufrufer zurueckgeben
79
}
Angehängte Dateien:
Gast
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

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.