28
PIC 16F877A Projektarbeit 2008/09 Mikrocontroller PIC 16F877A Thema der Projektarbeit: Planung, Erstellung und Programmierung eines Universalinterfaces mit dem Controller PIC 16F877A zur Schulung im Bereich der Prozessdatenverarbeitung. Vollständiger Name: Hans Hermann Geisler , Michael Störk Datum der Abgabe: 15. Mai 2009 Ausbildungsberuf: Staatlich geprüfter Elektrotechniker Informations- und Kommunikationstechnik Ausbildungsbetrieb Berufsbildende Schulen Friedenstrasse Wilhelmshaven Friedenstrasse 60-62 26386 Wilhelmshaven M.Störk, H-H. Geisler 1

Mikrocontroller PIC 16F877A - Wilhelmshaven: Startseitebbsf.bbs-wilhelmshaven.de/fileadmin/user_upload/bbs2/Projekte/... · PIC 16F877A Projektarbeit 2008/09 1 Projektbeschreibung

Embed Size (px)

Citation preview

PIC 16F877AProjektarbeit 2008/09

Mikrocontroller

PIC 16F877A

Thema derProjektarbeit:

Planung, Erstellung und Programmierung eines Universalinterfaces mit dem Controller PIC 16F877A zur Schulung im Bereich der Prozessdatenverarbeitung.

Vollständiger Name: Hans Hermann Geisler , Michael StörkDatum der Abgabe: 15. Mai 2009Ausbildungsberuf: Staatlich geprüfter Elektrotechniker

Informations- und KommunikationstechnikAusbildungsbetrieb Berufsbildende Schulen Friedenstrasse

WilhelmshavenFriedenstrasse 60-6226386 Wilhelmshaven

M.Störk, H-H. Geisler 1

PIC 16F877AProjektarbeit 2008/09

Inhaltsverzeichnis1 Projektbeschreibung......................................................................................................................3

1.1 Aufgabenstellung..................................................................................................................31.2 Ausgangsposition..................................................................................................................31.3 Probleme und Lösungsansätze..............................................................................................31.4 Zeitlicher Ablauf...................................................................................................................5

2 Der PIC 16F877A.........................................................................................................................62.1 Vorstellung PIC 16F877A.....................................................................................................72.2 PIC 16F877A vs. EMUF.......................................................................................................72.3 PIC 16F877A vs. Z80............................................................................................................8

3 Wichtige Funktionsgrundlagen...................................................................................................113.1 Die Steuerworttabellen........................................................................................................113.2 Abfrage von Flag-Bits.........................................................................................................123.3 Zählschleifen.......................................................................................................................13

4 Beschreibung der einzelnen Programme....................................................................................144.1 Die Hubtischprogramme.....................................................................................................14

4.1.1 Allgemeines.................................................................................................................145.1.2 Hubtischprogramm ohne Interrupt..............................................................................155.1.3 Hubtischprogramm mit Interrupt.................................................................................17

4.2 Die Ampelprogramme.........................................................................................................194.2.1 Allgemeines.................................................................................................................194.2.2 Ampelprogramm 8Bit-Betrieb.....................................................................................204.2.3 Anlaufsubroutinen.......................................................................................................214.2.4 Ampelroutine 16Bit-Betrieb........................................................................................23

Anhang...........................................................................................................................................26

M.Störk, H-H. Geisler 2

PIC 16F877AProjektarbeit 2008/09

1 Projektbeschreibung

1.1 AufgabenstellungWie jedes Jahr wurde auch dieses Jahr durch die Abschlussklassen der Technikerschule ein Abschlussprojekt geplant und durchgeführt. Für die Technikerschüler des Bereiches Elektrotechnik wurde der Zeitraum vom 05.02 bis zum 09.05.2009 festgesetzt. Der Gruppe Störk/Geisler fiel folgendes Projektthema zu:Planung, Erstellung und Programmierung eines Universalinterfaces mit dem Prozessor PIC 16F877A zur Schulung im Bereich der Prozessdatenverarbeitung.

-Verwendung eines PIC 16F877A Mikrocontroller in der Bauform PDIP-40

