RS 232-Verbindung & MAX202E mit dem PIC16F877A als Standard history menue Letztmalig dran rumgefummelt: 31.01.15 08:38:47
Das Thema hier nun ist die serielle Datenübertragung nach RS232-Standard zwischen Mikrocontrollern der PIC-Familie und dem PC. „Seriell" bedeutet hier, dass die Bits nacheinander über die gleiche Leitung übertragen werden. Ein anderes Verfahren wäre die gleichzeitige Übertragung von beispielsweise acht Bits über acht parallele Leitungen. Der RS232-Standard wurde für die serielle Datenübertragung über kurze Entfernungen entwi­ckelt, sein Name ist die Kurzform von „Recommended Standard #232" (... ursprünglich war der RS232-Standard für die Überbrückung von Entfernungen bis 15 m vorgesehen.). Der PC kann die übertragenen Daten verarbeiten und in andere Anwendungen übernehmen. Das ist zum Bei­spiel bei Domotik-Anwendungen von Vorteil, bei denen der PC die Einstellungen und Mess­werte der verschiedenen Module auf den Bildschirm setzt. Nach eventuellen Änderungen und Anpassungen mit Hilfe des PCs kann der PC ausgeschaltet werden, danach arbeiten die Module selbstständig.
Alle Projekte hier nutzen die Durchleit- oder „Passthrough"-Fähigkeit des Wisp-Programmers, der zum Hardware-Paket gehört. Wenn er nicht im Compiler-Modus arbeitet, kann er eine unmittelbare Verbindung zwischen dem PIC-Mikrocontroller und dem PC herstellen. Falls Sie einen anderen Programmer ohne diese Eigenschaft besitzen, können Sie die zugehörigen Beispiele nicht praktisch erproben, es sei denn, Sie erweitern Ihre Hardware. Diese Möglichkeit wird in Kapitel 6.4 beschrieben.

1. Serieller Zähler
2. Stiller Alarm
3. In-circuit Debugging
4. System-Debugging
5. Hardware zur RS232-Steuerung
6. Verwandte Themen

PIC-Schaltungen

Logo deRS-232-Schnittstelle

inhaltlich auf korrektem Stand - evtl. partiell unvollständig ;-)

Informatik-Profi-Wissen

Quellen:

der Klassiker: die RS 323-Schnitttstelle


1. Serieller Zähler

Ziel dieses Projekts ist das Herstellen einer seriellen Datenverbindung nach RS232 -Standard zwischen einem PIC-Mikrocontroller und einem PC. Wir wollen kontinuierlich den Stand eines mit dem Mikrocontroller realisierten Zählers zum PC übertragen. Über die Verbindung können natürlich auch beliebige andere Daten übertragen werden.
Technischer Hintergrund:

Im Mikrocontroller PIC16F877, von dem wir auch in diesem Projekt Gebrauch machen, ist bereits ein Hardware-Modul für RS232-Verbindungen integriert (siehe Kapitel 11). Dieses Modul werden wir hier nicht verwenden, weil es die PIC-Anschlüsse c6 und c7 fest belegt. Da die RS232-Verbindung auch zum Debuggen von Programmen genutzt werden soll, ist es sinnvoller, die gleichen Anschlüsse wie der Programmer zu benutzen. Der Programmer belegt die Anschlüsse b6 und b7. Unter dieser Voraussetzung kann die serielle Verbindung über den Programmer hergestellt werden, ohne dass Leitungsführungen geändert werden müssen.
Um unser Ziel zu erreichen, benötigen wir ein Programm, das auf dem Mikrocontroller eine RS232-Schnittstelle nachbildet (emuliert). Dieses Programm müssen wir nicht selbst schreiben, denn es existiert bereits, es heißt „serial software.jal " und ist Bestandteil der Bibliothek „16f877 bert .jal". Mit dieser Bibliothek stehen folgende Kommandos zur Verfügung:

allgemeiner Funktionsaufruf Beschrebung Anwendungsbeispiel
serial sw baudrate Stellt die Baudrate der RS232-Verbindung ein.  
allgemeiner Funktionsaufruf Beschrebung Anwendungsbeispiel
serial sw invert Invertiert das Signal.  
allgemeiner Funktionsaufruf Beschrebung Anwendungsbeispiel
serial_sw_write_init Initialisiert das Schreiben über die RS232-Verbindung (der PIC sendet Daten).  
allgemeiner Funktionsaufruf Beschrebung Anwendungsbeispiel
serial_sw_read_init Initialisiert das Lesen über die RS232-Verbindung (der PIC empfängt Daten).  
allgemeiner Funktionsaufruf Beschrebung Anwendungsbeispiel
serial sw read (data) Empfange Daten und speichere sie in der der Variablen „data" .  
allgemeiner Funktionsaufruf Beschrebung Anwendungsbeispiel
serial sw write (data) Sende den Inhalt der Variablen „data".  
RS232-Verbindung:
 
Die serielle Routine der Bibliothek ist flexibel, sie kann für jeden I/O-Anschluss des Mikrocontrollers und für diverse Baudraten konfiguriert werden. Da die Kommunikation über den Programmer läuft, ist die maximale Baudrate begrenzt. Als Standard ist 1200 Baud eingestellt, die maximale Übertragungsgeschwindigkeit beträgt 115200 Baud.
 
