Hallo Leute Ich bin gerade dabei den 16f887 zu programmieren, jedoch so einach macht mir der Pic mein Leben nicht. Die Pins 33-38 schalten mir keinen Ausgang durch, jedoch die Pins 39-40 schon. Wird der Pin 36 mit Spannung belegt, dann sind alle Ausgänge 0. mein File: #include <xc.h> #pragma config1 |= 0b.1000.0000.1101.0100 //Seite 210/212 #pragma config CP = OFF // FLASH Program Memory Code Protection #pragma ANSEL |= 0b.0000.0000 //ANS7 - 0 Seite 39 //1 = Analog input, 0 = Digital I/O #pragma ANSELH |= 0b.--00.0000 //ANS13 - 8 Seite 39 #pragma PIE1 |= 0b.0000.0000 //PERIPHERAL INTERRUPT Wisst ihr wo mein Problem ist? liebe Grüße Andreas
Die 230V werden von Optokopplern in 5V umgesetzt Die Eingangsspannung ist 4,5V. /* File: main.c * Author: andreas * Created on 01. September 2014, 11:07*/ #include <xc.h> #include <stdio.h>//könnte man weglassen #include <stdlib.h>//könnte man weglassen #include <pic16f887.h> #pragma config1 |= 0b.1000.0000.1101.0100 //Seite 210/212 #pragma config CP = OFF // FLASH Program Memory Code Protection #pragma ANSEL |= 0b.0000.0000 //ANS7 - 0 Seite 39 //1 = Analog input, 0 = Digital I/O #pragma ANSELH |= 0b.--00.0000 //ANS13 - 8 Seite 39 #pragma PIE1 |= 0b.0000.0000 //PERIPHERAL INTERRUPT void setPins() { //0=Ausgang oder nicht definiert, 1=Eingang #define pin1 PORTEbits.RE3 //pin 1 not in use TRISEbits.TRISE3 = 0; #define ledErr PORTAbits.RA0 //pin 2 TRISAbits.TRISA0 = 0; #define in230V_out_1 PORTAbits.RA1 //pin 3 TRISAbits.TRISA1 = 1; #define in230V_out_2 PORTAbits.RA2 //pin 4 TRISAbits.TRISA2 = 1; #define in230V_out_3 PORTAbits.RA3 //pin 5 TRISAbits.TRISA3 = 1; #define in230V_out_4 PORTAbits.RA4 //pin 6 TRISAbits.TRISA4 = 1; #define in24V_out_5 PORTAbits.RA5 //pin 7 TRISAbits.TRISA5 = 1; #define in24V_out_6 PORTEbits.RE0 //pin 8 TRISEbits.TRISE0 = 1; #define in24V_out_7 PORTEbits.RE1 //pin 9 TRISEbits.TRISE1 = 1; #define in24V_out_8 PORTEbits.RE2 //pin 10 TRISEbits.TRISE2 = 1; //11= + //12= - #define pin13 PORTAbits.RA7 //pin 13 not in use TRISAbits.TRISA7 = 0; #define pin14 PORTAbits.RA6 //pin 14 not in use TRISAbits.TRISA6 = 0; #define pin15 PORTCbits.RC0 //pin 15 not in use TRISCbits.TRISC0 = 0; #define okPin PORTCbits.RC1 //pin 16 TRISCbits.TRISC1 = 1; #define out_1_in PORTCbits.RC2 //pin 17 TRISCbits.TRISC2 = 0; #define out_2_in PORTCbits.RC3 //pin 18 TRISCbits.TRISC3 = 0; #define out_3_in PORTDbits.RD0 //pin 19 TRISDbits.TRISD0 = 0; #define out_4_in PORTDbits.RD1 //pin 20 TRISDbits.TRISD1 = 0; //------------------------------------------------- #define out_4_out PORTDbits.RD2 //pin 21 TRISDbits.TRISD2 = 0; #define out_3_out PORTDbits.RD3 //pin 22 TRISDbits.TRISD3 = 0; #define out_2_out PORTCbits.RC4 //pin 23 TRISCbits.TRISC4 = 0; #define out_1_out PORTCbits.RC5 //pin 24 TRISCbits.TRISC5 = 0; #define pin25 PORTCbits.RC6 //pin 25 not in use TRISCbits.TRISC6 = 0; #define pin26 PORTCbits.RC7 //pin 26 not in use TRISCbits.TRISC7 = 0; #define pin27 PORTDbits.RD4 //pin 27 not in use TRISDbits.TRISD4 = 0; #define pin28 PORTDbits.RD5 //pin 28 not in use TRISDbits.TRISD5 = 0; #define pin29 PORTDbits.RD6 //pin 29 not in use TRISDbits.TRISD6 = 0; #define pin30 PORTDbits.RD7 //pin 30 not in use TRISDbits.TRISD7 = 0; //31 = - //32 = + #define in24V_in_8 PORTBbits.RB0 //pin 33 TRISBbits.TRISB0 = 1; #define in24V_in_7 PORTBbits.RB1 //pin 34 TRISBbits.TRISB1 = 1; #define in24V_in_6 PORTBbits.RB2 //pin 35 TRISBbits.TRISB2 = 1; #define in24V_in_5 PORTBbits.RB3 //pin 36 TRISBbits.TRISB3 = 1; #define in230V_in_4 PORTBbits.RB4 //pin 37 TRISBbits.TRISB4 = 1; #define in230V_in_3 PORTBbits.RB5 //pin 38 TRISBbits.TRISB5 = 1; #define in230V_in_2 PORTBbits.RB6 //pin 39 TRISBbits.TRISB6 = 1; #define in230V_in_1 PORTBbits.RB7 //pin 40 TRISBbits.TRISB7 = 1; } void controlPins()//normales durchrouten { if(in230V_in_1 == 1)//Test bestanden { out_1_out = 1; } else { out_1_out = 0; }//---------------------------------- if(in230V_in_2 == 1)//Test bestanden { out_2_out = 1; } else { out_2_out = 0; }//---------------------------------- if(in230V_in_3 == 1) { out_3_out = 1; } else { out_3_out = 0; }//---------------------------------- if(in230V_in_4 == 1) { out_4_out = 1; } else { out_4_out = 0; }//---------------------------------- //####################################### if(in24V_in_5 == 1) { out_1_out = 1; } else { out_1_out = 0; }//---------------------------------- if(in24V_in_6 == 1) { out_2_out = 1; } else { out_2_out = 0; }//---------------------------------- if(in24V_in_7 == 1) { out_3_out = 1; } else { out_3_out = 0; }//---------------------------------- if(in24V_in_8 == 1) { out_4_out = 1; } else { out_4_out = 0; }//---------------------------------- (okPin == 1) ? ledErr = 1 : ledErr = 0;//Test bestanden } int main(int argc, char** argv) { setPins(); while(1) { INTF = 0;// Clear Interrupt Flag INTE = 0;// Enable external interrupt GIE = 0;// Enable Global Interrupt controlPins(); } return (0); }
Sollte das so funktionieren? #pragma config1 |= 0b.1001.0000.1101.0100 //Seite 210/212
Watchdog steht falsch. Warum schreibste nicht direkt TRISB = 255. Anstatt die alle einzeln auf zu führen. ?
Andreas Fri schrieb: > #pragma ANSEL |= 0b.0000.0000 //ANS7 - 0 Seite 39 //1 = Analog input, 0 > = Digital I/O > #pragma ANSELH |= 0b.--00.0000 //ANS13 - 8 Seite 39 > #pragma PIE1 |= 0b.0000.0000 //PERIPHERAL INTERRUPT Das sind SFRs, die Du im main() setzen musst, keine #pragmas. fchk
Du musst mittels hvp LVP ausschalten und ruecklesen ob es ausgeschälten ist. Ansonsten nochmal schlau machen wie hvp geht.
Danke für eure Komentare und Hinweise ihr wart mir eine Große Hilfe. Die Lösung: vor ANSEL und ANSELH darf kein #pragma stehen sondern ANSEL = 0; ANSELH = 0; #pragma wird nur für die CONFIG1 & 2 benötigt. lg Andreas
Ein kleines Problem bleibt leider noch über. Am RB3(pin36) bekomme ich kein high signal. Widerastand ist vorhanden. Ich glaube, dass bei der Konfiguration ein Fehler vorhanden ist, aber wo? lg Andreas
meine derzeitige Config #pragma config1 |= 0b.1100.0000.0000.0100 //Seite 212 in der main: ANSEL = 0;//Analogeingänge abschalten ANSELH = 0;//Analogeingänge abschalten C1ON = 0;//comparator C1 abschalten PIN36 C2ON = 0;//comparator C2 abschalten PIN36 INTF = 0;// Clear Interrupt Flag INTE = 0;// Enable external interrupt GIE = 0;// Enable Global Interrupt PIE1 = 0;//Timer1 interupt
Konfiguration?
> #pragma config1 |= 0b.1001.0000.1101.0100
Kann der Compiler keine Symbolischen Namen für die Einzelnen Config-Bits
auflösen - aus der 0/1-Wurst kann man nichts rauslesen.
Na egal.
RB3 ist auch ein Comperatoreingang. Weiss jetzt nicht ob der mit
ANSEL/ANSELH auch deaktiviert wird, aber schalte die Comperatoren
sicheheitshalber aus mit:
CM1CON0 = 0;
CM2CON0 = 0;
(dass hat sich jetzt überschnitten - also hinfällig)....
Hilft leider nicht. Ich schlte meine 4 Ausgänge ein, jedoch beim drücken des RB3 sind alle aus. meine Config: #pragma config1 |= 0b.1100.0000.0000.0100 //Seite 212 #pragma config2 |= 0b.1111.1110.1111.1111 //Seite 213 ANSEL = 0;//Analogeingänge abschalten ANSELH = 0;//Analogeingänge abschalten C1ON = 0;//comparator C1 abschalten PIN36 C2ON = 0;//comparator C2 abschalten PIN36 INTF = 0;// Clear Interrupt Flag INTE = 0;// Enable external interrupt GIE = 0;// Enable Global Interrupt PIE1 = 0;//Timer1 interupt CM1CON0 = 0; CM2CON0 = 0;
Siehe Datenblatt DS30292C Kapitel 12 "SPECIAL FEATURES OF THE CPU" und dort "REGISTER 12-1: CONFIGURATION WORD (ADDRESS 2007h)" auf Seite 120. Dieser PIC hat nur ein Config Word. Was Du mit Deinen beiden #pragmas konfiguriert hast, ist nicht ersichtlich. RB3 hat PGM als zweite Funktion, welches den Prozessor in den Low Voltage Programming Mode schaltet. Mit Bit 7 im Config Word schaltest Du das ab. Überprüfe nochmal Dein Config Word. Dein Code passt irgendwie nicht zum Chip. fchk
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.