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
Port Direction richtig? Analog Modul abgeschaltet? Komparatoren abgeschaltet
was für ein analog modul und welche komparatoren meinst du? die richtung der ports stimmt
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 ;)
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
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); > }
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...
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: > 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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.