const serial_sw_baudrate = 1200
const serial sw invert = false

Danach müssen die zu benutzenden PIC-Anschlüsse definiert werden. Beim Programmieren des Mikrocontrollers ist b7 der Ausgang, b6 ist der Eingang. Für die RS232-Kommunikation soll die Konfiguration identisch sein:

var volatile bit Serial SW_out-pin is pin b7
var volatile byte Serial SW out_port is portb const Serial_SW_out nr = 7
var volatile byte Serial_SW out buffer is -port b_shadow
var volatile bit Serial_SW_out direction is pin b7 direction
var volatile bit Serial_SW_in_pin is pin b6
var volatile byte Serial_SW_in-port is portb const Serial_SW_in_nr = 6
var volatile byte Serial SW in buffer is _port b shadow
var volatile bit Serial SW_in direction is pin_b6 direction

Damit ist die Konfiguration abgeschlossen.

Die Software:

Das folgende kurze Programm bildet einen Zähler nach, es besteht lediglich aus einer Endlosschleife. Bei jedem Schleifendurchlauf wird die Variable „counter" um 1 erhöht, anschließend wird ihr aktueller Wert zum PC übertragen.

--JAL 2.0.4
include 16f877 bert
--define variables
var byte counter

forever loop
  counter = counter + 1
  serial sw write(counter)
end loop
Die Schaltung:

Die Schaltung kommt mit dem Minimum an Bauelementen aus, weil die RS232-Verbindung über den Programmer verläuft und keine zusätzliche Hardware benötigt wird. Aus diesem Grund wird diese Verbindung auch häufig zum Debuggen benutzt.
Wie die Schaltung auf der Steckplatte aussieht, zeigt das folgende Foto. Die langen Leitungen ganz links im Bild gehören zum Programmer, die grüne und die blaue Leitung sind die RS232-Leitungen zum PC.

Schaltung des seriellen Zählers


2. Stiller Alarm

Drei Alarmkontakte sind in einer Leitungsschleife hintereinander geschaltet. Bei Alarm wird der Ort des auslösenden Kontakts auf dem PC-Bildschirm angezeigt.
Technischer Hintergrund:

Das Alarmsystem misst den Widerstand der Leitungsschleife. An drei gefährdeten Orten wie zum Beispiel Tür- oder Fensterrahmen sind Alarmkontakte angebracht. Im Ruhezustand sind die Kontakte geschlossen, sie öffnen, wenn die Tür oder ein Fenster geöffnet werden. Jedem Alarmkontakt ist ein Widerstand parallel geschaltet. Da die einzelnen Widerstände unterschiedliche Werte haben, lässt sich durch Messen des Leiterschleifen-Widerstands feststellen, welcher Kontakt den Alarm ausgelöst hat.

Magnetkontakt an einer Schiebetür

Die Widerstände der Leiterschleife bilden zusammen mit einem vierten Widerstand einen Spannungsteiler. Vom Mikrocontroller wird die am vierten Widerstand liegende Spannung gemessen.

Leitungsschleife als Spannungsteiler

Wenn beispielsweise S2 öffnet, besteht der Spannungsteiler aus dem nach Masse geschalteten 10-kΩ-Widerstand und dem zu S2 parallel liegenden 33-kQ-Widerstand. Die Spannung am Eingang des Mikrocontrollers lässt sich leicht berechnen:

Die Spannung 1,14 V entspricht dem vom A /D-Wandler gelieferten digitalen Wert 58. Auf gleiche Weise lässt sich der digitale Wert für alle Alarmzustände berechnen:

Alarmkontakt Spannung Digitaler Wert
alle geschlossen 5,00 V 255
S1 geöffnet 4,84 V 247
S2 geöffnet 1,14 V 58
S3 geöffnet 2,50 V 128
Durch Messen der Spannung überwacht der Mikrocontroller vor Ort die Alarmkontakte, die digitalen Messwerte sendet er über die serielle Verbindung kontinuierlich zum PC. Der PC stellt die Informationen auf dem Bildschirm dar. Im Fall eines Alarms, wenn also mindestens ein Kontakt offen ist, lässt der Mikrocontroller zusätzlich eine LED aufleuchten:
 
-- signal broken contact
if resist != 255
  pin d2 = high
else
  pin d2 = low
end if

Der PC wertet die übertragenen Messwerte mit einer gewissen Toleranz aus. Abhängig von dem Bereich, in dem ein Messwert liegt, wird er einem der vier möglichen Zustände zugeordnet. Beträgt die analoge Spannung beispielsweise 4,5 V statt 4,84 V, kann trotzdem davon ausgegangen werden, dass Kontakt S1 geöffnet ist.

Die Software:

Der PC wertet die übertragenen Messwerte mit einer gewissen Toleranz aus. Abhängig von dem Bereich, in dem ein Messwert liegt, wird er einem der vier möglichen Zustände zugeordnet. Beträgt die analoge Spannung beispielsweise 4,5 V statt 4,84 V, kann trotzdem davon ausgegangen werden, dass Kontakt S1 geöffnet ist.

-- JAL 2.0.4 include 16f877 bert
-- define variables
  var byte resist