1.2 AusgangspositionEs standen zu Beginn des Projektes zur Verfügung(Schule):-sämtlichen Programme für die Ampel- und Hubtischmodelle im Z80-Assemblercode-altes und neues Hubtischmodell-altes und neues Ampelmodell-EMUF-Entwicklungsprogramm „Piklab“-Entwicklungsset „Picstart plus“ mit Programmiergerät-Fachbuch „Messen, Steuern, Regeln mit PIC-Mikrocontrollern“

1.3 Probleme und LösungsansätzeBei der Spannungsversorgung kamen wir schnell auf eine Eigenspannungsversorgung. Der PIC 16 wäre zwar durchaus mit einer Fremdspeisung zu betreiben, doch kamen uns gegen diese Lösung einige Bedenken. Durch das Studium der Unterlagen über das Ampelmodell kamen wir zu dem Schluss eine Fremdspeisefähigkeit dort nicht geplant worden war. Zu einem viel späteren Zeitpunkt stellte sich allerdings heraus das dies bereits nachgerüstet worden war ohne dass dies in den Unterlagen vermerkt wurde. Bei dem Hubtischmodell war diese Option wohl vorgesehen, aber wird dort die Speisespannung nicht über den Adapter bis zum D-Sub-Stecker geführt. Des weiteren wurde bei früheren Versuchen mit einer solchen Fremdspeisung an GAL-Speichern festgestellt dass ein reibungsfreier Ablauf nicht sichergestellt war. Vermutet wurde damals dass die Pegel der Signale durch eine hohe Belastung bei der Fremdspeisung nicht mehr stabil gehalten werden konnten. Zuletzt bietet eine Eigenversorgung noch einen Vorteil für zukünftige Projekte. Es sollte (für zukünftige „Generationen“) kein Problem darstellen eine Anzeige- und/oder Tastatureinheit ohne weiteres Netzteil anzuschließen.

M.Störk, H-H. Geisler 3

PIC 16F877AProjektarbeit 2008/09

Als Anschluss zu den jeweiligen Modellen wurde die 25-polige D-Sub-Steckverbindung ausgewählt. Diese Wahl beruht auf der Tatsache dass die neueren Modelle bereits mit dieser Steckverbindung an den EMUF angeschlossen wurden und so Modelle, Adapter und Kabel weiterverwendet werden können. Zusätzlich zu den bereits „vergebenen“ Pins der Ports C und D wurden noch eine Fremdspeisung (ausgehend) sowie der Port E auf diesem Stecker realisiert, was zur Erleichterung zukünftiger Modelle dienen sollte.

Die Portzuweisung war eins der wichtigsten Probleme, was auch Grundlage für die weitere Entwicklung von Soft- und Hardware war. Hauptproblem war die bereits festgelegte Anschlussbelegung, welche auf dem EMUF aufbaute und der Portstruktur des PIC 16. Port A des PIC 16 umfasst beispielsweise nur 6 anstatt 8 Bit, ein flankengesteuerter Interrupt ist nur an Pin RB0 möglich und eine Verwendung von änderungsgesteuerten Interrupts ist nur an den Pins RB4-RB7 denkbar. Gerade die Interruptleitungen waren durch die Modelle und Aufgaben-stellungen vorgegeben und lagen ungünstig verteilt.

Eine Anpassung wäre, wie nebenstehendes Diagramm zeigt zwar möglich gewesen, doch ist eine Übernahme der Z80 Steuerwörter für einen schnelleren Umstieg zwischen beiden Systemen wünschens-werter und außerdem würde diese starre Lösung für zukünftige, andere Modelle einen engen Rahmen setzen.Letztendlich wurde diese nach-teilige, wenngleich auch ein-fachere Lösung zu Gunsten der Neuentwicklung einer flexiblen Interruptlogik aufgegeben.

M.Störk, H-H. Geisler 4

PIC 16F877AProjektarbeit 2008/09

1.4 Zeitlicher Ablauf1. Woche /2.Woche

Einarbeitung in die Thematik, Nachforschungen über Verfahren, Erweitern des technischen Horizontes; wie auch immer man es nennen will, es lief fast immer darauf hinaus den lieben langen Tag auf den Monitor zu starren und zumeist PDF-Dokumente zu lesen. Wohl dem, der die englische Sprache gar nicht erst beherrscht.

3.Woche Siehe Woche 1 und 2, allerdings mit Schwerpunkt auf die praktischen Probleme und Lösungsansätze (siehe Kapitel 1.3), kurz: Machbarkeitsstudie

