mikrocontroller.net

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


Autor: Marco S (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Marco S (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

   
movlw    B'00110000'
banksel  0x05      
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!

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Läuft es im Simulator (MPLAB SIM) korrekt?

Autor: Jens Plappert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marco S (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
 Banksel 0x05 
 dasselbe wie
Banksel GPIO
 funktioniert.

Die beiden Ports Alternieren ja. Also am Banksel kann es nicht liegen.

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie ich vorgestern schon schrieb:

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

Oder am besten das ganze MPLAB Projekt.

Autor: Marco S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so hier ist nun das ganze Prog.
list p=12f675
#include <P12f675.INC>
__CONFIG  _PWRTE_ON & _MCLRE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT

w_temp         Equ 0x20
status_temp    Equ 0x21
zaehler        Equ 0x22  ; Zähler 
signal         Equ 0x23  ; Signale vom durchflussmesser
sig_speichern  Equ 0x24  ; Speicher für "signal"

org    0

goto   Init               ; Sprung zum Hauptprogramm

org  4 
intvec
    
movwf   w_temp
swapf   STATUS,w
bcf     STATUS, RP0     ; status_temp in Bank 0
movwf   status_temp
btfsc  INTCON,GPIF    ;abfragen ob zähl Signal interrupt ausglöst hat
goto  Signal
movlw   D'158'          ; 256-98=158 ((1MHz : 256 ): 158 = 20 Hz)
movwf   TMR0      


movlw  B'00110000'    ; Funktioniert nur mit B'00110000' oder mit
banksel  0x05      ; B'00010000' mit mehr oder weniger nicht
xorwf  0x05      ; GPIO = 0x05

  

btfsc  0x22,6          ; Zero Bit Abfragen 
goto   Laden          ; Zero Bit = 1 goto Laden
goto   Zaehlen          ; Zero Bit = 0 goto Zaehlen

Laden
    
    movlw  D'23'          ; (41 * 0,05s = 2s),64-41=23
    movwf  zaehler          ;w nach zaehler kopieren  
    
    movf  signal,1
    movwf  sig_speichern
    clrf  signal

Zaehlen
    incf  zaehler,1        ; den Wert in zaehler um 1 verringern   
    goto  Int_end

Signal
    incf  signal,1

    btfss  GPIO,0
    bsf    GPIO,0  
    bcf    GPIO,0
    
Int_end 
    bcf    INTCON, T0IF
    bcf    INTCON, GPIF
    swapf   status_temp,w
    movwf   STATUS
    swapf   w_temp,f
    swapf   w_temp,w
    retfie

Init
        
    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

    movlw   B'10000111' ; internen Takt zählen, Vorteiler zum Timer0, 256:1

    movwf   OPTION_REG
    bcf     STATUS, RP0             ; Bank0
    bsf     STATUS, RP0             ; Bank 1
    movlw  0x34        

    movwf   OSCCAL                  ; 4-MHz-Kalibrierung
    bcf     STATUS, RP0             ; Bank 0 
    bcf    INTCON, T0IF
    bsf     INTCON, T0IE         ; Timer0 interrupt erlauben
    bcf    INTCON, GPIF
    bsf    INTCON, GPIE      ; Port Change Interrupt löschen 
    bsf    IOCB, IOCB3        ; Interrupt On-Change an GP3 anschalten
    bsf     INTCON, GIE         ; Interrupt erlauben



loop   
    goto    loop           


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

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marco S (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.