-- define the pins
  pin a0 direction = input
  pin d2 direction = output

pin d2 = low

forever loop
  -- convert analog an a0 to digital
  resist = ADC read_low_res(0)
  -- send resistance to PC
  serial sw write(resist) delay_100ms(1)
  -- signal broken contact
  if resist != 255
  then
    pin d2 = high
  else
    pin d2 = low
  end if
end loop
Das in Visual Basic geschriebene PC-Programm gehört zu unserem Software-Paket, das frei von der Website www.boekinfo.tk herunter geladen werden kann. Wie das nächste Bild zeigt, erscheint auf dem Bildschirm eine schematische Darstellung des gesicherten Raums mit zwei Fenstern und einer Tür. Alle Alarme werden zusammen mit dem Datum'' und der Uhrzeit ihrer Auslösung in einer Liste protokolliert. Im Bild erscheint Fenster 1 in roter Farbe, da Kontakt S1 offen ist. Wenn das Fenster geschlossen wird und der Alarmzustand behoben ist, wechselt die Farbe nach Grün. Der Eintrag in das Alarmprotokoll bleibt natürlich erhalten. Falls nicht alle Protokolleinträge im Fenster dargestellt werden können, lässt sich die Liste mit dem Scrollbalken verschieben.


3. In-circuit Debugging

Debuggen bedeutet Aufspüren der Fehler, die sich in Programme eingeschlichen haben. Hier geht es nicht um Schreibfehler im Programmtext (diese Fehler werden bereits von JALedit gefunden), sondern um logische Programmierfehler. Das Programm läuft nicht oder es läuft zwar, doch es verhält sich anders als beabsichtigt. Für das Debuggen von PIC-Mikrocontroller-Programmen gibt es unterschiedliche Methoden. Die Wahl der Methode hängt vom Erscheinungsbild des Fehlers ab.
Fall 1:
 
Methode Typische Situation
Einfügen eines Kommandos, das eine LED einschaltet. Das Programm hängt an unbekannter Stelle fest, gerät in eine eine Endlosschleife, oder es wird nur ein Teil des Programms ausgeführt. Am Mikrocontroller ist ein Anschluss frei, der die LED steuern kann.

An einer gezielt gewählten Position wird in das Programm ein Kommando eingefügt, das die LED einschaltet. Leuchtet die LED auf, ist das ein Zeichen dafür, dass das Programm bis zum eingefügten Kommando ausgeführt wird. Durch Verschieben des Kommandos im Programm lässt sich die Position einkreisen, an der das Programm hängen bleibt.
Zu Beginn des Programms wird der LED-Anschluss deklariert, beispielsweise Anschluss d3:

pin d3 direction = output
pin d3 = low

Wenn die LED nicht aufleuchtet, wird dieses Kommando nicht ausgeführt. Der Programmierfehler liegt dann weiter vorn im Programm.

Fall 2:
 
Methode Typische Situation
Einfügen von Kommandos, die Zahlenwerte über die serielle Schnittstelle des Controllers ausgeben. Das Programm hängt an unbekannter Stelle fest, gerät in eine  Endlosschleife, oder es wird nur ein Teil des Programms ausgeführt. Die serielle Schnittstelle arbeitet jedoch ordnungsgemäß, sie wird mit dem PC verbunden

Statt des Befehls, der eine LED einschaltet, werden in das Programm an mehreren Stellen Kommandos für die serielle Schnittstelle eingefügt. Die eingefügten Kommandos senden unterschiedliche Zahlenwerte zum PC. Auf dem PC-Bildschirm lässt sich an den Zahlenwerten verfolgen, welche Kommandos ausgeführt werden und wo das Programm hängen bleibt. Einzufügen sind folgende Kommandos:

serial sw write (1)
[-beliebiger Programmteil -]
serial_sw write(2)

Wenn auf dem PC-Bildschirm nur die „1", nicht aber die „2" erscheint, ist das ein Zeichen dafür, dass das Programm zwischen dem ersten und zweiten seriellen Schreibkommando hängen bleibt.

Anmerkung zum Programm: Wählen Sie in MICterm den Display-Modus „Raw", so dass diese Zahl angezeigt wird. Wenn Sie ein anderes Terminalprogramm verwenden, beginnen Sie die Zahlenfolge mit dezimal „48", dies ist der ASCII-Wert von„ 1".

Fall 3:
 
Methode Typische Situation
serial sw write() an bestimmten Positionen im Programm. Das Programm hängt nicht, sondern verhält sich anders als er  wartet. Die RS232-Verbindung mit dem PC ist hergestellt.

Das Programm bleibt nicht hängen, doch der Mikrocontroller verhält sich anders als beabsichtigt. In diesem Fall helfen Positionsmarkierungen im Programm nicht weiter. Statt dessen kann das Ergebnis einer vom Programm durchgeführten Berechnung oder Messung auf dem PC ausgegeben werden. Das Terminalprogramm MICterm stellt Zahlenwerte zur Analyse auch als Grafik oder binär dar.
Falls das Programm über den A/D-Wandler des Mikrocontrollers Eingangsspannungen messen und verarbeiten soll, jedoch kein Ergebnis feststellbar ist, kann die folgende Schleife n das Programm eingefügt werden. Sie gibt Aufschluss darüber, ob Änderungen der Spannung an A/D-Kanal ANO eine Wirkung haben:

