Forum: Mikrocontroller und Digitale Elektronik PIC16F873 GPIO-Problem


von rem (Gast)


Lesenswert?

Hallo,

ich bin neu in der PIC Programierung und stehe vor einem Problem, das 
ich mir nicht erklären kann.
Ich programmiere einen PIC16F873 mit dem PICDEM 2 PLUS BOARD, ICD2, 
MPLAB und CCS C Compiler.

Wenn ich die GPIOs von Port B als Ausgänge setzen möchte, wird Pin 2 
gleichzeitig auf High geschaltet. Bei den anderen Pins passiert dies 
nicht.

Mein Code:
#device PIC16F873
#BYTE TRISB  = 0x86

void main ()
{
  TRISB &= ~(1<<1);
  TRISB &= ~(1<<2);
  TRISB &= ~(1<<3);
  while(1);
}

Disassambliert:
   000    3000     MOVLW 0
   001    008A     MOVWF 0xa
   002    2804     GOTO 0x4
   003    0000     NOP
                 #device PIC16F873
                 #BYTE TRISB  = 0x86
                 void main ()
                 {
   004    0184     CLRF 0x4
   005    301F     MOVLW 0x1f
   006    0583     ANDWF 0x3, F
   007    1683     BSF 0x3, 0x5
   008    141F     BSF 0x1f, 0
   009    149F     BSF 0x1f, 0x1
   00A    151F     BSF 0x1f, 0x2
   00B    119F     BCF 0x1f, 0x3
                   TRISB &= ~(1<<1);
   00C    1086     BCF 0x6, 0x1
                   TRISB &= ~(1<<2);
   00D    1106     BCF 0x6, 0x2
                   TRISB &= ~(1<<3);
   00E    1186     BCF 0x6, 0x3
                   while(1);
   00F    280F     GOTO 0xf
                }

Woran kann es liegen, dass Pin2 ganz anders reagiert? Auf dem Board sind 
die 3 Pins gleich verschaltet.

rem

von _GastXIV (Gast)


Lesenswert?

Port Direction richtig?
Analog Modul abgeschaltet?
Komparatoren abgeschaltet

von rem (Gast)


Lesenswert?

was für ein analog modul und welche komparatoren meinst du?
die richtung der ports stimmt

von AS (Gast)


Lesenswert?

rem schrieb:
> Wenn ich die GPIOs von Port B als Ausgänge setzen möchte, wird Pin 2
> gleichzeitig auf High geschaltet.

Ja, das darf er tun, der PIC.
Zustand des Port Latch B ist nach Reset undefiniert, wie man
zweifelsfrei ebenso dem Datenblatt entnehmen könnte...

Abhilfe schafft, z.B. ein

  PORTB = 0;

vor Deiner TRISB Bitshifterei.


rem schrieb:
> #BYTE TRISB  = 0x86

Willst Du jetzt alle Register nochmals selber definieren?


rem schrieb:
>    008    141F     BSF 0x1f, 0
>    009    149F     BSF 0x1f, 0x1
>    00A    151F     BSF 0x1f, 0x2
>    00B    119F     BCF 0x1f, 0x3

cooler Compiler...
Dreht mal eben die default-Werte für die Analogkanäle...
Wenigstens erspart er Dir weitere Fragen zu RE0-2 ;)

von Lehrmann M. (ubimbo)


Lesenswert?

Das ist die sog. In-Out-Falle sehr bekannt bei PIC16FXXX.

Diese wurde bei PIC18 durch den sog. Latch (LATA,LATB,...) behoben.

http://www.sprut.de/electronic/pic/fallen/fallen.html#inout

von AS (Gast)


Lesenswert?

Lehrmann Michael schrieb:
> Das ist die sog. In-Out-Falle sehr bekannt bei PIC16FXXX.

Nö ;)

(
 Ich würde das auch prinzipiell niemals als "Falle" bezeichnet
 sehen wollen, allenfalls als Unkenntnis einer Read-Modify-Write
 Anweisung, die es schon seit Urzeiten in tausenden, anderen
 Controllern auch gibt...
)


