ATmega8 Max232

OP #3005807
Lesenswert?

Hi.
Ich hab ne kleine ATmega8 Schaltung die auch funktioniert und möchte 
dazu über die Serielle Schnittstelle mit meinem PC kommunizieren.

Aufgebaut habe ich es ziemlich genau so:
http://www.mikrocontroller.net/wikifiles/e/ee/AVR-RS232.png

Mein Code sieht so aus:
1
#include <avr/io.h>
2

3

4
#define BAUDRATE 9600UL //Definition als unsigned long, sonst gibt es Fehler in der Berechnung
5
#define F_CPU 4000000UL            //Define the MPU operating frequency
6

7
static inline int uart_putc (const uint8_t c)
8
{
9
    // Warten, bis UDR bereit ist für einen neuen Wert 
10
    while (!(UCSRA & (1 << UDRE)))
11
        ;
12

13
    // UDR Schreiben startet die Übertragung 
14
    UDR = c;
15

16
    return 1;
17
}
18

19
static inline uint8_t uart_getc_wait (void)
20
{
21
    // Warten, bis etwas empfangen wird 
22
    while (!(UCSRA & (1 << RXC)))
23
        ;
24

25
    // Das empfangene Zeichen zurückliefern 
26
    return UDR;
27
}
28

29
static inline int uart_getc_nowait (void)
30
{
31
    // Liefer das empfangene Zeichen, falls etwas empfangen wurde; -1 sonst 
32
    return (UCSRA & (1 << RXC)) ? (int) UDR : -1;
33
}
34

35

36
// Einen 0-terminierten String übertragen. 
37
void uart_puts (const char *s)
38
{
39
    do
40
    {
41
        uart_putc (*s);
42
    }
43
    while (*s++);
44
}
45

46

47
void uart_init (void)
48
{
49
    uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1);
50
 
51
    UBRRH = (uint8_t) (ubrr>>8);
52
    UBRRL = (uint8_t) (ubrr);
53
 
54
    // UART Receiver und Transmitter anschalten 
55
    // Data mode 8N1, asynchron 
56
    UCSRB = (1 << RXEN) | (1 << TXEN);
57
    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
58

59
    // Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte) 
60
    do
61
    {
62
        UDR;
63
    }
64
    while (UCSRA & (1 << RXC));
65
}
66

67

68

69
int main()
70
{
71
  char text[] = "Hallo Welt.\n";
72
    uart_init();
73
    //sei();   // Wird nur gebraucht bei der Interrupt-Version 
74

75
    uart_puts (text);
76
    uart_puts ("Hallo Welt!\n");
77

78
    return 0;
79
}

Allerdings hab ich schon viele andere Versionen ausprobiert und nie auch 
nur eine Antwort erhalten. Auslesen tue ich mit HTerm unter Windows auf 
Com 1, welcher auf Bit pro Sek 9600, Datenbits 8 usw. genau wie unter 
HTerm eingestellt ist.

Ich kann nicht genau feststellen, ob die Schaltung, der Code oder gar 
Windows mein Problem ist, da ich Windows 7 64 Bit nutze.
OP #3005844
Lesenswert?

Ich hab einen 4MHZ Quartz, welchen ich auch so definiert haben, auch im 
makefile (F_CPU = 4000000).

Ich benutze kein Board, habs auf nem Steckbrett aufgebaut und zwar auf 
so einem:
http://www.rn-wissen.de/images/8/82/Avrtutorial_steckbrettmega32.jpg

Was meinst du mit ftdi treiber?
Ich nutze keinen Virtuellen Comport.

Und ja, wähle natürlich auch com1 bei HTerm aus, Connect funktioniert 
auch und es wird auf Daten gewartet.
Gast #3005857
Lesenswert?

Hi

>Und ja, wähle natürlich auch com1 bei HTerm aus, Connect funktioniert
>auch und es wird auf Daten gewartet.

Dann verbinde mal die controllerseitigen Anschlüsse TX und RX vom MA232 
und sende etwas mit HTERM. Wenn der MAX232 funktioniert solle das Echo 
ankommen.

MfG Spess
(Firma: matzetronics) #3006168
Lesenswert?

Mario Xxx schrieb:
> int main()
> {
>   char text[] = "Hallo Welt.\n";
>     uart_init();
>     //sei();   // Wird nur gebraucht bei der Interrupt-Version
>
>     uart_puts (text);
>     uart_puts ("Hallo Welt!\n");
>
>     return 0;
> }

Wo möchtest du denn hin 'return' en? Die Hauptschleife in einem MC 
Programm besteht normalerweise aus einer Endlosschleife a la:
1
int main()
2
{
3
char text[] = "Hallo Welt.\n";
4
 uart_init();
5
 //sei();   // Wird nur gebraucht bei der Interrupt-Version 
6

7
while (1) {
8
// mach die Hauptschleife
9
     uart_puts (text);
10
     _delay_ms(200);
11
     uart_puts ("Hallo Welt!\n");
12
     _delay_ms(200);
13
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren