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
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 ;)
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);> }
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...
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? ;-)
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?