4. Woche Konstruktion einer ersten Testplatine, Programmierung eines ersten Testprogrammes

5.Woche /6.Woche

Ausgiebige Teste ergaben immer wieder Fehler, die teilweise nicht erklärbar waren. Es erfolgte ein Neubau der Testplatine. Endlich Erfolg! Beginn Layouting.

7.Woche Verfeinerung der Programme und Abstimmung der Interruptlogik. Layouting!8.Woche Beginn der Dokumentation der Programme. Layouting!!!9.Woche Erste Ätzversuche an der Schule erfolglos. Erneutes Layouting und Vergabe des

Auftrages am eine externe Firma.10.Woche Platinen werden bestückt und in Betrieb genommen. Gravierende Fehler beim

Layout erfordern kurzfristige Umdisponierungen an verschiedenen Stellen

M.Störk, H-H. Geisler 5

PIC 16F877AProjektarbeit 2008/09

2 Der PIC 16F877A

M.Störk, H-H. Geisler 6

PIC 16F877AProjektarbeit 2008/09

In Rahmen dieses Projektes wurde die Verwendung des PIC_16F877A explizit vorgeschrieben, was hauptsächlich in der Vielzahl seiner Möglichkeiten begründet liegt und somit für den Schulgebrauch neben den Ampel- und Hubtischmodellen ein weites Feld für zukünftige Entwicklungen von Modellen und Programmen bietet. Gerade diese Vielfältigkeit ist allerdings auch der Grund warum nachfolgend nur grob über die im direkten Zusammenhang mit dem Projekt stehenden Merkmalen behandelt werden.

2.1 Vorstellung PIC 16F877ADer PIC_16F877A ist ein Mikrocontroller aus dem Hause Microchip Technology Inc. (Arizona,USA). Er gehört zur (riesigen!) Reihe PICmicro und wird, wie alle anderen PICs mit 14-Bit-Wortbreite, als Mitglied der mid-Range Familie vertrieben.Innerhalb dieser Familie bleibt erfrischenderweise der Befehlssatz gleich, unterscheiden sich die einzelnen Mitglieder primär nur durch die spezifischen „Ausstattungsmerkmale“, was allerdings durchaus zu gravierenden Unterschieden führen kann. Beispielsweise wird die Anzahl der Anschlüsse in erster Linie nur durch die Anzahl der Ein-/Ausgänge bestimmt während sich zwei äußerlich gleichende PICs intern deutlich an Speicherplatz und Funktionsmodulen unterscheiden können.

2.2 PIC 16F877A vs. EMUFDer EMUF, der auch die Grundlage für den in das in der Schule verwendeten EMES darstellt, ist, wie der Name sagt, ein Einplatinen-Mikrocomputer-für-Universelle-Festprogramm-Anwendungen, in dessen Zentrum ein Mikroprozessor (µP, MPU) seinen Dienst versieht. Im Gegensatz dazu stellt der Mikrocontroller (µC, MCU) PIC 16 bereits ein System in sich selber dar (SoC,= System on a Chip). Obwohl in anderen Fällen teilweise nicht so einfach fällt hier die Unterscheidung zwischen Mikroprozessor und Mikrocontroller nicht schwer; der µC PIC 16F877A mit seinen integrierten Seriell- und Parallel-Port Funktionen kann durchaus ohne weitere Bausteine seinen Aufgaben nachkommen. Da PICs der Reihe 16F87xA jeweils mit bis zu 200mA pro Port belastet werden dürfen, sind externe Peripheriebausteine oft erst bei einer Pegelanpassung (z.B. RS-232 +/- 15V) oder zum Schalten größerer Lasten (z.B. LEDs, Relais) notwendig.

Diese Ersparnis führte aber im vorliegenden Fall allerdings auch zu einem der größeren Probleme, welches hardwaretechnisch zu lösen war. Der im Unterricht verwendete EMUF, der auf einem Z80 mit den zugehörigen Peripheriebausteinen der Firma Zilog basiert, ermöglicht das Definieren einer Interruptmaske an den einzelnen PIO-Bausteinen, was eine relativ freie Anpassung des Mikrocomputers an Modelle ermöglicht. Dies ist bei einem PIC in dieser Form nicht möglich und führte zur Entwicklung der Interruptlogik..