forever loop
resist = ADC read low res(0) serial_sw write(resist)
end loop
Fall 4:
 
Methode Typische Situation
data_EEprom write (address,data) bestimmten Positionen  im Programm Das Programm hängt an unbekannter Stelle fest, gerät in eine an Schleife oder führt einen bestimmten Programmteil nicht aus. Die RS232-Verbindung mit dem PC kommt nicht zustand

Wenn die RS232-Verbindung mit dem PC nicht zustande kommt, können die Zahlenwerte ersatzweise in das EEPROM des Mikrocontrollers geschrieben werden. Zum Programmstart wird das EEPROM gelöscht, und zu einem gegebenen Zeitpunkt wird das Programm gestoppt. Anschließend lässt sich mit HEXview feststellen, in welche Speicherplätze des EEPROM Zahlenwerte geschrieben wurden.
Am Programmanfang werden Nullen in die EEPROM-Speicherplätze geschrieben, in die der Mikrocontroller die Zahlenwerte schreiben soll, zum Beispiel in die Speicherplätze 0,1 und 2:

data EEprom Write (0,0)
data EEprom Write (1,0)
data EEprom Write (2,0)

In das Programm werden Kommandos eingefügt, die den Zahlenwert in die vorgesehenen Speicherplätze schreiben:

data EEprom_write (0,1)
[- beliebiger Programmteil -] data EEprom_write (1,1)
[- beliebiger Programmteil -] data EEprom_write (2,1)

Nach dem Programmstart und kurzer Wartezeit kann der Inhalt des EEPROMs mit HEXview betrachtet werden. In Kapitel 10.3 ist ausführlich beschrieben, wie dies geschehen muss. Steht beispielsweise die Zahl „1" in den EEPROM-Speicherplätzen 0 und 1, nicht jedoch in 2, dann deutet das darauf hin, dass das Programm zwischen dem zweiten und dritten Kommando in eine Endlosschleife verzweigt oder auf andere Weise hängenbleibt.
Der Inhalt des EEPROMs bleibt erhalten, auch wenn die Betriebsspannung des Mikrocontrollers abgeschaltet wird." Deshalb ist das Überschreiben der Speicherplätze mit Nullen am Programmanfang unbedingt notwendig, anderenfalls stehen noch die Ergebnisse des vorangegangenen Programmlaufs im EEPROM.
 

Fall 5:
 
Methode Typische Situation
data_EEprom Write (address,data) an bestimmten  Positionen im Programm Das Programm hängt nicht fest, verhält sich aber anders als beabsichtigt. Die RS232-Verbindung mit dem PC kann nicht hergestellt werden.

Wenn das Programm nicht hängen bleibt, aber falsche Resultate liefert, können anstelle eines Zahlenwerts auch Messwerte oder Ergebnisse von Berechnungen im EEPROM gespeichert werden. Nachteilig ist dabei, dass die Programmausführung gestoppt werden muss, um die im EEPROM stehenden Werte zu lesen.

data EEprom Write (0,0)
data EEprom Write (1,0)
data EEprom Write (2,0)

In das Programm werden Kommandos eingefügt, die den Zahlenwert in die vorgesehenen Speicherplätze schreiben:

data EEprom_write (0,1)
[- beliebiger Programmteil -] data EEprom_write (1,1)
[- beliebiger Programmteil -] data EEprom_write (2,1)

Nach dem Programmstart und kurzer Wartezeit kann der Inhalt des EEPROMs mit HEXview betrachtet werden. In Kapitel 10.3 ist ausführlich beschrieben, wie dies geschehen muss. Steht beispielsweise die Zahl „1" in den EEPROM-Speicherplätzen 0 und 1, nicht jedoch in 2, dann deutet das darauf hin, dass das Programm zwischen dem zweiten und dritten Kommando in eine Endlosschleife verzweigt oder auf andere Weise hängenbleibt.
Der Inhalt des EEPROMs bleibt erhalten, auch wenn die Betriebsspannung des Mikrocontrollers abgeschaltet wird." Deshalb ist das Überschreiben der Speicherplätze mit Nullen am Programmanfang unbedingt notwendig, anderenfalls stehen noch die Ergebnisse des vorangegangenen Programmlaufs im EEPROM.

Anmerkung zum Programm: Auch eine Neuprogrammierung des Mikrocontrollers löscht das EEPROM.

Wenn der Mikrocontroller beispielsweise abhängig vom Messergebnis des A/D-Wandlers eine Aktion ausführen soll, diese Aktion jedoch ausbleibt, liefert die folgende Schleife Aufschluss über das Messergebnis'':

forever loop
  resist = ADC_read_low_res(0)
  data EEprom Write (0, resist)
end loop

Das Programm muss dann gestoppt werden, wenn normalerweise die Aktion stattfinden würde. Anschließend wird mit HEXview geprüft, ob ein plausibler Messwert in Speicherplatz 0 steht.

Anmerkung zum Programm:  Eine Beschreibung dieses Kommandos zusammen mit einem Projektbeispiel ist in Kapitel 10.3 zu finden.

Fall 6:
 
