PIC12F675 Nur GP5und/oder GP6 als Ausgang verwendbar

Gast #701181
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
#701250
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...
Gast #701300
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!
Gast #703020
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.
Gast #703274
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
#703314
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren