Forum: Mikrocontroller und Digitale Elektronik Daten an PC mit MAX232


von Treter_Peter (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Allerseits.

Ich kämpfe mal wieder mit der UART-Schnittstelle meines Atmega328P.
Ich will einfach nur erstmal ein Zeichen an den PC senden.
Das scheitert daran, das der PC zwar registriert das etwas ankommt, aber 
im Hterm wird nur immer irgend ein Bit angezeigt. Ich vermute ein Start 
oder Stopbit. (Siehe Bild Oben).
Ursprünglich habe ich einen normalen 4MHZ Quarz verwendet und die 
Integrierte Schnittstelle im "mySmartUSB Mk2 AVR-Programmer" benutzt.
http://www.produktinfo.conrad.com/datenblaetter/175000-199999/191510-da-01-ml-MYSMARTUSB_AVR_PROGRAMMER_de_en.pdf

Da hatte ich das gleiche Problem. Keiner der User hier, die mir damals 
geantwortet hatten, konnten sich einen Reim darauf machen. Also bin ich 
der Empfehlung gefolgt einen eigenen Max232 und einen Quarzoszillator zu 
verwenden.
Ich habe jetzt eine neue Schaltung aufgebaut, nach dem Vorbild im 
Tutorial:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART
Allerdings habe ich nur Keramikkondensatoren am MAX232 verwendet. Laut 
Datenblatt sollte das aber gehen.
http://www.conrad.de/ce/de/product/1047881/Linear-IC-MAX232IN-PDIP-16-Texas-Instruments?queryFromSuggest=true

Bin mittlerweile echt Deprimiert, weil ich schon einiges an Geld in mein 
Projekt gesteckt habe und es jetzt daran scheitert.

Hoffe auf Hilfe

Hier noch der Quellcode:
1
#include <avr/io.h>
2
#include <stdlib.h>
3
/* 
4
  UART-Init: 
5
Berechnung des Wertes für das Baudratenregister 
6
aus Taktrate und gewünschter Baudrate
7
*/
8
 
9
#ifndef F_CPU
10
11
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
12
#define F_CPU 4000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
13
                         // Ohne ergeben sich unten Fehler in der Berechnung
14
#endif
15
 
16
#define BAUD 9600UL      // Baudrate
17
 
18
// Berechnungen
19
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
20
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
21
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
22
 
23
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
24
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
25
#endif 
26
27
//UART-Schnittstelle Initialisieren
28
void uart_init(void)
29
{
30
  UBRR0H = UBRR_VAL >> 8;
31
  UBRR0L = UBRR_VAL & 0xFF;
32
  
33
  UCSR0B = (1<<TXEN0);  // UART TX einschalten
34
  //UCSR0C |= (1<<UCSZ00) | (1<<UCSZ01); // UART 8-Bit Modus
35
  UCSR0C = (1<<USBS0)|(3<<UCSZ00);
36
}
37
38
39
//Atmega328P
40
int uart_putc(unsigned char c)
41
{
42
  while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich */
43
  {
44
  }
45
  
46
  UDR0 = c;                      /* sende Zeichen */
47
  return 0;
48
}
49
50
//Hauptprogramm
51
int main(void)
52
{
53
  //Einmalig abgearbeite Kommandos
54
  DDRC |= (1<<PB1);        //Definiert PortC Pin 5 als Ausgang
55
  DDRB &= ~(1<<PB0);        //Definiert PortB Pin 0 als Eingang
56
  uart_init();  //UART-Initialisierung aufrufen
57
58
  //Lokale Variablen
59
  uint8_t Flanke = 0;
60
  char y;
61
  
62
  //Zyklisches Programm
63
    while(1)
64
    {
65
    /*if(PINB & (1<<PINB0)){
66
      PORTB |= (1<<PB1);
67
      if(Flanke==0){
68
        y = 6 + '0';
69
        uart_putc('1');
70
        Flanke = 1;
71
      }
72
          
73
    }else{
74
      Flanke=0;
75
     } */
76
    uart_putc('x');  
77
         
78
    }
79
}

von Hubert G. (hubertg)


Lesenswert?

1
UCSR0C = (1<<USBS0)|(3<<UCSZ00);

Sind zwei Stoppbit gewollt?

von mike (Gast)


Lesenswert?

Hubert G. schrieb:
> Sind zwei Stoppbit gewollt?

Das hat beim Senden noch nie geschadet, obwohl die Frage bei Systemen 
mit HW- und Doppelpuffer für Senden und Empfang natürlich berechtigt 
ist.

von mike (Gast)


Lesenswert?

Treter_Peter schrieb:
> Also bin ich
> der Empfehlung gefolgt einen eigenen Max232 und einen Quarzoszillator zu
> verwenden.

Und du bist sicher, dass die Fuses von deinem µC so eingestellt sind, 
dass der externe Takt auch tatsächlich genutzt wird? Oder läuft dein µC 
friedlich mit RC-Oszillator und 1:8 Vorteiler, was dann zu einer 
Baudrate von 2400 Bd führen würde. Stell doch dein HTerm mal auf 2400 Bd 
und dann sende vom µC aus "UUU".

von Treter_Peter (Gast)


Lesenswert?

Oh man ich glaub's nicht.
Mike der Tipp mit dem internen Teiler war Gold richtig.
Der Takt vom Quarz wurde zwar verwendet, aber intern nochmal geteilt.
Das Programm welches ich zum Programmieren benutze, hat mir dieses Bit 
für den Teiler immer mit gesetzt. Hab die Fusebits jetzt Manuell gesetzt 
und siehe da es funktioniert.
Und ich hab da ewig rumgesucht. Kopfschüttel

Danke an alle. Jetzt bin ich wieder Motiviert, weiter zu machen.

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.