Softwaretechnisch fällt in diesem Zusammenhang nur das Fehlen spezieller Ein-/Ausgabebefehle auf. Diese Dokumentation beschränkt sich hier allein auf die Funktionen der Ein- und Ausgabe digitaler Daten als Einzelbit oder parallel als Bitgruppe.

M.Störk, H-H. Geisler 7

PIC 16F877AProjektarbeit 2008/09

2.3 PIC 16F877A vs. Z80Neben der Unterscheidung zwischen dem µP Z80 und dem µC PIC_16F877A im voran-gegangenen Kapitel unterscheiden sich beide Systeme auch in der Architektur in der bei die beiden Prozessoren arbeiten (Innerhalb eines µControllers befindet sich logischerweise auch ein Prozessor).

Der Z80 ist ein klassischer Vertreter der von-Neumann-Architektur, bei der unter anderem der Programmspeicher und der Arbeitsspeicher die gleiche Bitbreite besitzen und über ein gemeinsames Bus- und Adresssystem angebunden sind. Im Gegensatz dazu sind, wie die obere Abbildung zeigt, bei einem Prozessor der Harvard-Klasse der Programmspeicher an einem anderen, breiteren Datenbus als der Datenspeicher angeschlossen. Dies führt zu einem bekannten Hauptvorteil der Harvard-Architektur, nämlich der Geschwindigkeit, da gleichzeitig beide Bussysteme angesprochen werden können, während bei einer von-Neumann-Maschine erst über den Datenbus der nächste Befehl gelesen werden muss bevor die benötigten oder resultierenden Daten über den gleichen Bus versendet werden können, was dieser rechnerarchitektonischen Engstelle den sarkastischen Namen von-Neumann-Flaschenhals eingebracht hat. Diese Eigenart des PIC´s, den übrigens alle Controller der PICmicro-Familie, führte bereits im frühen Stadium unseres Projektes zu den ersten Knackpunkten; durch die inkompatiblen Adressierungssysteme bei Programm- und Datenspeicher war ein Auslesen der Steuerworttabelle durch die indirekte Adressierung nicht möglich.

Ein anderer Unterscheidungspunkt tritt an dieser Stelle auch langsam hervor. Befehle des Z80 sind, durch den Rahmen des 8-Bit breiten Bussystems, 8, 16, 24 oder 32 Bit breit, was erstens einen wiederholten Zugriff auf den Programmspeicher erfordert bis der Befehl komplett geladen worden ist; zweitens sind dadurch die Laufzeiten der einzelnen Befehle recht unterschiedlich lang. Da im Bereich der Steuerungstechnik Reaktionszeiten auf Ereignisse möglichst gering und vorhersehbar sein sollte.

M.Störk, H-H. Geisler 8

PIC 16F877AProjektarbeit 2008/09

Ein Blick auf den Befehlssatz eines mid-Range-Mikrocontrollers (nächste Seite) zeigt nicht nur dass alle Befehle die 14-Bit-Breite aufweisen, womit auch immer nur ein einzelner Programm-speicherzugriff erfolgen muss, sondern auch dass die meisten Befehle exakt 1 Zyklus (4Takte) Laufzeit benötigen. Die wenigen Befehle, die nicht in dieses Muster passen, folgen einer ein-fachen Regel: Muss durch einen Befehl der Inhalt des Programmcounters auf andere Art als das einfache Inkrementieren verändert werden (Sprungbefehle!!), dann nimmt dieser Befehl statt einem Zyklus zwei Zyklen in Anspruch. Kniffelig sind dabei nur die vier Entscheidungsbefehle, bei denen ein möglicher Zwei-Schritt-Sprung (Skip = Überspringen(des nächsten Befehls)) vom Ergebnis der eingeleiteten Abfrage abhängig ist.

M.Störk, H-H. Geisler 9

PIC 16F877AProjektarbeit 2008/09

M.Störk, H-H. Geisler 10

PIC 16F877AProjektarbeit 2008/09

Letzteres große Unterscheidungsmerkmal ist bei Betrachtung des Befehlssatzes sicher auch aufgefallen. Im Gegensatz zu dem programmiertechnisch komfortablen Z80-Befehlssatzes ist der mid-Range-Befehlssatz mit „nur“ 35 Befehlen relativ klein ausgefallen, was naturgemäß für den Programmierer die berühmte zweiseitige Medaille bildet. Einerseits mangelt es mancherorts an den bequemen 1-Befehl-Lösungen des Z80, was natürlich auch gerne mal zu logischen und orthographischen Fehlern führen kann(und hat!), andererseits kann man am Ende des ersten Tages von den 35 Befehlen schon mindestens 25 in der Badewanne liegend aufsagen. Aus diesem Grunde werden in dem nachfolgendem Kapitel einige der von uns verwendeten PIC-Lösungen näher behandelt.