Methode Typische Situation
Registerinhalte prüfen und in Echtzeit anpassen. Es bestehen Bedenken, ob in den Registern die korrekten Werte  stehen.

In vielen Programmen werden in die Programmsteuerung die Register des PIC-Mikrocotrollers einbezogen. Register sind spezielle Speicherplätze des Mikrocontrollers, deren Inhalte den Programmablauf beeinflussen. In Kapitel l wird von den Registern zum ersten Mal Gebrauch gemacht.
Es kann vorkommen, dass zwar das Programm läuft, aber das Ergebnis nicht stimmt, weil möglicherweise in bestimmten Registern falsche Werte stehen. In diesen Fällen hilft das Programm REGedit weiter, mit dem während der Programmausführung die Registerinhalte des PIC-Mikrocontrollers dargestellt und geändert werden können. Ändern lassen sich beispielsweise die Wiederholfrequenz von Interrupts, die Einstellungen der Pulsbreitenmodulation oder die analoge oder digitale Konfiguration einzelner I/O-Leitungen.
Die Beschreibung des Programms REGedit und ein Anwendungsbeispiel stehen am Ende von Kapitel 12.1.

Fall 7:
 
Methode Typische Situation
Einsatz eines Simulators Außer dem Mikrocontroller besteht die Hardware aus keinen weiteren oder nur wenigen einfachen Bauelementen.

Eine Alternative zu der zuvor beschriebenen Methode ist der Einsatz eines Simulators. Ein Simulator ist ein PC-Programm, das den Mikrocontroller einschließlich Firmware auf dem PC nachbildet (simuliert). Der Simulator macht unter anderem die internen Variablen des Mikrocontrollers sichtbar, die Fehlersuche wird dadurch oft erleichtert. Allerdings hat diese Methode zwei grundsätzliche Nachteile, deshalb sollte sie nur in Ausnahmefällen angewendet werden:

  1. Simulatoren können logische Fehler, die dem Programmierer beim Schreiben des Programms unterlaufen sind, nicht erkennen. Ein solcher Fehler kann zum Beispiel eine Verzweigungsbedingung im Programm sein, die den weiteren Programmablauf steuern soll, die aber nie erfüllt wird.
    Ein einfaches praktisches Beispiel: Der A/D-Wandler des Mikrocontrollers misst eine analoge Eingangsspannung. Immer wenn ihr digitaler Wert höher als 200 ist, soll eine LED aufleuchten. Der digitale Messwert kann jedoch in dieser Schaltung höchstens 127 betragen, weil ein Spannungsteiler vorgeschaltet ist. Das Programm enthält einen logischen Fehler, den der Simulator nicht erkennen kann.
     
  2. Wenn ein Programm im Simulator nicht läuft, kann das grundsätzlich zwei Gründe haben: Entweder enthält das Programm tatsächlich Fehler, oder der Simulator ist falsch konfiguriert. Insbesondere externe Bauelemente (LEDs, Schalter usw.) können die Ursache „unerklärlicher" Simulatorprobleme sein. Hier ist fraglich, ob sich der Zeitaufwand für das Konfigurieren des Simulators und das anschließende Simulieren lohnt. Das gezielte Debuggen durch gedankliches Nachvollziehen der einzelnen Programmschritte führt häufig schneller zum Ziel.
data EEprom Write (0,0)
data EEprom Write (1,0)
data EEprom Write (2,0)

In das Programm werden Kommandos eingefügt, die den Zahlenwert in die vorgesehenen Speicherplätze schreiben:

data EEprom_write (0,1)
[- beliebiger Programmteil -] data EEprom_write (1,1)
[- beliebiger Programmteil -] data EEprom_write (2,1)

Nach dem Programmstart und kurzer Wartezeit kann der Inhalt des EEPROMs mit HEXview betrachtet werden. In Kapitel 10.3 ist ausführlich beschrieben, wie dies geschehen muss. Steht beispielsweise die Zahl „1" in den EEPROM-Speicherplätzen 0 und 1, nicht jedoch in 2, dann deutet das darauf hin, dass das Programm zwischen dem zweiten und dritten Kommando in eine Endlosschleife verzweigt oder auf andere Weise hängenbleibt.
Der Inhalt des EEPROMs bleibt erhalten, auch wenn die Betriebsspannung des Mikrocontrollers abgeschaltet wird." Deshalb ist das Überschreiben der Speicherplätze mit Nullen am Programmanfang unbedingt notwendig, anderenfalls stehen noch die Ergebnisse des vorangegangenen Programmlaufs im EEPROM.

Anmerkung zum Programm: Es gibt natürlich mehrere hier verwendbare Simulatoren. JALss arbeitet mit der in diesem Buch beschriebenen Programmiersprache JAL, dieses Programm ist jedoch nur wenig bekannt. Eine Alternative ist die Entwicklungsumgebung MPLAB von PIC-Hersteller Microchip. Dort muss zuerst das Programm compiliert werden, anschließend verarbeitet der Simulator den Assembler-Code.

Fall 8:
 
Methode Typische Situation
Mehrere Kommandos „serial sw write()" an einer bestimmten  Programmposition für mehrere Variablen Das Programm läuft, aber die Resultate sind falsch. Die Resultate hängen gleichzeitig von mehreren Variablen ab. Die RS232-Verbindung mit dem Computer konnte hergestellt werden.

