ATmega8 Max232

OP #3005807
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.
Gast
#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?
OP
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
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
OP
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?
(Firma: matzetronics)
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
}
OP
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 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.