3 Wichtige Funktionsgrundlagen

3.1 Die SteuerworttabellenViel Programme verwenden in ihrem Code so genannte Steuerworttabellen, so auch die hier behandelten Hubtisch- und Ampelprogramme. Der Vorteil von Tabellen dieser und ähnlicher Art liegt in der Kombination von Programmschleifen, die öfters durchlaufen werden und in jedem Durchlauf an eine andere Stelle der Tabelle zugreifen.

Diese Vorteile führten dazu dass viele Prozessoren die Möglichkeit der „indirekten Adres-sierung“ aufweisen, bei der ein Register als eine Art „Tabellenzeiger“ verwendet wird. Mit Hilfe eines solchen Zeigers und spezieller Anweisungen kann schnell und einfach auf Tabelleninhalte zugegriffen werden. Zudem vereinfacht es meist die Verwaltung, gerade wenn mehrere aufein-anderfolgende Tabellenzeilen nacheinander abgefragt oder beschrieben werden sollen (durch In-crementierung des Zeigerregisters). Bei den vorangegangenen Programmen auf dem Z80-Pro-zessor wurde in dazu das HL-Doppelregister verwendet.

Der PIC-Prozessor hat diese Möglichkeiten nur bedingt. Es gibt zwar die Möglichkeit der indirekten Adressierung über das File-Select-Register (FSR), jedoch beschränkt sich diese Fähigkeit auf den Datenspeicher (8Bit). Eine Steuerworttabelle ist allerdings im Programmcode eingebettet, der sich auf Grund der Harvard-Architektur in dem separaten Programmspeicher befindet (14Bit). Um auf eine Tabelle innerhalb des Programmcodes zuzugreifen bedienten wir uns folgender Möglichkeit:

CALL tabelle

tabelle MOVF „Zeiger“,wADDWF PCL,fRETLW/NOP „Steuerwort 0“RETLW „Steuerwort 1“RETLW „Steuerwort 2“

Wie man erkennt gibt es für solche Fälle den speziellen PIC-Befehl RETLW (Return with Literal in W), der wie ein Return einen Rücksprung auslöst, jedoch den beigefügten Wert in das W-Register dabei übernimmt.

M.Störk, H-H. Geisler 11

PIC 16F877AProjektarbeit 2008/09

In unseren Ampelprogrammen fällt allerdings der erste Befehl weg, denn der Offsetwert befindet sich beim Aufruf der Tabelle bereits in W. Zu beachten ist die Pogrammzeile wo sich der erste RETLW-Befehl befindet. Diese Zeile wird erreicht wenn der Offsetwert Null beträgt da der Programmcounter nach jedem abgearbeiteten Befehl incrementiert wird. Wird ein solcher Wert im Programmablauf niemals eintreten muss dennoch diese „Nullstelle“ vorhanden sein. Es empfiehlt sich dann eine NOP-Anweisung einzufügen, sollte wider Erwarten doch einmal die Tabelle mit einem Offset von 0x00 aufgerufen werden wird diese Stelle „übergangen“ und man gelangt zur Stelle 0x01. Zuletzt muss beim Programmiren bzw. Linken darauf geachtet werden, dass sich die Tabelle mit dem zugehörigen Aufruf komplett innerhalb einer Seite (Page) des Programmspeichers befindet da eventuell anfallenden Überträge aus der 8Bit-Addition im PC nicht berücksichtigt werden.

3.2 Abfrage von Flag-BitsDie Abfrage von Flag-Bits nimm bei allen Prozessoren eine zentrale Rolle weshalb der Z80 neben einem eigenen Flagregister auch spezielle Befehle wie JP NZ,nn (springe nach nn bei der„Nicht-Zero“-Bedingung) besitzt.Der PIC 16 verwendet zwar mehr Flags als der Z80, jedoch sind diese nicht in einem speziellen Flagregister zusammengefasst und ist somit eine Implementierung in anderen Befehlen nicht gegeben. Möchte man ein Flag abfragen so muss man zuerst seine Position kennen. Die bekanntesten Flags befinden sich im Status-Register an den Stellen 0-3,