Etwas schwieriger wird es, wenn das Programm zwar läuft, jedoch falsche Resultate liefert und die Resultate von mehreren Variablen abhängen. Wenn Variablenwerte durch im Programm eingefügte Kommandos über das Terminalprogramm auf dem PC-Bildschirm dargestellt werden, geht schnell jede Übersichtlichkeit verloren. Hinzu kommt, dass sich die Variablenwerte laufend ändern. Deshalb muss nach einer anderen Methode gesucht werden, die eine bessere Übersichtlichkeit bietet. Die Fehlersuche würde auch erleichtert, wenn die Geschwindigkeit herabgesetzt werden könnte, mit der das Programm ausgeführt wird. Der Mikrocontroller müsste in „Zeitlupe" arbeiten.
Eine solche Methode der Programmfehlerbeseitigung wollen wir nachfolgend betrachten.


4. System-Debugging

lm Prinzip ist es nicht schwierig, Variablenwerte vom Mikrocontroller zum PC zu übertragen. Der Wert der Variable „demo" wird dem PC übergeben, wenn sie über den Programmer im Passthrough-Modus mit folgendem Kommando zum PC übertragen wird:
Technischer Hintergrund:

Das Alarmsystem misst den Widerstand der Leitungsschleife. An drei gefährdeten Orten wie zum Beispiel Tür- oder Fensterrahmen sind Alarmkontakte angebracht. Im Ruhezustand sind die Kontakte geschlossen, sie öffnen, wenn die Tür oder ein Fenster geöffnet werden. Jedem Alarmkontakt ist ein Widerstand parallel geschaltet. Da die einzelnen Widerstände unterschiedliche Werte haben, lässt sich durch Messen des Leiterschleifen-Widerstands feststellen, welcher Kontakt den Alarm ausgelöst hat.

serial sw write(demo)  

Wenn eine RS232-Verbindung zum Computer besteht, hat dieses Kommando gleichzeitig zur Folge, dass der Mikrocontroller die Programmausführung stoppt. Der Mikrocontroller setzt die Programmausführung erst fort, wenn er vom PC ein bestimmtes Kommando zurück erhält.

Zur Demonstration soll das Programm aus Kapitel 5.1 dienen, der „Blinker mit einstellbarer Frequenz". In das Programm fügen wir folgendes Kommando ein:
 
serial_sw_read(dummy)  

