RS232 Schnittstelle Fehlersuche ?

Neuuser

Mitglied
11. Aug. 2008
465
0
16
Sprachen
Hallo Leute,
wie kann ich am einfachsten bei einem Programm, mit der RS232 Schnittstelle den Ablauf beobachten, für Fehler suche ?

Gruß Neuuser M.
 
Hi Neuuser.

Das Wesen aus dem Mesozoikum wird dir bald eine laaaange Antwort geben, in der Zwischenzeit frag ich mal wie es mit deinem Servo-Problem aussieht. :D
Hast du schon Fortschritte gemacht?

Zum Thema, zeitkritische Sachen kann man mit der RS232 nur schwer überwachen, was du aber machen kannst, ist in deinem Programm ein paar Abfragen, ob alles so läuft wie es soll, einzubauen und dementsprechend "Debug-Ausgaben" auf der 232 zu machen.
 
Hallo Simon,
ach ja, nein, ehrlich gesagt, ich habe es machen wollen, aber dann kam mir der Gedanke das es einfacher wäre die Servos weg zu lassen, ich habe mir zwei große Strömungsventile auch bekannt als Rückschlagventile gebaut, so erspare ich mir die Konstruktion mit den Ventilmotoren.
aber auch das Programm für die Servos ;)

Komisch ist es Trotzdem, in mein Heizungprogramm was sogar etwas größer ist, habe ich auch damals die vorgefertigte Version für Servos verwendet und
dort bekam ich keine Probleme damit.

was du aber machen kannst, ist in deinem Programm ein paar Abfragen, ob alles so läuft wie es soll,

genau das hatte ich vor :} aber wie.

Gruß Neuuser M.
 
genau das hatte ich vor :} aber wie.
Du meinst wie du abfragen sollst ob alles richtig läuft?
Das hängt davon ab was du machen willst, oder was der Code bewirken soll.

Aber keine Sorge, das Wesen aus dem Mesozoikum kommt gleich und wird dich mit einem langen Text erschlagen.
 
Hallo Micha,

ich möchte kurz auf Deine Frage mit der RS232 eingehen. Ich habe jetzt aktuell Deine HW nicht genau im Kopf aber prinzipiell kann ich folgendes dazu sagen:

1. Aufbau der entsprechenden RS232-HW
Zur Kommunikation mit dem PC benötigst Du den MAX232 den Du direkt an den ATmega hängen kannst. Du musst entscheiden ob Du die HW-RS232 oder die SW-RS232 von BASCOm nutzen möchtest.
Die HW-RS232 ist besser da hier alles was das Protokoll betrifft vom Mega gemacht wird. Dazu müssen aber die Pin's TxD und RxD vom Mega noch frei sein. Diese PIN's kannst Du direkt zum MAX232 leiten. Vom MAX232 geht es prinzipiell direkt auf die 9-polige SUB-D Buchse und von dort zum PC.
Der MAX232 ist ein treiberbaustein für RS232 welcher aus den 5V-Pegeln des ATmegas durch eine Ladungspumpe mit 4 x 1µ-Elkos das 12V RS232-Signal erzeugt und umgekehrt. Um den MAX232 benötigst Du nur wenig Pheripherie drum herum.

Ein Beispiel wie so etwas aussehen kann findest Du in allen meinen HW-Projekten:
http://www.avr-praxis.de/forum/showthread.php?t=103
http://www.avr-praxis.de/forum/showthread.php?t=160
http://www.avr-praxis.de/forum/showthread.php?t=266

2. RS232 und BASCOM
Es gibt einen simplen Weg die RS232 unter BASCOm zu nutzen.
Dabei musst Du mit
Code:
$baud = 38400
die RS232 auf die gewünschte Datenrate konfigurieren. Das ist auch schon alles. Du kannst dann an jeder Stelle in Deinem Programm wo Du etwas auf die RS232 schicken möchtest mit dem Befehl
Code:
Print "Relais_auf_an"
Daten über die RS232 zum PC senden.

Auf Seite des PC's benötigst Du ein ganz normales Termin-Programm wie z.B. Hyperterminal oder DockLight.

Die etwas kompliziertere aber flexiblere Variante in BASCOM die RS232 zu konfigurieren st die folgende:

Code:
$regfile = "m128def.dat"
$crystal = 16000000

Config Com1 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com2 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

Open "com1:" For Binary As #1
Open "com2:" For Binary As #2

Do
   Print #1 , "test serial port 1"
   Wait 2
   Print #2 , "test serial port 2"
Loop

Close #2
Close #1

End

Du hast damit deutlich höhere flexibilität, kannst ggf. auch zwei RS232 konfigurieren.

