Forum: Mikrocontroller und Digitale Elektronik PIC12F675 Nur GP5und/oder GP6 als Ausgang verwendbar


von Marco S (Gast)


Lesenswert?

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

von Severino R. (severino)


Lesenswert?

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...

von Marco S (Gast)


Lesenswert?

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!

von Severino R. (severino)


Lesenswert?

Läuft es im Simulator (MPLAB SIM) korrekt?

von Jens Plappert (Gast)


Lesenswert?

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

von Marco S (Gast)


Lesenswert?

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.

von Severino R. (severino)


Lesenswert?

wie ich vorgestern schon schrieb:

Hilfreich wäre es, wenn Du den Sourcecode posten würdest...

Oder am besten das ganze MPLAB Projekt.

von Marco S (Gast)


Lesenswert?

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

von Severino R. (severino)


Lesenswert?

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.

von Marco S (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.