Hallo!
Ich habe ein Problem in einem Programm, in welchem ich mit einem
Interrupt verschiedene Ausgänge beschalten will.
Das Problem ist, dass ich nur die Pins GP5 und/oder GP6 als Ausgang
benutzen kann. Mit allen anderen Pins passiert nichts wenn ich diese
beschalten will.
Die Pins sind auch alle als Ausgang gesetzt. Ich kann mir so halt nur
nicht erklären warum ich nur die beiden als Ausgang benutzen kann.
Hoffentlich hat von euch jemand eine idee.
MFG Marco
Hallo Marco
Also:
- GP3 kann man nur als Eingang nutzen
- GP6 existiert auf dem PIC12F675 nicht. Welchen PIC verwendest Du
wirklich?
- Grundsätzlich müssen die GPx-Pins konfiguriert werden, um sie als
digital I/O nutzen zu können.
(Datenbuch Kapitel 3.1 "The ANSEL (9Fh) and CMCON (19h) registers (9Fh)
must be initialized to configure an analog channel as a digital input.
Pins configured as analog inputs will read ‘0’. The ANSEL register is
defined for
the PIC12F675.")
Hilfreich wäre es, wenn Du den Sourcecode posten würdest...
bin mir grad nicht sicher, aber funktioniert banksel 0x05?
Hab iwie grad im Kop dass das wohl nur bei Labels/defines hinhauen
dürfte.
also A equ 0x05 oder define A 0x05
banksel a
Also im Simulator läuft es einwandfrei ab, allerdings auch nur mit mit
den beiden Pins. Es müsste doch aber rein logisch gesehen auch mit den
Pins GP0..GP2 laufen oder nicht? Die sind ja auch als Ausgang
verwendbar.
Das es mit GP3 nicht klappt ist mir wie gesagt bewusst
Der Befehl
1
Banksel 0x05
dasselbe wie
1
Banksel GPIO
funktioniert.
Die beiden Ports Alternieren ja. Also am Banksel kann es nicht liegen.
movlw B'00110000' ; Funktioniert nur mit B'00110000' oder mit
29
banksel 0x05 ; B'00010000' mit mehr oder weniger nicht
30
xorwf 0x05 ; GPIO = 0x05
31
32
33
34
btfsc 0x22,6 ; Zero Bit Abfragen
35
goto Laden ; Zero Bit = 1 goto Laden
36
goto Zaehlen ; Zero Bit = 0 goto Zaehlen
37
38
Laden
39
40
movlw D'23' ; (41 * 0,05s = 2s),64-41=23
41
movwf zaehler ;w nach zaehler kopieren
42
43
movf signal,1
44
movwf sig_speichern
45
clrf signal
46
47
Zaehlen
48
incf zaehler,1 ; den Wert in zaehler um 1 verringern
49
goto Int_end
50
51
Signal
52
incf signal,1
53
54
btfss GPIO,0
55
bsf GPIO,0
56
bcf GPIO,0
57
58
Int_end
59
bcf INTCON, T0IF
60
bcf INTCON, GPIF
61
swapf status_temp,w
62
movwf STATUS
63
swapf w_temp,f
64
swapf w_temp,w
65
retfie
66
67
Init
68
69
bcf STATUS, RP0 ; Bank 0
70
clrf GPIO ; aus!
71
movlw 0x07 ; 0x07 in W schreiben
72
movwf CMCON ; alle Pins digital
73
movlw 0x00 ; 0x00 in W schreiben
74
movwf ANSEL ; W nach ANSEL
75
bsf STATUS, RP0 ; Bank 1
76
movlw b'00001000'
77
movwf TRISIO
78
79
movlw B'10000111' ; internen Takt zählen, Vorteiler zum Timer0, 256:1
80
81
movwf OPTION_REG
82
bcf STATUS, RP0 ; Bank0
83
bsf STATUS, RP0 ; Bank 1
84
movlw 0x34
85
86
movwf OSCCAL ; 4-MHz-Kalibrierung
87
bcf STATUS, RP0 ; Bank 0
88
bcf INTCON, T0IF
89
bsf INTCON, T0IE ; Timer0 interrupt erlauben
90
bcf INTCON, GPIF
91
bsf INTCON, GPIE ; Port Change Interrupt löschen
92
bsf IOCB, IOCB3 ; Interrupt On-Change an GP3 anschalten
93
bsf INTCON, GIE ; Interrupt erlauben
94
95
96
97
loop
98
goto loop
99
100
101
end
Das Programm soll mal für einen Durchflussmesser sein. Dieser gibt
Impulse an den Pic weiter entsprechend der Durchflussmenge. Diese sollen
in eine Variable geschrieben werden und erstmal über ein paar leds
ausgegeben werden. Erstmal habe ich angedacht es mit einer art "Ampel"
anzuzeigen ob der Durchfluss OK ist oder nicht.
Das Programm ist halt noch nicht fertig mitunter auch wegen den schon
erwähnten Problemen.
MFG Marco
Du hast ANSEL nicht richtig konfiguriert, weil immer noch Bank 0
selektiert ist:
Dein Code:
bcf STATUS, RP0 ; Bank 0
clrf GPIO ; aus!
movlw 0x07 ; 0x07 in W schreiben
movwf CMCON ; alle Pins digital
movlw 0x00 ; 0x00 in W schreiben
movwf ANSEL ; W nach ANSEL
bsf STATUS, RP0 ; Bank 1
movlw b'00001000'
movwf TRISIO
Microchip (Datenbuch):
BCF STATUS,RP0 ;Bank 0
CLRF GPIO ;Init GPIO
MOVLW 07h ;Set GP<2:0> to
MOVWF CMCON ;digital IO
> BSF STATUS,RP0 ;Bank 1
CLRF ANSEL ;Digital I/O
MOVLW 0Ch ;Set GP<3:2> as inputs
MOVWF TRISIO ;and set GP<5:4,1:0>
;as outputs
Bank 1 VOR Schreiboperation auf ANSEL einschalten, dann läuft's.