-         

Ergebnis 1 bis 4 von 4

Thema: IO-Pins lassen sich nicht richtig mit "bsf"/"

  1. #1

    IO-Pins lassen sich nicht richtig mit "bsf"/"

    Anzeige

    Hallo zusammen,
    ich versuch mich gerade an einem Pic 12F683 und hab Probleme mit den GPIO (IO-Pins):

    Ich will hier testweise mal jeden Pin einzeln anschalten und dann wieder ausschalten. Seltsamerweise werden alle Pins auf 0 gesetzt sobald ein zugriff auf einen anderen Pin geschieht. Also ich sehe am Oszi das z.B. GPIO.0 auf high geht aber dann sofort mit dem nächsten Befehl wieder auf low, obwohl der nächste Befehl ("bcf GPIO,1") nichts mit diesen Pin zu tun hat.
    Bei Pin "GPIO.5 sehe ich aber das der Pin länger auf high bleibt weil wohl erst noch der Sprungbefehl kommt und dann erst wieder auf low geht.

    Ist es etwa nicht möglich die Pins einzeln via "bsf" / "bcf" zu manipulieren?

    Ein anderes Problem was ich noch habe ist das der Pin GPIO.3 nicht gesetzt werden kann. Habe ich etwas in der Konfiguration vergessen?

    Code:
    ;**************************************************************
    ; los gehts mit dem Programm
    
    	org 	0
    	goto	Init	
    
    
    ; Das Programm beginnt mit der Initialisierung
    
    Init	
    	bsf     STATUS, RP0		; Bank 1
    	movlw	B'00110001'		; µC läuft mit 500kHz, Oscilator running from internal
    	movwf	OSCCON
    	movlw	B'00000000'		; alle Pins sind Input
    	movwf	TRISIO
    	movlw	B'00110111'		; aktiviere alle pull-up
    	movwf	WPU
    	movlw	B'00000111'		; enable pull-up, IRQ on falling edge, timer0 get clock internal, prescaler set to timer0 1:256
    	movwf	OPTION_REG
    	bcf     STATUS, RP0		; Bank 0
    
    main
    	bcf		GPIO,0
    	bcf		GPIO,1
    	bcf		GPIO,2
            bcf		GPIO,3
    	bcf		GPIO,4
    	bcf		GPIO,5
    	bsf		GPIO,0
    	bsf		GPIO,1
    	bsf		GPIO,2
            bsf		GPIO,3
    	bsf		GPIO,4
    	bsf		GPIO,5
    	goto main
    
    	end

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    ?? wenn du die Pins als Input definierst , versteh' ich das jetzt nicht ganz
    sollten die nicht Output sein ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.10.2004
    Ort
    ferd. Waldmüllerg. 7/2
    Alter
    32
    Beiträge
    456
    Mal einige Anmerkungen zum source. Wenn du schon Kommentierst, dann bitte richtig . Bei movwf TRISIO setzt du alle Pins auf Output und nicht input. Dass verwirrt, wenn man schnell den source überfliegt.

    Also:

    1. GPIO.3: ist gleichzeitig der MCLR-Pin und TRISIO.3 wird immer als 1 ausgelesen (also kann es NUR als ein Input oder MCLR-Pin genutzt werden).

    2. Oscillator: Also, ich weiß nicht... ich muss zugeben, ich hab noch nie mit einem PIC dieser Bauart gearbeitet, aber, dass du den internen Oscillator aktivierst, aber NICHT angibts, welchen er benutzten soll (schätz mal, HFINTOSC) find ich mehr als seltsam. Könnte aber auch richtig sein, ka.

    2. I/O-Pins: bei 500 KHz ist es erlich gesagt kein wunder, wenn du nichts siehst (vielleicht außer, du hast nen Speicher-Osci). Jeder bin wird mit einer Frequenz von 100 KHz (es sind 5 Befehe zwischen an und aus) angetrieben, viel zu schnell für das menschliche Auge. Wie gesagt, ohne nen Digital-Analyser oder nem Speicher-Osci wird das so nicht. Hau verzögerungen zwischen den Befehlen hinein, dann wird es gehen (4 nops = 2 goto = 1 call OHNE das return).

    Ach, ja, das bcf und bsf setzten und löschen Bits, da wird an dem restlichen Inhalt des Registers nichts verändert .
    MfG
    Mobius

    P.S.: statt D'0' in zwei Befehlen in den Trisio zu laden, kannst du in einem Befehl (clrf TRISIO) den Inhalt des Registers löschen. Ist schneller und verbraucht weniger Speicher

    P.P.S.: Ach, ja nur zur Verdeutlichung, wie schnell 100KHz sind... Da sind 10µS zwischen einem High und eine Low auf dem besagten Pin. Ich glaube, du wirst net schnell genug sein, um den Tastkopf zwischen den einzelnen Pins hin und her zu bewegen

  4. #4
    Wenn du schon Kommentierst, dann bitte richtig Zwinkern. Bei movwf TRISIO setzt du alle Pins auf Output und nicht input.
    Sorry, habe noch den alten Kommentar drinnen stehen gehabt...


    Habe den Fehler gefunden, das Problem lag an fehlenden Einstellungen in den Registern "ANSEL" und "CMCON0". Hier muss noch gesagt werden das die Pins keine Analogen-Eingänge sind und nicht zum Comperator gehen sollen *arg*. Also nur digitale I/O-Pins sind. (sehr ärgerlich bis mal alle Register gesetzt sind)
    Eigendlich hätten die Pins wegen der falschen Konfiguration gar nicht reagieren sollen... *wunder*

    1. GPIO.3: ist gleichzeitig der MCLR-Pin und TRISIO.3 wird immer als 1 ausgelesen (also kann es NUR als ein Input oder MCLR-Pin genutzt werden).
    Stimmt, habe mich im Datenblatt von der Bezeichung I/O verwirren lassen. Aber ist im I/O-Modus nur als Eingang zu benutzen.

    P.P.S.: Ach, ja nur zur Verdeutlichung, wie schnell 100KHz sind... Da sind 10µS zwischen einem High und eine Low auf dem besagten Pin. Ich glaube, du wirst net schnell genug sein, um den Tastkopf zwischen den einzelnen Pins hin und her zu
    Habe es mit einem 2 Kanal Speicher Oszi gemessen. Dadurch konnte man genau sehen das wenn ein Eingang gesetzt wurde das alle anderen seltsamerweise gelöscht wurden. ?!?
    Naja wie auch immer, mit den fehlenden Einstellungen geht es jetzt...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •