Forum: Mikrocontroller und Digitale Elektronik ATmega8 Max232


von Mario X. (grinderfx)


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.

von incocknito (Gast)


Lesenswert?

#define F_CPU 4000000UL            //Define the MPU operating frequency

stimmt die frequenz? welches board? richtigen treiber für den ftdi 
installiert? richtigen com port bei hterm ausgewählt?

von Mario X. (grinderfx)


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.

von Thomas E. (thomase)


Lesenswert?

Mario Xxx schrieb:
> Ich hab einen 4MHZ Quartz, welchen ich auch so definiert haben, auch im
> makefile (F_CPU = 4000000).
Die Fuses hast du auch richtig gesetzt? Dämlich Frage, ist aber in 
gefühlten 837% der Fälle die Lösung.

mfg.

von Spess53 (Gast)


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

von Mario X. (grinderfx)


Lesenswert?

Ich hab TX(pin 11) und RX(pin 12) zu Testzwecken miteinander verbunden 
und kriege leider kein Echo.

von Mario X. (grinderfx)


Lesenswert?

Ok, ich scheine ein Problem mit Windows 7 zu haben oder mit Hterm.
Es müsste doch reichen, wenn ich TX und RX schon bei meiner Seriellen 
Schnitstelle am Rechner verbinde, Pin 5 natürlich wieder auf Masse. Dann 
müsste ich doch das empfangen was ich auch sende mit Hterm?

von Dietrich L. (dietrichl)


Lesenswert?

Mario Xxx schrieb:
> Es müsste doch reichen, wenn ich TX und RX schon bei meiner Seriellen
> Schnitstelle am Rechner verbinde, Pin 5 natürlich wieder auf Masse.

Wenn Du am 9-poligen SUB-D-Stecker Pin 2 und 3 verbindest, muss das Echo 
auf den Bildschirm erscheinen.
Am besten erstmal ohne Anschluss an den MAX232, Pin 5 ist dann auch 
uninteressant.

Gruß Dietrich

von Mario X. (grinderfx)


Lesenswert?

Ja leider kriege ich nicht mal ein Echo wenn ich Pin 2 mit Pin 3 an 
meinem Rechner verbinde.

von Fabian O. (xfr)


Lesenswert?

Probier mal ein anderes Terminalprogramm, zum Beispiel PuTTY. Wenns dann 
auch nicht geht, stimmt was mit der seriellen Schnittstelle an Deinem PC 
nicht.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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
}

von Mario X. (grinderfx)


Lesenswert?

Das mit der Schleife ist ein netter Tip und hab ich auch in meinem 
richtigen Programm.
Es funktioniert jetzt auch genau so, das einzige Problem was ich hatte 
war ein falsch gestecktes Kabel am Mainboard. Das Comportkabel saß nicht 
richtig auf dem Mainboard.

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.