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...
Das mit GP3 ist mir bewusst! Und sorry ich meinte die Pins GP4 und/oder GP5! Auf Digital sind sie auch alle gestellt(ANSEL & CMCON)
1 | |
2 | movlw B'00110000' |
3 | banksel 0x05 |
4 | xorwf 0x05 |
So möchte ich 2 LED´s Alternierend An bzw. Aus gehen lassen, je nach ihrem vorherigen Zustand. Funktioniert auch soweit, allerdings nur mit GP4&GP5!
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.
wie ich vorgestern schon schrieb: Hilfreich wäre es, wenn Du den Sourcecode posten würdest... Oder am besten das ganze MPLAB Projekt.
so hier ist nun das ganze Prog.
1 | list p=12f675 |
2 | #include <P12f675.INC> |
3 | __CONFIG _PWRTE_ON & _MCLRE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT |
4 | |
5 | w_temp Equ 0x20 |
6 | status_temp Equ 0x21 |
7 | zaehler Equ 0x22 ; Zähler |
8 | signal Equ 0x23 ; Signale vom durchflussmesser |
9 | sig_speichern Equ 0x24 ; Speicher für "signal" |
10 | |
11 | org 0 |
12 | |
13 | goto Init ; Sprung zum Hauptprogramm |
14 | |
15 | org 4 |
16 | intvec |
17 | |
18 | movwf w_temp |
19 | swapf STATUS,w |
20 | bcf STATUS, RP0 ; status_temp in Bank 0 |
21 | movwf status_temp |
22 | btfsc INTCON,GPIF ;abfragen ob zähl Signal interrupt ausglöst hat |
23 | goto Signal |
24 | movlw D'158' ; 256-98=158 ((1MHz : 256 ): 158 = 20 Hz) |
25 | movwf TMR0 |
26 | |
27 | |
28 | 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.
Danke!!! Das war der Fehler! Sowas dummes :-P Aber manchmal sieht man den Wald ja vor lauter Bäumen nicht! ;-) Nochmals vielen Dank! MFG Marco
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.