Und .... tatatata ..... Du kannst auf diesem Weg die Software RS232 von BASCOM konfigurieren. BASCOM bietet die Möglichkeit eine in SW gegossene RS232 Emulation zu nutzen. Du kannst dabei die PIN's des MAX an jeden beliebigen PIN des Megas hängen. Der rest macht BASCOM. Ich brauche Dir aber an dieser Stelle nciht zu sagen, dass dies deutlich !!! auf Kosten der Prozessorperfomance geht. Daher rate ich Dir die HW RS232 zu nehmen.

Bei meinem Projekt Zisternenfüllstandsanzeige habe ich für die Kommunikation zwischen Master und Slave die HW-RS232 verwendet. Zur Ausgabe von Traces habe ich die SW-RS232 verwendet. Dort kannst Du Dir im Detail ansehen wie es funktinier.

http://www.avr-praxis.de/forum/showthread.php?t=266

Das ganze sieht ein bissle kompliziertes aus, ist es aber nicht.

Code:
' Hardware RS232 Kanal 1 konfigurieren = interne RS232
Config Com1 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 128
Open "com1:" For Binary As #1

' Software RS232 Kanal 2 und 3 konfigurieren = externe RS232
' Anschluss an Mega16 über PORTB.0 für RxD und PORTB.1 für TxD.

' Achtung: Tracesausgaben zum PC erfolgen über SW-RS232. Die HW-RS232 wird zur
' Kommunikation mit dem Slave verwendet

' Öffnen eines Transmit-Kanals (#2) für Ausgaben
Open "comb.1:38400,8,n,1" For Output As #2

' Öffnen eines Receive-Kanals (#3) für Eingaben
Open "comb.0:38400,8,n,1" For Input As #3

Der Trick besteht bei der SW-RS232 eigentlich nur darin, dass Inpout und Output getrennt behandelt und als separate Kanäle konfiguriert werden müssen.


Ich hoffe das hilft Dir zunächst weiter.

Viele Grüße,
Markus
 
Hallo Markus,

Ich habe doch das kleine Board noch von Roland Walter, da ist ein Max232ACPE drauf, das müsste doch so passen, denke ich.
Ach so ich muss vor jeden Port oder Anweisung die Zuordnung Print #1 , " Port ---Anweisung" schreiben, damit man es sieht was es macht.

Aber ich kann den Print #1 doch so oft verwenden wie ich möchte, oder.
Dann werde ich das mal so probieren, danke erstmal.

Gruß Neuuser
Micha
 
Hi Micha,

Ach so ich muss vor jeden Port oder Anweisung die Zuordnung Print #1 , " Port ---Anweisung" schreiben, damit man es sieht was es macht.

Aber ich kann den Print #1 doch so oft verwenden wie ich möchte, oder.
Dann werde ich das mal so probieren, danke erstmal.
das #1 nennt man auch "Stream" oder "Datenstrom" oder so.
mit dem ...
Open "com1:" For Binary As #1
sagst du das er den Datenstrom #1 an die Schnittstelle COM1: binden soll
und das Binärdaten fließen sollen.
Bei jeder Aus- oder Eingabe, die diese Schnittstelle (COM1:) verwenden soll
gibst Du dann bei dem Print- oder Input-Befehl oder so dann das #1 für den
enstsprechenden Datenstrom an.

Bei anderen Sprachen hast Du statt des #1 auch "Benannte Datenströme".
Dann sieht das zB auch so aus ...
Print LOGDATEI,"Die Anwendung wurde beendet";
oder ...
Print SERIELL,"abc test";
oder sowas. Ist dann etwas übersichtlicher. Das mit den # ist eigentlich noch
die uralte ursprüngliche erste Version, die für so etwas verwendet wurde.
Einfach umsusetzen aber etwas unübersichtlich ;)

Gruß
Dino
 
Hallo Micha,

Du solltest Dir mal den Schaltplan Deiners Boards ansehen, wenn er verfügbar ist. Ich nehme aber an, dass dort die TxD und RxD schon zum MAX geführt ist. Ggf. musst Du vielleicht noch Jumper richtig setzen.

In BASCOM sollte dann aber $baud = 38400 reichen und mit Print ohne Angaeb von #1 oder #2 usw. wird immer das Standardinterface benutzt.

Print kannst Du so oft verwenden wie Du willst!

Achtung: Mit internem Takt beim Mega hatte ich schon Probleme dass die Geschwindigkeit nicht richtig gestimmt hat und beim PC kam nur Schrott an.

Was für einen SUB-D hast Du denn? Weiblich oder Männlich. Wenn Dein Board einen männlichen Stecker hat dann kann man fast davon ausgehen, dass Du ein Null-Modem-Kabel benötigtst. Bei 9-poligen SUB-D musst Du PIN2 und PIN3 kreuzen wobei PIN5 die Masse liefern sollte und 1:1 verbunden wird. Sonst verstehen sich PC und Board auch nicht.