M.Störk, H-H. Geisler 12

PIC 16F877AProjektarbeit 2008/09

Ist diese Stelle im Speicherbereich bekannt kann das Flag-Bit wie jedes andere Bit im Daten-speicherbereich abgefragt werden und für eine Entscheidung benutzt werden. Hier ein Beispiel aus dem Programmteil „Phastest“

Zuerst wird das File „merker“ einmal „in-sich-selbst“ ver-schoben, was bedeutet das es einmal gelesen und an den gleichen Platz mit dem gleichen Inhalt zurückgeschrieben wird. Durch das Verschieben wird das Zero-Flag beeinflußt. Im nächsten Schritt wird dieses Flag durch die BTFSS-Anweisung (Bit Test f, skip if Set) überprüft. War der Inhalt von „merker“ Null, dann wurde Zero gesetzt und der nachfolgende RETURN-Befehl wird übersprungen. War der Inhalt nicht-Null, dann wurde das Zero-Flag gelöscht und die Unterroutine „phas4“ wird an dieser Stelle durch RETURN verlassen.

Der Befehl BTFSC (Bit Test f, skip if Clear) arbeitet nach gleichem Muster, nur wird das Über-springen(Skip) der nachfolgenden Befehlszeile bei dem Bitzustand Null (Clear) ausgelöst.

3.3 ZählschleifenZählschleifen lassen sich prinzipiell nach den gleichen Muster wie bei dem Z80 aufbauen, auch die Befehle sind fast identisch (INCF, DECF). Für Zählschleifen, die gegen Null zählen, gibt es allerdings eine interessante Alternative. Die Anweisungen INCFSZ/DECFSZ (Increment/Decrement f, Skip if Zero), die neben BTFSS/BTFSC die einzigen Entscheidungsbefehle sind, lösen beim Erreichen des Zero-Zustandes einen Überspringen-Befehl aus.

Nebenstehendes Beispiel aus dem Anlauf8-Unterprogramm zeigt den Aufbau. Zu Beginn wird das Zählregister „counter“ mit dem Wert D'10' geladen. Die nachfolgende Schleife wiederholt sich 10 mal, bis nach dem 10.Durchlauf der Befehl GOTO lp1 übersprungen wird und das Unterprogramm durch RETURN verlassen wird.

Tipp: Da die Anweisungen INCFSZ/DECFSZ weder Work noch Flags beeinflussen, stellen sie eine interessante Alternative bei Interruptroutinen dar

M.Störk, H-H. Geisler 13

PIC 16F877AProjektarbeit 2008/09

4 Beschreibung der einzelnen Programme

4.1 Die Hubtischprogramme

4.1.1 AllgemeinesDie Hubtischprogramme bestehe immer aus zwei Programmteilen, der Hauptroutine und der Tabelle, welche für beide Programme identisch ist. Für dieses Problem stehen im Unterricht zwei Modelle zur Verfügung. Beide Modelle können über einen Adapter an unser Controllerboard angeschlossen werden, allerdings muss für eine volle Funktion die Hauptroutine minimal geändert werden. Das ältere Modell verfügt nämlich über zwei Starttaster, die nach Aufgaben-stellung gleichzeitig gedrückt werden sollen. In diesem Fall werden beide Taster unmittelbar hintereinander abgefragt. Bleibt eine Anfrage negativ bleib heißt es immer: Zurück auf Start.

M.Störk, H-H. Geisler 14

PIC 16F877AProjektarbeit 2008/09

4.1.2 Hubtischprogramm ohne Interrupt

M.Störk, H-H. Geisler 15

PIC 16F877AProjektarbeit 2008/09

Dieses Programm läuft relativ unkompliziert ab. Zu Beginn wird der Starttaster überprüft, anschließend sofort der Stopptaster. Dies geschieht um eine Dominanz der Stoppfunktion zu erreichen. Nach jedem durchlaufenen EVA-Zyklus (Eingabe-Verarbeitung-Ausgabe) wird die Stoppbedingung erneut überprüft.

