Forum: PC-Programmierung Probleme mit RS232 Zugriff


von Fabian (Gast)


Lesenswert?

Ich habe Probleme mit der RS232 Übertragung.
Und zwar möchte ich Daten zwischen ATMEGA8535 und PC über die RS232
austauschen.

Mit Borland Builder C++ kann ich ohne Probleme die Daten empfangen.
Wenn ich das hyperterminal benutze kann ich keine Daten sehen.
Ich habe auf der Mikrocontroller Seite ein C# Projekt gefunden, mit dem
man auch auf die RS232 zugreifen kann
(Projektname C#: lastporttest).Leider funktioniert es damit auch nicht.
Nur unter Borland Builder kann ich die Daten empfangen.
Habt ihr eine Ahnung wo da der Fehler liegt?

ATMEGA8535 C-Codeausschnitt:
//*****************************************************
interrupt [USART_RXC] void uart_rx_isr(void)
{
  Zeichen = UDR;
}

interrupt [USART_TXC] void uart_tx_isr(void)
{
}

//Hauptprogramm
void main(void)
{
DDRB = 0xFF;
PORTB = 0;
DDRD = 0x00;
PORTD = 0;
PORTC_output();
t6963cinit();
LCD_Clear_Graphics();
LCD_Clear_Text();

UCSRB=0xD8;
UBRRL=0x33;

ACSR=0x80;

#asm("sei")

while (1)
      {
        delay_ms(100);
        //lcd_printfz(0, 3,"Zeichen:%2d",Zeichen);

        putchar('X');
      };
}

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

Du redest die ganze Zeit von C# und Borland und gibst und dann ein
AVR-Programm? Irgendwo past das nicht..
Wenn auch nur ein PC-Programm die Daten empfangen kann liegt der Fehler
zu 99,9% am PC Programm, denn dann sendet der AVR ja auf jeden Fall.

Also stell am besten mal die PC-Software hier rein

von Fabian (Gast)


Angehängte Dateien:

Lesenswert?

Ok im Anhang befindet sich zwei Programme mit Quellcode.
1. Borland Builder
2. C#

von Dirk (Gast)


Lesenswert?

Das Problem mit Hyperterminal hatten schon einige hier im Forum.
Probier mal das Bray Terminal oder ein anderes Programm aus.

von Fabian (Gast)


Lesenswert?

Ja aber mit Borland Builder C++ (siehe Sourcecode) funktioniert es ja.
Mit C# klappt es nicht (siehe Sourcecode)

von Fabian (Gast)


Lesenswert?

Ich möchte eigentlich mit C# Daten von der RS232 senden und empfangen
können. Gibt es hier im Forum jemand, der dies schon einmal gemacht
hat?

von Fabian (Gast)


Lesenswert?

Also mit C# funktioniert es jetzt auch.
Vom Controller aus wollte ich mal ein Zeichenauf den PC senden. Mit C#
oder auch Borland Builder C++ bekomme ich nur komische Zeichen.

Ich sende in meiner While Schleife vom Controller
z.B. den Buchstaben A

while (1)
      {
        delay_ms(100);
        putchar("A"); //sende A nach PC
      };
}

Was mache ich da systematisch falsch? WIe kann ich das A auf dem
PC(C#)
sehen?

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

putchar("A");
sollte
putchar('A');
heissen. Keine Ahnung, ob es daran liegen kann. Oben hattest du es ja
richitg...
Empfängst du denn mit einem Terminal-Programm das richtige Zeichen?
Evtl Baud-rate falsch?

von Fabian (Gast)


Angehängte Dateien:

Lesenswert?

Also ich verstehe die Welt nicht mehr.
Den ganzen Morgen mache ich schon an der blöden RS232 Verbindung rum.
Ich kann auf dem Controller sowie Terminalprogramm bzw. Borland Builder
C++ Programm nur Müll empfangen.

Ich brauche dringend Unterstützung, sonst sitze ich hier noch sinnlos
meherer Tage lang!

Zusätzlich habe ich noch das Programm am Controller, wenn ich eine
Taste drücke, dann sendet der COntroller gleich mehrere Zeichen.
Ich habe in meinem C Programm einen Timer eingebaut. Dort drin habe ich
auch die Funktion tasten() reingesetzt, damit die Tasten(Eingänge)
entprellt werden.
Aber so wie es aussieht funktioniert das auch nicht.

von Fabian (Gast)


Lesenswert?

Kann mir hierzu wirklich keiner Helfen?

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

Sorry, hab keine AHnung von C# :/

von Fabian (Gast)


Lesenswert?

Ok unter Borland Builder funzt es auch nicht so wie es will.
Hab ich hir in meinem C Code was falsch gemacht?

ATMEGA8535 C-Codeausschnitt: (externer Quarz 8Mhz)
//*****************************************************
interrupt [USART_RXC] void uart_rx_isr(void)
{
  Zeichen = UDR;
}

interrupt [USART_TXC] void uart_tx_isr(void)
{
}

//Hauptprogramm
void main(void)
{
DDRB = 0xFF;
PORTB = 0;
DDRD = 0x00;
PORTD = 0;
PORTC_output();
t6963cinit();
LCD_Clear_Graphics();
LCD_Clear_Text();

UCSRB=0xD8;
UBRRL=0x33;

ACSR=0x80;

#asm("sei")

while (1)
      {
        delay_ms(100);
        lcd_printfz(0, 3,"Zeichen:%2x",Zeichen);
        if (PIND.1 == 1)
          {
           putchar('X');
          }
      };
}

Mein uC kann von der RS232 kein Zeichen empfangen.
Wenn ich den Taster (PIND.1) betätige dann bekomme ich auf einmal viele
Daten auf dem PC angezeigt. Liegt es daran, dass ich den taster nicht
entprellt habe? Wie kann ich meinen Taster softwaremäßig entprellen
ohne interrupt Routine? Geht da überhaupt?

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

Ein einfache, wie schlechte Entprellung ist es, nach jedem erkannten
Tastendruck eine Pause von wenigen ms zu machen. Zum testen ok, gegen
Ints aber weit unterlegen.

Welche Baudrate hast du denn eingestellt und welche Frequenz hat dein
Quarz? Evtl ist ja der Fehler so gross, dass nichts richiges ankommen
kann

von Jens D. (jens) Benutzerseite


Lesenswert?

>>Ich kann auf dem Controller sowie Terminalprogramm bzw. Borland
>>Builder
>>C++ Programm nur Müll empfangen.


Wenn es schon nicht mit dem terminalprogramm funktioniert, wieso dann
mit dem C Programm??


Kontrollier evtl mal den quarz und die RS232 einstellungen im µC / PC

Gruss

von Fabian (Gast)


Lesenswert?

Ich verwende in der Schaltung einen 8Mhz QUarz.

Die Einstellung für die RS232 erfolgt hiermit:
UCSRB=0xD8;
UBRRL=0x33;

Dies habe ich von einem Bekannten so übernommen.
Leider komme ich mit dem Datenblatt vom ATMEGA8535 nicht richtig klar.
Wo geht da eigentlich genau hervor wie ich welche Register mit welchen
Werten befüllen muss ((Baudrate 9600))??

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.