Dieses Kommando hält das Blinkprogramm an, der Wert der übertragenen Variablen ist ohne Bedeutung (deshalb der Name„ dummy").
Bei jedem Schleifendurchlauf sollen das Ergebnis, das der A/D-Wandler liefert, sowie der Zustand der LED zum PC übertragen werden. Im originalen Programm aus Kapitel 5.1 ist die LED während der Widerstandsmessung immer eingeschaltet. Da hier der Debug-Haltepunkt eingebaut werden soll und das ständige Aufleuchten der LED etwas eintönig ist, ändern wir das Programm.

Der Programmteil
 
-- and flash
delay_lms(resist)
pin d0 = low
delay_lms(resist)
pin d0 = high
 

wird ersetzt durch:
 
-- and flash
delay_ims(resist)
pin d0 = ! pin d0
 

Die Folge ist, dass sich wegen des NOT-Operators „!" der LED-Zustand bei jedem Schleifendurchlauf ändert. Wenn die LED ausgeschaltet ist, wird sie eingeschaltet und umgekehrt. Das Programm sieht nun wie folgt aus:
 
-- JAL 2.0.4
include 16f877 bert
-- define the eins

pin a5 direction = input
pin d0 direction = output
-- general variable

var byte resist, dummy
forever loop

  -- take a sample
  resist = ADC_read low res(3)
  serial SW read(dummy)
  serial-sw write(reaist)
  serial_sw write(pin d0)
  -- convert to a nice range
  resist = (resist / 2 ) + 30
  -- and flash
  delay_1ms(resist)
  pin d0 = ! pin d0
end loop
 

Nachdem das Programm in den Mikrocontroller geladen ist, läuft es ohne Besonderheiten. Es besteht keine RS232-Verbindung zum PC, so dass das Wartekommando wirkungslos ist. Erst wenn über den Programmer eine RS232-Verbindung zum PC hergestellt wird und auf dem PC ein spezielles Programm läuft, stoppt der Mikrocontroller beim Kommando „serial sw read".
Das Programm, das auf dem PC läuft, wurde in Visual Basic geschrieben, mit ihm kann der Mikrocontroller im Debug-Modus gesteuert werden. Das Kommando „pin d0 = ! pin d0" ist zwar sehr kompakt, es hat jedoch ein Risiko. In Kapitel 4.2 haben wir erklärt, worin das Risiko besteht. Die mit der Maus bedienbaren Elemente haben folgende Funktionen:
Start Schickt ein Triggersignal zum Mikrocontroller, das die Datenübertragung anfordert. Der zeitliche Abstand, mit dem dies geschieht, hängt von der„ Poll delay"-Einstellung ab.
Stop Stoppt die Kommunikation mit dem Mikrocontroller und die Programmausführung.
Step Sendet einen einzelnen Impuls zum Mikrocontroller, so dass der Mikrocontroller eine einzelne Schleife durchläuft.
Poll delay Stellt die Frequenz ein, mit der Impulse zum Mikrocontroller gesendet werden. jeder Impuls löst einen neuen Schleifendurchlauf des Mikrocontrollers aus.

Anmerkung zum Programm: Die beschriebene Methode können Sie auch anwenden, wenn Sie keinen Gebrauch von dem zum Hardware-Paket gehörenden Programmer „Wisp628" machen. Sie müssen dann, wie in Kapitel 11 beschrieben, eine separate RS232-Verbindung zum Computer herstellen.

Hardware zur RS232-Steuerung mittels Wisp

Die Hardware ist identisch mit der Hardware unseres Projekts in Kapitel 5.1. Hier soll nur noch angemerkt werden, dass die beschriebene Debug-Methode zusammen mit jedem beliebigen Mikrocontroller-Programm und jeder beliebigen umgebenden Hardware angewendet werden kann. Voraussetzung ist nur, dass eine RS232-Verbindung mit dem Computer besteht.

Das auf dem PC laufende Debug-Programm ist dazu gedacht, dass Sie dieses Programm an das zu korrigierende Mikrocontroller-Programm anpassen. Bei Visual-Basic-Programmen lassen sich Anpassungen und Änderungen vergleichsweise einfach durchführen. In der Regel kann die Verhaltensweise des Mikrocontroller-Programms durch Beobachten der Variablen auf dem Bildschirm leicht nachvollzogen werden.

Prinzipschaltplan für den PIC 16F877 Schaltungsaufbau mit dem PIC 16F877

Blinker mit einstellbarer Frequenz

Schaltungsaufbau des Blinkers


5. Hardware zur RS232-Steuerung mit dem MAX202E

Der Mikrocontroller P1C16F877 kann ohne externe Erweiterung kein normgerechtes RS232 -Signal generieren. Nach RS232-Standard wird eine logische 0 durch eine Spannung dargestellt, die im Bereich +3...+12 V liegt. Einer logischen 1 entspricht eine Spannung im Bereich -3...-12 V. Mit negativen Spannungen kann jedoch der PIC nicht arbeiten.
In der Praxis werden die vorgeschriebenen Spannungsbereiche nicht immer eingehalten. Im Internet kursieren viele Schaltungen, die mit nur wenigen passiven Bauelementen Verbindungen zwischen PICs und PCs herstellen. Außer dem geringen Aufwand haben diese Schaltungen jedoch noch eine andere Gemeinsamkeit: Zusammen mit vielen PCs erfüllen sie ihre Aufgabe, an anderen PCs versagen sie.
Auf dieses Risiko möchten wir uns nicht einlassen. Lieber nehmen wir einen geringfügig höheren Aufwand für eine Schaltung in Kauf, die die Norm erfüllt und zusammen mit jedem PC (und anderen RS232-Anschlüssen) arbeitet.

Der Chip, den wir dazu brauchen, ist der MAX202E von Dallas-Maxim Semiconductors. Im nächsten Bild ist die Anschlussbelegung des MAX202E dargestellt.

 

Dalles MAX

... der MAX202E und der Mikrocontroller

Anmerkung zum Schaltkreis: Ausführliche Informationen und das Datenblatt des MAX202E finden Sie auf der Website des Herstellers www.maxim-ic.com. Das Datenblatt ist auch in unserem Software-Download-Paket enthalten.

  1. Kopieren Sie die Bibliothek „16f877 bert" aus dem Ordner „...\libraries"66 in den Ordner, in dem die zum aktuellen Projekt gehörenden Dateien stehen".
  2. Starten Sie JALedit und öffnen Sie die Bibliothek„ 16f877 bert" (mit „File - Open"). • Suchen Sie das Kommando „serial sw invert = false". Ersetzen Sie das Wort „false" durch das Wort „true", so dass das Kommando „serial sw invert = true" lautet.
  3. Speichern Sie die geänderte Datei (mit Ctrl-S).

Wenn JALedit eine Bibliothek benötigt, wird nach dieser Bibliothek zuerst in dem Ordner gesucht, in dem die zu compilierende Datei steht. In diesem Fall findet JALedit dort die geänderte Bibliothek „16f877 bert" vor. Nur wenn die benötigte Bibliothek dort nicht gefunden wird, setzt JALedit die Suche im Bibliothekenordner „... \ libraries" fort. Die Bibliotheken, die im Programmordner stehen, heißen „Lokale Kopien". Sie können beliebig geändert werden, die Originale bleiben unverändert erhalten.
Aus diesem Grund ist es immer zweckmäßig, für jedes Projekt einen eigenen Ordner einzurichten.
Der Programmer Wisp628 ist nicht beteiligt, das Einschalten seines Durchleit-Modus entfällt. Aus diesem Grund können Sie zusammen mit dem MAX202E jedes beliebige PC-Terminalprogramm einsetzen. Wenn Sie MICterm verwenden, müssen Sie dort den Schalter „Wisp628" deaktivieren.

Die Software

