PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : IO-Pins lassen sich nicht richtig mit "bsf"/"



keiang
21.07.2005, 12:35
Hallo zusammen,
ich versuch mich gerade an einem Pic 12F683 und hab Probleme mit den GPIO (IO-Pins):

Ich will hier testweise mal jeden Pin einzeln anschalten und dann wieder ausschalten. Seltsamerweise werden alle Pins auf 0 gesetzt sobald ein zugriff auf einen anderen Pin geschieht. Also ich sehe am Oszi das z.B. GPIO.0 auf high geht aber dann sofort mit dem nächsten Befehl wieder auf low, obwohl der nächste Befehl ("bcf GPIO,1") nichts mit diesen Pin zu tun hat.
Bei Pin "GPIO.5 sehe ich aber das der Pin länger auf high bleibt weil wohl erst noch der Sprungbefehl kommt und dann erst wieder auf low geht.

Ist es etwa nicht möglich die Pins einzeln via "bsf" / "bcf" zu manipulieren?

Ein anderes Problem was ich noch habe ist das der Pin GPIO.3 nicht gesetzt werden kann. Habe ich etwas in der Konfiguration vergessen?


;************************************************* *************
; los gehts mit dem Programm

org 0
goto Init


; Das Programm beginnt mit der Initialisierung

Init
bsf STATUS, RP0 ; Bank 1
movlw B'00110001' ; µC läuft mit 500kHz, Oscilator running from internal
movwf OSCCON
movlw B'00000000' ; alle Pins sind Input
movwf TRISIO
movlw B'00110111' ; aktiviere alle pull-up
movwf WPU
movlw B'00000111' ; enable pull-up, IRQ on falling edge, timer0 get clock internal, prescaler set to timer0 1:256
movwf OPTION_REG
bcf STATUS, RP0 ; Bank 0

main
bcf GPIO,0
bcf GPIO,1
bcf GPIO,2
bcf GPIO,3
bcf GPIO,4
bcf GPIO,5
bsf GPIO,0
bsf GPIO,1
bsf GPIO,2
bsf GPIO,3
bsf GPIO,4
bsf GPIO,5
goto main

end

PicNick
21.07.2005, 15:57
?? wenn du die Pins als Input definierst , versteh' ich das jetzt nicht ganz
sollten die nicht Output sein ?

Mobius
21.07.2005, 17:19
Mal einige Anmerkungen zum source. Wenn du schon Kommentierst, dann bitte richtig ;). Bei movwf TRISIO setzt du alle Pins auf Output und nicht input. Dass verwirrt, wenn man schnell den source überfliegt.

Also:

1. GPIO.3: ist gleichzeitig der MCLR-Pin und TRISIO.3 wird immer als 1 ausgelesen (also kann es NUR als ein Input oder MCLR-Pin genutzt werden).

2. Oscillator: Also, ich weiß nicht... ich muss zugeben, ich hab noch nie mit einem PIC dieser Bauart gearbeitet, aber, dass du den internen Oscillator aktivierst, aber NICHT angibts, welchen er benutzten soll (schätz mal, HFINTOSC) find ich mehr als seltsam. Könnte aber auch richtig sein, ka.

2. I/O-Pins: bei 500 KHz ist es erlich gesagt kein wunder, wenn du nichts siehst (vielleicht außer, du hast nen Speicher-Osci). Jeder bin wird mit einer Frequenz von 100 KHz (es sind 5 Befehe zwischen an und aus) angetrieben, viel zu schnell für das menschliche Auge. Wie gesagt, ohne nen Digital-Analyser oder nem Speicher-Osci wird das so nicht. Hau verzögerungen zwischen den Befehlen hinein, dann wird es gehen (4 nops = 2 goto = 1 call OHNE das return).

Ach, ja, das bcf und bsf setzten und löschen Bits, da wird an dem restlichen Inhalt des Registers nichts verändert ;).
MfG
Mobius

P.S.: statt D'0' in zwei Befehlen in den Trisio zu laden, kannst du in einem Befehl (clrf TRISIO) den Inhalt des Registers löschen. Ist schneller und verbraucht weniger Speicher ;)

P.P.S.: Ach, ja nur zur Verdeutlichung, wie schnell 100KHz sind... Da sind 10µS zwischen einem High und eine Low auf dem besagten Pin. Ich glaube, du wirst net schnell genug sein, um den Tastkopf zwischen den einzelnen Pins hin und her zu bewegen ;) :D

keiang
21.07.2005, 19:12
Wenn du schon Kommentierst, dann bitte richtig Zwinkern. Bei movwf TRISIO setzt du alle Pins auf Output und nicht input.
Sorry, habe noch den alten Kommentar drinnen stehen gehabt...


Habe den Fehler gefunden, das Problem lag an fehlenden Einstellungen in den Registern "ANSEL" und "CMCON0". Hier muss noch gesagt werden das die Pins keine Analogen-Eingänge sind und nicht zum Comperator gehen sollen *arg*. Also nur digitale I/O-Pins sind. (sehr ärgerlich bis mal alle Register gesetzt sind)
Eigendlich hätten die Pins wegen der falschen Konfiguration gar nicht reagieren sollen... *wunder*


1. GPIO.3: ist gleichzeitig der MCLR-Pin und TRISIO.3 wird immer als 1 ausgelesen (also kann es NUR als ein Input oder MCLR-Pin genutzt werden).
Stimmt, habe mich im Datenblatt von der Bezeichung I/O verwirren lassen. Aber ist im I/O-Modus nur als Eingang zu benutzen.


P.P.S.: Ach, ja nur zur Verdeutlichung, wie schnell 100KHz sind... Da sind 10µS zwischen einem High und eine Low auf dem besagten Pin. Ich glaube, du wirst net schnell genug sein, um den Tastkopf zwischen den einzelnen Pins hin und her zu
Habe es mit einem 2 Kanal Speicher Oszi gemessen. Dadurch konnte man genau sehen das wenn ein Eingang gesetzt wurde das alle anderen seltsamerweise gelöscht wurden. ?!?
Naja wie auch immer, mit den fehlenden Einstellungen geht es jetzt...