Aber wie gesagt, ein Blick in den Schaltplan des Boards sollte helfen.

Grüße,
Markus
 
Hallo Dino und Markus,
Ich nehme aber an, dass dort die TxD und RxD schon zum MAX geführt ist. Ggf. musst Du vielleicht noch Jumper richtig setzen.

habe ich zuvor schon gemacht.

Ich denke mal ich habe ein Männlichen anschluss am Board und verwende daher ein 0-Modem Kabel, die Verbindung habe ich nun schon herstellen können mit der 9600 Übertragung.
Es kommt auch was sinnvolles an 0 oder 1, wen ich es so im Programm schreibe-

Print #1 , Relais_1
Wait 2
Print #1 , Relais_2
Wait 2

aber da hat man keinen Bezug was gerade geschaltet wird, wen ich aber nun es so mache,

Print #1 , Relais_1 "Relais_1 an"
Wait 2
Print #1 , Relais_2 "Relais_2 an"
Wait 2

dann kommt mecker,:rolleyes:

wie kann ich das noch mit anzeigen lassen.

Gruß Micha

ah, ich habe es gefunden wie, habe mal etwas rumprobiert,

Print #1 , Relais_1 ; " relais 1"
Wait 1
Print #1 , Relais_2 ; " relais 2"
Wait 1

Der Mega hängt gewaltig durch, wen man jedesmal 2 Sekunden warten lässt.
Könnte man auch noch die zeit dahinter anzeigen lassen ?

Gruß Micha
 
Hi Micha,

ah, ich habe es gefunden wie, habe mal etwas rumprobiert,

Print #1 , Relais_1 ; " relais 1"
Wait 1
Print #1 , Relais_2 ; " relais 2"
Wait 1

Der Mega hängt gewaltig durch, wen man jedesmal 2 Sekunden warten lässt.
Könnte man auch noch die zeit dahinter anzeigen lassen ?
kein Wunder bei 1sec Wartezeit. Das sind Warteschleifen die Prozessorzeit
verbraten. In der Zeit macht der Prozessor nix anderes als zu warten. Wenn
man in der Zeit was anderes machen will, muß man mit Interrupts arbeiten
oder sich einen Sheduler bauen (quasi ein Multitasking ;) )

Gruß
Dino
 
Hi Micha,

einen Sheduler bauen
was ist den das ?
tja ... :rolleyes: ... das ist der Multitasking-Kern :D (grob erklärt)

So etwas hat glaube ich Oskar ? Markus ? Knickohr ? schon mal erklärt und
benutzt.

Der Sheduler ist eine Routine die Zeitkontingente an Programme vergibt.
Ganz einfach kann man sich das bauen, in dem man einen Timer anlegt, der
sagen wir mal alle 100µS einen Interrupt erzeugt. In der Interrupt-Service-Routine
des Timers läßt man eine Taskliste und einen Zeitzähler ablaufen. Man hat also
eine Taskliste, in der angegeben ist, welches Programm wieviele Ticks
(Zeiteinheiten - also Anzahl Aufrufe der Timer-ISR) laufen darf.
Das sieht dann zB so aus ...
Tastaturabfrage - 1 Tick
Sensorenabfrage - 2 Ticks
Ausgabe auf LCD - 1 Tick
...
..
Dann wird also für einen Tick (in dem Beispiel 100µs) die Tastatur abgefragt,
die Sensorenroutine hat 200µs zur Verfügung, ...
Wenn man für bestimmte Wartezeiten - zB 1sec - etwas verzögern will, dann
trägt man das auch in der Liste ein und der entsprechende Programmteil
wird für (1sec / 100µs = ) 1000 Ticks nicht aufgerufen . Die restlichen Teile
haben dann diese Zeit zusätzlich zur Verfügung. Man kann damit dann
feste Raster aufbauen (alle 10ms) oder man verteilt Rechenzeit, oder, oder ...

So ein Sheduler kann recht kompliziert werden ;) je nach Anforderungen die
man da hat. Aber ne schöne Sache um die Prozessorleistung optimal nutzen
zu können.

Gruß
Dino
 
Hi Dino,
ja eine interessante und vielleicht auch sehr gute Sache für die Optimierung des ICs, aber das lasse ich glaube lieber offen.:rolleyes:
Ich will ja nur ein Fehler finden, danach kommt ja alles wieder raus.

Gruß micha
 
Hi Micha,

ichglaube wir beide hatten uns schon mal über einen Mini-Scheduler unterhalten. Ansatzweise hattest Du sowas ja schon fast mal implementiert ;)

Die Idee von Dino ist genial und sehr hilfreich, wenn man viele Dinge gleichzeitig machen und steuern und üebrwachen will. Mann muss sich dann aber auch sehr schnell Gedanken über kooperatives und preemtives Multitasking machen und dann wird es x-fach kompliziert.

