Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC 16F628A - PortA zeigt seltsames Verhalten
rliebold
23.01.2017, 07:14
Hallo,
ich bin noch ziemlicher Anfänger in der PIC Controller Programmierung.
Mein Projekt ist ein Lauflicht welches 12 LED's ansteuern soll, mit einem 16F628A.
Dabei klappt das Grundsätzlich schon sehr gut, nur der Port A ist etwas komisch.
Plan ist das Ansteuren der LED's sequentiell, ich meine also die LED's nacheinander einschalten und dann von vorn beginnend nacheinander wieder ausschalten.
Dabei verwende ich folgenden Code für PortA
CLRF PORTA
BANKSEL TRISA ; wählt PortA
MOVLW b'10110100' ;
MOVWF TRISA ; PORTA beschreiben
BANKSEL PORTA ; wechselt PortA
; LED's nacheinander einschalten mit RA0 beginnen
BSF PORTA,RA0 ; BSF S steht für Set setzt PortA0 auf 1 -> sonst BCF C steht für Clear würde den PortA auf 0 setzen
call _delay_2s ; ruft Wait Funktion auf, die Funktion ist unten definiert und wartet Dalay 1
BSF PORTA,RA1 ; setzt LED 2
call _delay_2s
BSF PORTA,RA3 ; setzt LED 3
call _delay_2s
BSF PORTA,RA6 ; setzt LED 4
call _delay_2s
Dabei werden die LED's aber nicht nacheinander ein sondern immer eine an dann die nächste an, dabei geht aber die vorherige aus?
Im Debugger zeigt der Code genau das gewünschte Verhalten, in der Realität aber leider nicht, hat jemand eine Idee?
Der Port B wird auf gleiche Weise angesteuert und klappt wunderbar.
Gruß Reiner
Hallo!
Du musst jedes LED nach Einschalten mit BSF PORTA,RAX auch mit BCF PORTA,RAX Ausschalten. Siehe dazu: http://rn-wissen.de/wiki/index.php?title=PIC_Assembler#Das_erste_Programm. ;)
nur der Port A ist etwas komisch.
Was ist komisch?
Im Debugger zeigt der Code genau das gewünschte Verhalten, in der Realität aber leider nicht, hat jemand eine Idee?
Der Port B wird auf gleiche Weise angesteuert und klappt wunderbar.
Was macht PORTA denn konkret?
Bei "komischem" Verhalten schaue ich immer im Datenblatt des PIC nach, ob die Portpins irgendwelchen Peripheriemodulen zugeordent sein könnten. Im Fall von PortA könnte es vielleicht der Comparator sein. Es gibt im PIC16F628A Datenblatt (http://ww1.microchip.com/downloads/en/DeviceDoc/40044G.pdf#G7.1032800) ein Stück Beispielcode zur Initialisierung von PORTA mit Abschaltung der Comparatorfunktion der PORTA Pins.
Hier im RN gibt es einen alten Thread über diese und ähnliche PIC Fallen (https://www.roboternetz.de/community/threads/16678-PIC-Fallen).
rliebold
23.01.2017, 10:43
Hallo PICTure,
den gleichen Zweig für das ausschalten der LED's gibt es natürlich auch noch einmal als BCF Routinen.
Hier geht es aber darum das die LED's zuerst mal alle nacheinander eingeschaltet werden sollen. Im Code sollte das deutlich werden.
Im Debugger wird es auch genauso dargestellt, wenn der Code aber im Controller läuft, dann geht RA0 an, nächster Schritt RA1 geht an, aber im gleichen Moment geht RA0 aus, ohne das ein BCF für RA0 aufgerfuen wird, dann so weiter?
Ich hoffe so wird die Erklärung deutlicher.
Danke und Gruß Reiner
- - - Aktualisiert - - -
Hallo witkatz,
in der Antwort an PICture habe ich noch einmal erklärt was da seltsam ist.
Ansonsten ist mir bewußt das die Port's mehrfach Funktionen haben können. Die Comperatoren sind zuvor abgeschaltet. Ich habe deshalb auch nicht 0,1,2,3 genommen sondern 0,1,3,6. Da war ich mir sicherer das nicht andere Funktionen auf dem Ausgang stören.
Danke Gruß Reiner
dann geht RA0 an, nächster Schritt RA1 geht an, aber im gleichen Moment geht RA0 aus, ohne das ein BCF für RA0 aufgerfuen wird, dann so weiter?
Die Comperatoren sind zuvor abgeschaltet.
Poste bitte den betreffenden Ausschnitt deiner Initialisierungssequenz, oder prüfe, ob CMCON wirklich auf 7 gesetzt wird.
Ich habe deshalb auch nicht 0,1,2,3 genommen sondern 0,1,3,6. Da war ich mir sicherer das nicht andere Funktionen auf dem Ausgang stören.
Beim Setzen des Portpins werden die aktuellen Zustände aller(!) Pins des Ports gelesen und erneut gesetzt (read-modify-write). Es scheint, dass beim Setzen von RA1, RA0 als 0 zurückgelesen wird. Entweder sind die Pins RA0, RA1, RA3 immer noch über CMCON als Analogeingang konfiguriert oder so überlastet, dass die Spannung am Ausgangspin in die Knie geht bzw. nicht schnell genug ansteigt und als 0 detektiert wird.
rliebold
23.01.2017, 12:01
Hallo witkatz,
Danke für deine Antwort.
Ich denke das mit CMCON 7 wird es aber sein.
Da schau ich heute Abend mal rein.
Aber weshalb eigentlich 7 ich dachte nur die Pins 2 und 3 also RA3 und RA4 können auch als Comperator geschaltet werden?
Die habe ich deshalb nicht genutzt.
Das die Spannung zusammenbricht schließe ich eigentlich aus, weil alle anderen 8 Ausgänge von PortB an bleiben.
Gruß Reiner
Aber weshalb eigentlich 7 ich dachte nur die Pins 2 und 3 also RA3 und RA4 können auch als Comperator geschaltet werden?
Teilweise richtig, RA3 und RA4 können über CMCON als Comparatorausgang konfiguriert werden.
Bei RA0-RA3 ist aber der Analog-Input-Mode, den man für digitale Funktion ebenfalls per CMCON abschalten muss. Wenn die Pins als Comparatoreingänge konfiguriert sind, werden sie bei BSF digital als 0 zurückgelesen. Lese dir vielleicht etwas zu read-modify-write ein, zum Verständnis, wie BCF und BSF funktionieren. In dem Datenblatt findest du auch eine kurze Erklärung über die Funktion der Portpins in diesem Zusammenhang.
-> s. Kap. 5.3 I/O Programming Considerations (http://ww1.microchip.com/downloads/en/DeviceDoc/40044G.pdf#page=46)
rliebold
23.01.2017, 18:18
Hallo witkatz,
vielen Dank für deine Hinweise.
Ich hatte zwar schon alles korrekt initialisiert
CLRF CCP1CON ;Turn CCP module off CCP1 auschalten, sonst leuchtet RB3 nicht
; 16F628 alle Comparatoreingänge auf Digital umschalten
; alles in der Bank 0 auf Digital umschalten
BSF CMCON, CM0
BSF CMCON, CM1
BSF CMCON, CM2
aber an der falschen Stelle, nämlich vor der Main Routine :confused:
Ist eben immer gut wenn man mal drüber spricht (schreibt).
Danke und Gruß Reiner
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.