Forum: Compiler & IDEs AVR UART Datei senden und Empfanfangen


von Marie (Gast)


Angehängte Dateien:

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

von Stefan B. (stefan) Benutzerseite


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__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).

von Marie (Gast)


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

von Marie (Gast)


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

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

Lesenswert?

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
}

von Marie (Gast)


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

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.