Hallo Schlapfi.
Zunächst willkommen im Forum.
Ist das dein Microcontroller-Erstlingswerk? Ein kleines feines Projekt!
Zunächst ein ehrliches Lob: Du hast deine Source recht gut dokumentiert, sowohl die Zusammenhänge des Codes in sich selbst, als auch die Zuordnung zur Hardware.
Man kann ein paar gute Anregungen aus deinem Code mitnehmen.
Es sind aber auch einige Fallstricke eingebaut, die ich gerne einem anderen Anfänger ersparen würde.
Ich liste ein paar auf, ohne Anspruch auf Wichtigkeit und Vollständigkeit:
- Interrupts global freizugeben, ohne tatsächlich eine Interruptroutine zu implementieren ist nicht nötig und ein wenig riskant. Du verwendest das TMR0-Überlaufflag. Dieses wird unabhängig von einer Interruptfreigabe erzeugt, allein durch den Überlauf von TMR0.
- Der Programmstart sollte mit einem Sprung zu einem 'sprechenden' Label beginnen, das den Startpunkt des Hauptprogramms erkennen lässt, also z.B. 'main' oder 'start'. Sprung deswegen, weil im Falle eines Interrupts das Hauptprogramm unterbrochen und die Befehlsausführung beim Programmspeicherplatz Nr. 4 fortgesetzt wird. Es ist sicherer, gleich von Anfang an diese Speicherzuordnung im Programm anzulegen, damit man nicht später beim Einstig in die Interruprprogrammierung genau deswegen auf die Nase fällt. Ein Rücksprung RETFIE an dieser Stelle schafft dann zusätzliche 'Sicherheit' gegen unliebsame Überraschungen bei weiteren Experimenten in der ASM-Programmierung. Die von Microchip mitgelieferten Programmrohlinge (Templates) bilden genau dieses sichere Grundgerüst auch ab.
- Ein Sprung GOTO $-1 ist legitim, wenn es sich um ein quasi 'atomares' Programmelement zum Warten auf ein Flag handelt; da wird man nicht versehentlich einen weiteren Befehl einschieben und erspart sich das Erfinden eines Labelnamens. Anders dagegen ein GOTO $+9: Das birgt das Risiko, bei der Änderung des übersprungenen Codeabschnitts zu ungewollten Sprungzielen zu führen; hierfür gibt es benannte Sprungmarken (Labels). Die sollte man auch verwenden.
- ganz böse Falle:
Code:
LED
addwf PCL,1
retlw D0
retlw ...
Dieses Konstrukt funktioniert nur so lange, bis bei der Manipulation von PCL ein Überlauf geschieht. Entweder muss dieser Fall abgefangen werden oder man platziert das Unterprogramm LED per org-Zeile so, dass es unverrückbar an sicherer Stelle im Programmspeicher steht, dann aber am besten gaaaaaanz weit hinten am Ende eines Codesegments! Jetzt funktioniert dein Programm zwar, aber jede Erweiterung birgt das Risiko, dass das UP 'LED' an eine gefährliche Stelle innerhalb des Codespeichers rutscht und der Programmablauf sich im Nirvana verirrt. Genaueres über die Table Read-Methodik findet sich in der App Note AN556 bei Microchip.
Gruß
Christian.
Lesezeichen