Der Verarbeitungsschritt von den Sensorrohdaten zum Erzeugen eines Tabellenoffsetwertes erfordert ein Hilfsregister, da einerseits bei einem Rotieren innerhalb des PORTC-Registers das Ergebnis immer wieder von den neuen Sensordaten überschrieben würde und andererseits für ein Rotieren im Workregister kein Befehl existiert.

M.Störk, H-H. Geisler 16

PIC 16F877AProjektarbeit 2008/09

4.1.3 Hubtischprogramm mit Interrupt

M.Störk, H-H. Geisler 17

PIC 16F877AProjektarbeit 2008/09

Dieses Programm unterscheidet sich von dem Vorherigen im Wesentlichen nur durch die Verwendung einer Interruptroutine zum Abschalten der Anlage anstelle des regelmäßigen Abfragens (Polling) des Stopp-Tasters. Dies soll einen gewissen Praxisbezug simulieren, denn oft soll bei sicherheitsrelevanten Punkten des Funktionsablaufes eine geforderte Reaktion in kurzer Zeit eintreten, was durch ein regelmäßiges Polling nicht immer sichergestellt werden kann. Auch sind beim Auftreten sehr kurzer Schaltzustände oft Interruptroutinen notwendig damit nicht in der Zeit zwischen zwei Abfragen ein kurzlebiges Signal nicht einfach unbeachtet bleibt.

Die Interruptroutine ist in diesem Fall relativ kurz. Sofort nach de, Aufruf wird die Anlage in den Stoppzustand versetzt (Motoren Stopp, Ampel Rot)..Anschließend wird in einer kurzen Schleife so lange gewartet bis der Stopptaster wieder gelöst wird. Ursache dafür ist dass ein Interrupt nur beim betätigen des Tasters (Flanke) ausgelöst wird. Aus Sicher-heitsgründen muss aber der Stopptaster Vorrang vor dem Starttaster haben..

M.Störk, H-H. Geisler 18

PIC 16F877AProjektarbeit 2008/09

4.2 Die Ampelprogramme

4.2.1 AllgemeinesDie Ampelprogramme bestehen beide aus mindestens eine Hauptroutine (ampel8/ampel16), einer Anlaufroutine (anlauf8/anlauf16),einer Tabellenfunktion (tabelle8/tabelle16) sowie einem Zeitprogrammm (pic-delay) welches bereits bei Beginn des Projektes vorhanden war. Zusätzlich benötigt das 16-Bit Ampelprogramm noch das „Phastest“-Programmsegment.

M.Störk, H-H. Geisler 19

PIC 16F877AProjektarbeit 2008/09

4.2.2 Ampelprogramm 8Bit-Betrieb

M.Störk, H-H. Geisler 20

PIC 16F877AProjektarbeit 2008/09

4.2.3 Anlaufsubroutinen

M.Störk, H-H. Geisler 21

PIC 16F877AProjektarbeit 2008/09

Für beide Ampelprogramme, egal ob 8- oder 16-Bit-Betrieb, lautete eine Zusatzaufgabe sinngemäß: Da es für den rollenden Verkehr ungünstig ist wenn die Ampelanlage nach einer Reparatur oder Wartung wieder eingeschaltet wird und sofort auf Phase 1 springt (Hauptrichtung grün, Nebenrichtung und Fußgänger rot) wäre hier eine Warnphase angebracht. Diese Anlauf-phase soll 10 Sekunden lang vor dem Beginn des Normalbetriebes laufen und dabei erstens: die Fußgängerampeln auf Rot schalten und zweitens: in den Fahrbahnampeln die gelbe Leuchte in einem 1Hz-Takt blinken.

Überlegung: 1 Hz Takt bedeutet ½ sek. gelb an und ½ sek. gelb aus--> ergibt 1 sek. Periodendauer, also 1Hz. Bei 10 Sekunden Gesamtdauer bedeutet dies, es müssen 10 Perioden dargestellt werden. Für den Programmteil einfach ausgedrückt: Einen Zähler auf 10 stellen, erstes Steuer-wort(8Bit) bzw. ersten beiden Steuerwörter(16Bit) ausgeben, eine halbe Sekunde warten, dann das zweite Steuerwort(8Bit) / die letzten Steuerwörter(16Hit) ausgeben und wieder eine halbe Sekunde warten. Den Zähler decrementieren und als Schleife das ganze wiederholen bis der Zähler nach 10 Durchgängen bei Null angekommen ist. Anschließend zurück zum Haupt-programm und den Hauptablauf starten.