Hier wurde einfach nur vergessen überhaupt etwas ins Latch zu schreiben:

rem schrieb:
> void main ()
> {
>   TRISB &= ~(1<<1);
>   TRISB &= ~(1<<2);
>   TRISB &= ~(1<<3);
>   while(1);
> }

von Martin S. (drunkenmunky)


Lesenswert?

LAT und PORT gibt es auch bei neuen PIC12 und PIC16. Ich würde oderso 
einen neueren uC nehmen. Die sind schon einiges komfortabler geworden...

von Lehrmann M. (ubimbo)


Lesenswert?

Martin S. schrieb:
> LAT und PORT gibt es auch bei neuen PIC12 und PIC16.

PORT ja klaro.

LAT bei welchem PIC12 gibt's LAT? Ich glaub die PIC12 haben noch nicht 
mal PORT bei denen heißt das GPIO =)

Martin S. schrieb:
> neuen PIC12 und PIC16

Das nennt man Contradictio in adiecto und ist ein Stilmittel der 
deutschen Sprache...

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Lehrmann Michael schrieb:
> Das ist die sog. In-Out-Falle sehr bekannt bei PIC16FXXX.
>
> Diese wurde bei PIC18 durch den sog. Latch (LATA,LATB,...) behoben.
>
> http://www.sprut.de/electronic/pic/fallen/fallen.html#inout

Nö.

Um das Read-Modify-Write-Problem zu haben müßte man ja erst mal ein 
Port-Register verändern. Das passiert hier aber gar nicht.

von AS (Gast)


Lesenswert?

Lehrmann Michael schrieb:
> LAT bei welchem PIC12 gibt's LAT? Ich glaub die PIC12 haben noch nicht
> mal PORT bei denen heißt das GPIO =)

  12F1822

(die Spitzfindigkeit der internen Bitbreite lassen wir mal
außer acht. Du sprachst ja von "PIC12" ;-)

Und schau Dir bei der Kiste auch gleich mal den Rest an ;)
Abgesehen von den "Standards", die sowieso (...) jeder PIC
hat (COMP, ADC auf fast allen Pins, und, und, und...):

- shadow register (aka. "context saving")
- 16er stack mit over- und underflow
- DAC jetzt auch auf Pin; nicht wie die alter 16er "Leiter"
- on-board Temperatursensor
- data signal modulator
- capacitive sensing
- voltage reference mit multiplier
- ADDWFC, SUBWFB, ASRF, MOVLP, MOVLB
- MOVIW, MOVWI
- BRW
- und endlich: UART in nem 8 Pin package
  (da hatte Microchip lange ein Defizit...)

Und das für 0.78 US$, Listenpreis +5000, QFN, industrial

Noch Fragen? ;-)

von Martin S. (drunkenmunky)


Lesenswert?

Lehrmann Michael schrieb:
> Martin S. schrieb:
>> LAT und PORT gibt es auch bei neuen PIC12 und PIC16.
>
> PORT ja klaro.
>
> LAT bei welchem PIC12 gibt's LAT? Ich glaub die PIC12 haben noch nicht
> mal PORT bei denen heißt das GPIO =)
>
> Martin S. schrieb:
>> neuen PIC12 und PIC16
>
> Das nennt man Contradictio in adiecto und ist ein Stilmittel der
> deutschen Sprache...

Wie heißt es so schön, wenn man keine Ahnung hat, einfach mal die Fresse 
halten.

Wie schon erwähnt, hat der 12F1822 LAT und PORT.

Mit der letzten Aussage hat glaube ich niemand verstanden, was du damit 
ausdrücken wolltest...

PIC12 und PIC16 (die Neuen) sind sehr verwandt. Oder warum meinst du 
haben der 12F1822 und der 16F1823 das selbe Datenblatt?

von rem (Gast)


Lesenswert?

Danke für eure Antworten!!

@AS: das mit PORTB=0 hat funktioniert. THX!!!! :)

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.