Die RS232-Verbindung über den MAX202E ist ein Hardware-Projekt, das folgende Programm dient deshalb nur zur Demonstration der Arbeitsweise. Es überträgt einen Zahlenwert zum Computer, der von der Einstellung des mit Anschluss 2 des Mikrocontrollers verbundenen Potentiometers abhängt.

-- JAL 2.0.6
include 16f877 bert
-- define variables
var byte resist
-- define the pins
pin a0 direction = input

Anmerkungen zur Ordnerstruktur: Wenn Sie das Softwarepaket wie vorgeschlagen installiert haben, lautet der Pfad zu den Bibliotheken c: \ picdev \ jal \ libraries. Gemeint ist der Ordner, in dem Sie die Mikrocontroller-Programme speichern.

forever loop
  -- convert analog an a0 to digital resist = ADC_read_low_res(0)
  -- send resistance to PC serial_sw write(resist) delay_100ms(1)
end loop

Vergessen Sie nicht, die beschriebene Änderung der Bibliothek„ 16f877 bert"  vorzunehmen

Die Hardware

Die Werte der zum MAX202E gehörenden Kondensatoren sind nicht kritisch. Hersteller Dallas-Maxim empfiehlt, dass ihre Werte 0,1...10 µF betragen sollen. Der an der Betriebsspannung liegende Kondensator muss mindestens den gleichen Wert wie die übrigen Kondensatoren haben.
Dieser Kondensator wirkt Spannungsspitzen" auf der Betriebsspannung entgegen, die sich störend auf die Mikrocontroller-Funktionen auswirken können. Wie das Schaltbild zeigt, haben wir Kondensatoren 1µF/25 V gewählt. Die Polaritäten sind im Bild oben korrekt dargestellt, zwei Kondensatoren werden anders gepolt als vielleicht erwartet!

Aus der Schaltung geht hervor, dass die Verbindung zum PC aus nur drei Leitungen besteht. Die angegebenen Pin-Nummern beziehen sich auf die neunpolige D-Sub-Buchsenlei~,te (weiblich), von der das Kabel zum PC führt. Den Schaltungsaufbau auf der Steckplatte zeigt das nächste Bild.

Aufbau mit MAX202E

Für den ständigen Einsatz der Schaltung, zum Beispiel weil der Programmer Wisp628 nicht zur Verfügung steht, ist der Aufbau auf einer Platine zu empfehlen. Eine Experimentierplatine mit einem Lötpunktraster ist ebenso geeignet wie eine „richtige" Platine. Beide sorgen für genügend mechanische Stabilität.

Zeichenwirrwarr auf dem Bildschirm?

In diesem Fall haben Sie mit ziemlicher Wahrscheinlichkeit vergessen, die notwendige Änderung in der Bibliothek„ 16f877 bert" vorzunehmen. Was zu tun ist, steht im vorangegangenen Absatz „Technischer Hintergrund".

Anmerkungen zur Beschaltung: Der MAX202E erzeugt aus der Spannung +5 V nach dem Prinzip der „Ladungspumpe" die Spannungen +10 V und -10 V. Solche Spannungswandler können relativ starke impulsförmige Störsignale auf der Betriebsspannung verursachen. Der parallel zur Betriebsspannung liegende Kondensator dämpft die Impulsspitzen. Dieser Kondensator muss möglichst nahe an den Anschlüssen des MAX202E angeordnet sein.

forever loop
  -- convert analog an a0 to digital resist = ADC_read_low_res(0)
  -- send resistance to PC serial_sw write(resist) delay_100ms(1)
end loop

Vergessen Sie nicht, die beschriebene Änderung der Bibliothek„ 16f877 bert"  vorzunehmen

 

 

 


6. Verwandte Themen history menue scroll up

Was ist alles mit dem Betriebssystem eines Microcomputers verwandt? Antwort: faktisch der gesamte Bereich der Digitalelektronik und sowieso die gesamte Technik der Software-Technologie der Vergangenheit, Gegenwart sowie zumindest der nächsten Zukunft.

Der LC-80 Simulator

POLYCOMPUTER

Z80-CPU

Mnemonic-Code-Notation

höhere Programmierwerkzeuge

... und so funktioniert ein Computer

 

die beliebte alphabetisch sortierte Schnell-Liste

die beliebte numerisch sortierte Schnell-Liste

Allgemeine FLAG-Wirkung

FLAG-Wirkung auf OP-Code-Gruppen

Alphabetisch sortierte Dokumentation

FLAG Teile I

FLAG Teile 2

Allgemeine Funktionssymbolik

Aktuelles sowie weiterentwickeltes Betriebssystem

Blockschaltbild eines Einchiprechners

   

Projekt Assemblerprogrammierung

   


zur Hauptseite
© Samuel-von-Pufendorf-Gymnasium Flöha © Frank Rost am 31. Januar 2015 um 9.29 Uhr

... dieser Text wurde nach den Regeln irgendeiner Rechtschreibreform verfasst - ich hab' irgendwann einmal beschlossen, an diesem Zirkus nicht mehr teilzunehmen ;-)

„Dieses Land braucht eine Steuerreform, dieses Land braucht eine Rentenreform - wir schreiben Schiffahrt mit drei „f“!“

Diddi Hallervorden, dt. Komiker und Kabarettist

Diese Seite wurde ohne Zusatz irgendwelcher Konversationsstoffe erstellt ;-)