PIC PortA als digital I/O

Hallo

Ich benutze einen PIC16f87 für die Steuerung eines Blitzgerätes. Dabei benutze ich RA0-RA2, sowie einige Pins von PortB, als digitale Ausgänge.

Die Ausgänge an PortB funktionieren einwandfrei. Schreibe ich aber eine 1 in das PORTA Register, messe ich mit dem Oszilloskop keinen HIGH Pegel, sondern ein LOW, mit kurzen Piksern nach HIGH (etwa jede Millisekunde). Bei 0 sind sie sauber LOW. Das Verhalten tritt unabhängig von der externen Beschaltung auf. Woran kann das liegen? Der Komparator sollte ausgeschaltet sein (CMCON ist 7) TRISA (Bank 1) ist auch für die 3 Pins auf 0

Gibt es noch irgendetwas was ich übersehe? Es sieht so aus als versuche der PIC den Pegel auf HIGH zu setzen, werde aber immer wieder daran gehindert (auch ohne Beschaltung). Oder, als ob er sich damit begnügte, den Pegel ab und zu HIGH zu setzen, ihn aber nicht dort hält.

Danke für alle Hinweise

-Bastian

Reply to
Bastian Becker
Loading thread data ...

Hallo Bastian,

Bastian Becker schrieb in im Newsbeitrag: snipped-for-privacy@news.dfncis.de... [PIC16, PORTA, IO]

beim PORTA des PIC16... gibt's schon ein paar Besonderheiten zu beachten. Es ist z.B. hier

formatting link
sehr gut beschrieben.

Falls keine dieser Fehlermöglichkeiten zutrifft, tippe ich in Deinem Fall doch sehr auf Software. Teste dann mal Dein Programm mit dem Simulator aus MPLAB - dieses Tool ist sehr leistungsfähig und hat mir schon oft suuuper geholfen :-)

Viel Erfolg Klaus Holtermann

-- Holtermann Elektronik

formatting link
formatting link

Reply to
Klaus Holtermann

Hallo Klaus

Danke für Deine Antwort

Von den Fallen trifft keine zu. Wie kann man denn mit MPLAB SIM einen Pin beobachten? Die Simulation läuft (augenscheinlich) sauber so ab wie sie soll. Ich kann mit dem Stimulus Controller Eingänge setzen, aber wie kann man einen Ausgang ansehen?

Danke

-Bastian

Reply to
Bastian Becker

Bastian Becker :

Vielleicht das sog. "Read-Modify-Write"-Problem? Siehe z.B.

formatting link

--
Wir danken für die Beachtung aller Sicherheitsbestimmungen
Reply to
Wolfgang Strobl

Das klingt sehr danach (wie oben schon genannt), das Du die Eingänge noch auf Analog stehen hast. Falls nicht zu lang, poste doch mal den Quellcode.

Nur zur Sicherheit, den PIC hast Du schonmal ausgetauscht?

Gruss, Matthias

Reply to
Matthias Heinrichs

Hallo

Hallo

Der relevante Teil der Codes ist der Folgende. (Das Hauptprogramm sieht tatsächlich nicht viel anders aus. Es wird nur auf Interrupts vom I2C Bus, oder vom externen Trigger gewartet)

Am Ende dieses Testprogramms sollten doch RA0 und RA2 HIGH sein. Die 3 vom B Port sind schön HIGH, RA1 ist schön LOW, aber RA0 und RA2 zeigen das beschriebene Verhalten.

Werde ich heute ausprobieren.

Danke

-Bastian

init ;Takt auf 8 Mhz stellen (Datasheet S. 40 (4.6.3)) bsf STATUS, RP0 ; auf Bank 1 umschalten bsf OSCCON,IRCF0 bsf OSCCON,IRCF1 bsf OSCCON,IRCF2 bcf STATUS, RP0 ; auf Bank 0 zurückschalten

;Aus- und Eingänge movlw b'00000111' movwf CMCON ; Comparator austellen (sollte eigentlich schon aus sein)

bsf STATUS, RP0 ; auf Bank 1 umschalten movlw b'11111000' movwf TRISA ; RA0, RA1, RA2 als Ausgänge movlw b'11010010' movwf TRISB ; RB2, RB3, RB5 als Ausgänge bcf STATUS, RP0 ; auf Bank 0 zurückschalten movlw b'00000000' movwf PORTA movlw b'00000000' movwf PORTB ; alle auf 0 stellen ;I2C ;RB1 und RB4 sind bereits Eingänge movlw B'00110110' ; I2C slave mode, 7-bit address, enable, clock ein movwf SSPCON ; Datasheet S. 89 bsf STATUS, RP0 ; auf Bank 1 umschalten movlw B'00000000' movwf SSPSTAT movlw b'00001000' ; Adresse geben movwf SSPADD bsf PIE1, SSPIE ; Interrupt bei I2C Aktion erlauben bcf STATUS, RP0 ; auf Bank 0 zurückschalten ;Variablen initialisieren movlw B'00000011' movwf Folgezaehler ;Interrupt bsf STATUS, RP0 ; auf Bank 1 umschalten bcf OPTION_REG, INTEDG ; Interrupt bei fallender Flanke an RB0 bcf STATUS, RP0 ; auf Bank 0 zurückschalten bcf INTCON, INTF bsf INTCON, PEIE ; Perifäre Interups erlauben (S19 datasheet) ( sonst kein i2c) bsf INTCON, GIE ; Interrupts generell erlauben

return

;************************************************************************************************ ;************************************************************************************************ main ;Hauptprogramm

;Initialisieren call init ;test

movlw b'00000101' movwf PORTA movlw b'00101100' movwf PORTB ;\test loop goto loop ; Endlos wiederholen

;...

Reply to
Bastian Becker

Hallo Bastian,

Bastian Becker schrieb in im Newsbeitrag: snipped-for-privacy@news.dfncis.de...

[MPLAB]
öffne das Fenster "Special Function Registers". Dort siehst Du PORTA und PORTB, wahlweise in binärer, dezimaler oder hexadezimaler Darstellung. Das Fenster wird nach jedem Befehl im Simulator aktualisiert und somit siehst Du jederzeit die aktuelle Ausgangssituation der Portpins.

Viele Grüße Klaus Holtermann

-- Holtermann Elektronik

formatting link
formatting link

Reply to
Klaus Holtermann

Ich kann keine gröberen Fehler sehen, zur Sicherheit solltest Du auch die Register CVRCON sowie die Timer und das CCP-Modul initialisieren. Die Teilen sich auch noch Pins mit dem PortA...

Gruss, Matthias

Reply to
Matthias Heinrichs

Hallo Bastian,

schalte im ANSEL Register mal die analogen Eingänge für den AD-Wandler auf Digital-IO. Das sollte helfen.

Gruß Holger

Reply to
holger klabunde

holger klabunde schrieb:

sorry Falschmeldung, hat der 16F87 ja gar nicht :(

Gruß Holger

Reply to
holger klabunde

Hallo

Das Problem hat sich erledigt. Der Fehler lag in der Konfiguration. Ich weiß zwar noch nicht genau woran es lag, aber als ich meine __CONFIG ... Zeile weggelassen habe, und die Konfiguration mit dem Brennprogramm (Pbrenner von Sprut) eingestellt habe, hats geklappt. Danke nochmal für die Beiträge

-Bastian

Bastian Becker schrieb:

Reply to
Bastian Becker

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.