Ich selbst realisiere einfache Scheduler auch über einen Timer, der mit via Interrupt eine Variable hochzählt. In der Hauptschleife gibt es dann eine Funktion "Scheduler" die ich immer aufrufe, wenn der Prozessor nix zu tun hat. In der Scheduler-Funktion habe ich Funktionscounter mit denen ich prüfe, ob sie abgelaufen sind. Natürlich müssen diese vorher initialisiert werden und auch nach Abarbeitung neu gesetzt werden. Damit lassensich aber schnell und einfach Steuerunfunktionen übernehmen welche nicht zeitkritisch sind. Zeitkritisch dürfen sie nicht sein da man einen gewissen Jitter bzw. Latenzzeiten beim Aufruf der Funktion hat.

Grüße,
Markus
 
Hallo Markus,
ja ich glaube euch ja das es eine gute Sache ist mit er eingesetzten Multitasking für den IC, aber ich glaube dafür brauche ich viel zeit um das zu realisieren.

ichglaube wir beide hatten uns schon mal über einen Mini-Scheduler unterhalten. Ansatzweise hattest Du sowas ja schon fast mal implementiert

Ja wie hatten uns schon mal dahin unterhalten, aber kann mich nicht entsinnen irgendeine Variante dahin versucht zu haben, oder :eek: .

Gruß Micha
 
Hi Micha,

doch, ich glaube schon. Kannst Du Dich an die Variable erninnern die wir im Sekundentakt hochgezählt haben? Es gabe noch eine andere Variable welche wir für die 30 Minuten verwendet hatten und die haben wir gegen den Sekundentakt geprüft. Im grunde war das nicht anderes nur in sehr stark vereinfachter Version.

Nur leider gab es Wechselwirkungen im Programmfluss und ich glaube Du hattest es wieder ausgebaut. Aber ist ja egal. Ich hoffe Du hast grob verstanden was wir mit dem Scheduler wollen, selbst wenn es dafür auch andere Lösungswege gibt.

Grüße,
Ma
 
Hi Markus,
ach so ja, das meinst du, ich habe die Variante da etwas verändert wo das Problem mit den Zähler war, da ging es dann.

Gruß Micha
 
Programmkontrolle über RS 232

Hi
Es ist schon ein paar Tage her, da habe ich hier ein Programm eingestellt, welches die Variablenbereiche eines µC in den Rechner einliest und in verschiedenen Formaten ausgibt (Char, Integer, Bits). Es ist möglich Einzelzugriff oder zyklischer Zugriff (ca.10ms)
Das Programm ist in Delphi geschrieben. Ich benutze es, wenn ich nicht weiß, warum der µC mal wieder andere Ansichten vom Programmablauf hat.
Die Zip-Dateien enthalten eine Beschreibung in Word und das Exe-File. Wenn ich mal ganz viel Langeweile habe, werde ich auch das Beschreiben der Variablen ermöglichen... aber bisher ist's lediglich ein Blick auf die aktuellen Werte. Wer Interesse hat, ich stell's hier noch mal rein. Wär nett, wenn mal eine Rückantwort käme (ehrliche und konstruktive Kritik ist hilfreich)
Viel Spaß
Gruß oldmax
 

Anhänge

  • OpenEye_Exe.zip
    177,2 KB · Aufrufe: 11
  • OpenEye_Doku.zip
    134,9 KB · Aufrufe: 9
Hi
Nun ist ja schon ein wenig Zeit vergangen und es würd mich mal interessieren, ob das Tool OpenEye nützlich ist und was evtl noch besser wäre. So ganz ohne Rückinfo ist's ein bischen frustrierend.
Gruß oldmax
 
Hi oldmax,

denn will ich dich mal nicht ganz so ohne Info lassen :)

Ich hab mir dein Werk mal eben schnell (ganz kurz) angesehen. ...
Für meine Assembler-Programme werde ich es wohl nicht gebrauchen können,
da ich da wild im SRAM und den Registern hin und her speicher ;) Aber für
Hochsprachen ist das bestimmt recht interessant. Ich mache meine Debug-
Ausgaben eigentlich immer auf nem LCD das sowieso meißtens dran ist.
Also für mich leider nicht interessant. Laß dich davon aber nicht in deinem
Werk bremsen. Es sieht soweit recht interessant aus. Im Moment hat sich
wohl nur noch keiner gefunden der es ausprobiert hat. Das könnte ne Zeit
dauern. Weißt ja ... Gut Ding will Weile haben ;) ... gib deinem Werk also
etwas Zeit. Es muß nur erst mal jemand kommen, der in einer Hochsprache
ein Problem mit seinem Programm hat. Der muß sich aber leider erst mal finden.
Also nicht ungeduldig werden ...

Und wenn keiner was zu motzen hat ist das doch auch schon mal was gutes :)

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)