Der Quelltext wird hier nicht mehr näher behandelt. Man bedenke nur dass die Variablen für das Delayprogramm und der Zähler importiert werden und dass der Anfangspunkt „anlauf8 / anlauf16“ als global deklariert wird. Als Zähler haben wir das gleiche File(„counter“) verwendet, welches später auch im der Hauptprogrammschleife aktiv sein wird. Des weiteren liegt im 16 Bit-Betrieb der Aufruf des Anlaufprogrammes vor dem Initialisieren des Interruptes, somit werden in der Praxis Eingaben während der Anlaufphase nicht registriert und für den Testbetrieb bedeutet dies,dass egal welcher Fehler in Interruptverarbeitung vorliegen mag, das Anlauf-programm müsste schon funktionieren.

M.Störk, H-H. Geisler 22

PIC 16F877AProjektarbeit 2008/09

4.2.4 Ampelroutine 16Bit-Betrieb

M.Störk, H-H. Geisler 23

PIC 16F877AProjektarbeit 2008/09

Da die Interruptroutine nur aus Befehlen besteht, die weder das Work-Register noch die Flags beeinflussen, kann hier auf ein Sichern und wiederherstellen besagter Daten verzichtet werden. Falsch wäre es nicht, und im Template kann man sich bereits die vollständige Prozedur vorgeben lassen.

M.Störk, H-H. Geisler 24

PIC 16F877AProjektarbeit 2008/09

M.Störk, H-H. Geisler 25

PIC 16F877AProjektarbeit 2008/09

Anhang-Pinbelegung D-Sub-Buchse-Pinbelegung Centronics-Buchse

Auf CD:

-Quellcode aller Programmteile-Folien für einen möglichen Gebrauch im Unterricht-Layout-Dateien der verwendeten Platinen-Datenblätter

M.Störk, H-H. Geisler 26

PIC 16F877AProjektarbeit 2008/09

Pinbelegung D-SUB-Buchse (25pol)

Signalname PinNr.RA0 / AN0RA1 / AN1RA2 / AN2 / VREF- / CVREF

RA3 / AN3 / VREF+RA4 / T0CKI / C1OUTRA5 / AN4 / SS / C2OUT

RB0 / INTRB1 Signalname PinNr.RB2 RD0 / PSP0 24RB3 / PGM RD1 / PSP1 1RB4 RD2 / PSP2 3RB5 RD3 / PSP3 5RB6 / PGC RD4 / PSP4 7RB7 / PGD RD5 / PSP5 9

RD6 / PSP6 11RC0 / T1OSO / T1CKI 23 RD7 / PSP7 13RC1 / T1OSI / CCP2 25RC2 / CCP1 2 RE0 / RD / AN5 20RC3 / SCK / SCL 4 RE1 / WR / AN6 21RC4 / SDI / SDA 6 RE2 / CS / AN7 22RC5 / SDO 8RC6 / TX / CK 10 VCC 17RC7 / RX / DT 12 Vss 18

MCLR

M.Störk, H-H. Geisler 27

PIC 16F877AProjektarbeit 2008/09

Pinbelegung Centronics-Buchse (36pol)

Signalname PinNr.RA0 / AN0 2RA1 / AN1 3RA2 / AN2 / VREF- / CVREF 4RA3 / AN3 / VREF+ 5RA4 / T0CKI / C1OUT 6RA5 / AN4 / SS / C2OUT 7

RB0 / INT 29RB1 30 Signalname PinNr.RB2 31 RD0 / PSP0 17RB3 / PGM 32 RD1 / PSP1 18RB4 33 RD2 / PSP2 19RB5 34 RD3 / PSP3 20RB6 / PGC 35 RD4 / PSP4 25RB7 / PGD 36 RD5 / PSP5 26

RD6 / PSP6 27RC0 / T1OSO / T1CKI 13 RD7 / PSP7 28RC1 / T1OSI / CCP2 14RC2 / CCP1 15 RE0 / RD / AN5 8RC3 / SCK / SCL 16 RE1 / WR / AN6 9RC4 / SDI / SDA 21 RE2 / CS / AN7 10RC5 / SDO 22RC6 / TX / CK 23 VCC 11RC7 / RX / DT 24 Vss 12

MCLR 1

M.Störk, H-H. Geisler 28