Hallo, ich habe eine Nullpunkterkennung die am PORTB7 angeschlossen ist. Demnach möchte ich ein Interrupt bei Veränderung des Pegels an RB7 auslösen. Hierzu gibt es ja die interrupt on change Funktion. Die Software die ich geschrieben habe soll nun von einem PIC18F232 auch auf einen PIC16F877 laufen. Auf dem PIC18 lief dieser Code: #define dNULLPUNKT PORTBbits.RB7 void interrupt ISR() { if(RBIF && !dNULLPUNKT) { ... RBIF = 0; } if(RBIF && dNULLPUNKT) { ... RBIF = 0; } } Beim PIC16F877 läuft diese nun nicht mehr. Die Frage: Warum? Kann mir da jemand einen Hinweiß geben? LG Luke
Initialisierung der Register? Allenfalls aendert der Adressiermode, wenn das Register ausserhalb des Bereiches liegt.
Hi, ich hab hier mal die Initialisierung ausgeschnitten, vielleicht sieht man ob was fehlt.
1 | Init(void) |
2 | {
|
3 | /*ANALOG*DIGITAL*WANDLER*******************************************************/
|
4 | |
5 | //ADCON1
|
6 | ADFM = 0; //A/D Result Format |
7 | PCFG3 = 0; //AD Port |
8 | PCFG2 = 1; //Configuration |
9 | PCFG1 = 1; //Bits |
10 | PCFG0 = 1; //alle digital |
11 | |
12 | /*INTERUPT*********************************************************************/
|
13 | |
14 | //INTCON
|
15 | GIE = 1; //Global Interrupts |
16 | PEIE = 1; //Peripheral Interrupts |
17 | T0IE = 1; //Timer0 Interrupt Enable |
18 | INTE = 0; //External Interrupt on RB0/INT0 Enable |
19 | RBIE = 1; //RBPort Interrupt Enable |
20 | T0IF = 0; //Timer0 Interrupt FLAG |
21 | INTF = 0; //External Interrupt FLAG RB0/INT0 |
22 | RBIF = 0; //RBPort Interrupt FLAG |
23 | |
24 | //Option Register
|
25 | INTEDG = 0; //Interrupt Edge Select |
26 | |
27 | //PIRx, PIEx, IPRx
|
28 | ADIF = 0; //AD Converter Interrupt Flag |
29 | ADIE = 0; //AD Converter Interrupt Enable |
30 | |
31 | RCIF = 0; //USART Receive Interrupt Flag |
32 | RCIE = 0; //USART Receive Interrupt Enable |
33 | |
34 | TXIF = 0; //USART Transmit Interrupt Flag |
35 | TXIE = 0; //USART Transmit Interrupt Enable |
36 | |
37 | SSPIF = 0; //MSSP Interrupt Flag |
38 | SSPIE = 0; //TEST //MSSP Interrupt Enable |
39 | |
40 | CCP1IF = 0; //CCP1 Interrupt Flag |
41 | CCP1IE = 0; //CCP1 Interrupt Enable |
42 | |
43 | TMR2IF = 0; //TMR2 to PR2 Match Interrupt Flag |
44 | TMR2IE = 0; //TMR2 to PR2 Match Interrupt Enable |
45 | |
46 | TMR1IF = 0; //TMR1 Overflow Interrupt Flag |
47 | TMR1IE = 0; //TMR1 Overflow Interrupt Enable |
48 | |
49 | EEIF = 0; //EEPROM Flash Write Interrupt Flag |
50 | EEIE = 0; //EEPROM Flash Write Interrupt Enable |
51 | |
52 | BCLIF = 0; //Bus Collision Interrupt Flag |
53 | BCLIE = 0; //Bus Collision Interrupt Enable |
54 | |
55 | CCP2IF = 0; //CCPx Interrupt Flag |
56 | CCP2IE = 0; //CCPx Interrupt Enable |
57 | |
58 | //T0CON Timer0
|
59 | T0CS = 0; //Timer0 Clock Source Select bit |
60 | T0SE = 0; //Source Edge Select bit |
61 | PSA = 0; //Timer Clock Source from Prescaler |
62 | PS2 = 1; //--Prescaler |
63 | PS1 = 0; //--divide by |
64 | PS0 = 0; //--32 |
65 | |
66 | /*INPUTS*//*OUTPUTS************************************************************/
|
67 | |
68 | TRISA0 = 1; //TH1 In |
69 | TRISA1 = 1; //TH3 In |
70 | TRISA2 = 1; //SDA |
71 | TRISA3 = 1; //SCL |
72 | TRISA4 = 1; //Comkeys A |
73 | TRISA5 = 1; //Comkeys B |
74 | |
75 | TRISB0 = 0; //Relais 3 |
76 | TRISB1 = 0; //Relais 2 |
77 | TRISB2 = 0; //Relais 1 |
78 | TRISB3 = 0; //Triac V5 |
79 | TRISB4 = 0; //Triac V4 |
80 | TRISB5 = 0; //Triac V3 |
81 | TRISB6 = 1; //Sensor Signal Input |
82 | TRISB7 = 1; //Nullpunkterkennung |
83 | |
84 | TRISC0 = 0; //Keys Mux 3 |
85 | TRISC1 = 0; //Keys Mux 4 |
86 | TRISC2 = 0; //Betriebsanzeige (LED) |
87 | TRISC3 = 1; //SCL |
88 | TRISC4 = 1; //SDA |
89 | TRISC5 = 0; //PIC16F627 PORT RB3 |
90 | TRISC6 = 0; //TX |
91 | TRISC7 = 1; //RX |
92 | |
93 | TRISD0 = 0; //na |
94 | TRISD1 = 0; //na |
95 | TRISD2 = 0; //na |
96 | TRISD3 = 0; //na |
97 | TRISD4 = 0; //PIC16F627 PORT RA2 |
98 | TRISD5 = 0; //PIC16F627 PORT RA4 |
99 | TRISD6 = 0; //Relais 5 |
100 | TRISD7 = 0; //Relais 4 |
101 | |
102 | TRISE0 = 1; //Comkeys C |
103 | TRISE1 = 0; //Keys Mux 1 |
104 | TRISE2 = 0; //Keys Mux 2 |
Keine Ahnung was an RB7 genau dran hängt, aber eventuell sind bei der PIC18 Version die PullUp beim PORTB eingeschaltet und bei der PIC16 Version nicht? (weiss nicht was Defaulteinstellung ist und ob bei beiden Controllern gleich).
Beim PIC18F232 kann man die Pull-ups deaktivieren in dem man RBPU = 1 setzt. Beim PIC16 gibts das RBPU im Option_Reg Register aber wenn ich beim PIC16 in der Init RBPU = 1 setze bekomme ich beim kompilieren eine Fehlermeldung: error: undefined identifier "RBPU"
Dann ist es das nicht. Nachgesehen - bei beiden Controllern sind die PullUp per Default OFF.
Hier die PIC18 Initialisierung
1 | Init(void) |
2 | {
|
3 | //OSCCON
|
4 | IDLEN = 0; //Idle enable bit |
5 | IRCF2 = 1; //Internal Oscillator Frequency |
6 | IRCF1 = 1; //8 MHz |
7 | IRCF0 = 1; // |
8 | OSTS = 0; // |
9 | IOFS = 0; // |
10 | SCS1 = 1; //System Clock Select bits |
11 | SCS0 = 0; // |
12 | /*ANALOG*DIGITAL*WANDLER*******************************************************/
|
13 | |
14 | //ADCON1
|
15 | VCFG1 = 0; //Voltage Reference VREFL |
16 | VCFG0 = 0; //Voltage Reference VREFH |
17 | PCFG3 = 1; //AD Port |
18 | PCFG2 = 1; //Configuration |
19 | PCFG1 = 1; //Bits |
20 | PCFG0 = 1; //alle digital |
21 | |
22 | /*INTERUPT*********************************************************************/
|
23 | |
24 | //INTCON
|
25 | GIE = 1; //Global Interrupts |
26 | PEIE = 1; //Peripheral Interrupts |
27 | TMR0IE = 1; //Timer0 Interrupt Enable |
28 | INT0IE = 0; //External Interrupt on RB0/INT0 Enable |
29 | RBIE = 1; //RBPort Interrupt Enable |
30 | TMR0IF = 0; //Timer0 Interrupt FLAG |
31 | INT0IF = 0; //External Interrupt FLAG RB0/INT0 |
32 | RBIF = 0; //RBPort Interrupt FLAG |
33 | |
34 | //INTCON2
|
35 | RBPU = 1; //PORTB Pull-Up disable |
36 | INTEDG0 = 0; //ext Interrupt0 Edge Select |
37 | INTEDG1 = 0; //ext Interrupt1 Edge Select |
38 | INTEDG2 = 0; //ext Interrupt2 Edge Select |
39 | TMR0IP = 0; //Timer0 Overflow Interrupt Priority |
40 | RBIP = 1; //PB Port Change Interrupt Priority |
41 | |
42 | //INTCON3
|
43 | INT2IP = 0; //ext Interrupt 2 Priority |
44 | INT1IP = 0; //ext Interrupt 1 Priority |
45 | INT2IE = 0; //ext Interrupt 2 enable bit |
46 | INT1IE = 0; //ext Interrupt 1 enable bit |
47 | INT2IF = 0; //ext Interrupt 2 flag |
48 | INT1IF = 0; //ext Interrupt 1 flag |
49 | |
50 | //RCON
|
51 | IPEN = 1; //Interrupt Priority Enable bit |
52 | |
53 | //PIRx, PIEx, IPRx
|
54 | ADIF = 0; //AD Converter Interrupt Flag |
55 | ADIE = 0; //AD Converter Interrupt Enable |
56 | ADIP = 0; //AD Converter Interrupt Priority |
57 | |
58 | RCIF = 0; //USART Receive Interrupt Flag |
59 | RCIE = 0; //USART Receive Interrupt Enable |
60 | RCIP = 0; //USART Receive Interrupt Priority |
61 | |
62 | TXIF = 0; //USART Transmit Interrupt Flag |
63 | TXIE = 0; //USART Transmit Interrupt Enable |
64 | TXIP = 0; //USART Transmit Interrupt Priority |
65 | |
66 | SSPIF = 0; //MSSP Interrupt Flag |
67 | SSPIE = 0; //MSSP Interrupt Enable |
68 | SSPIP = 0; //MSSP Interrupt Priority |
69 | |
70 | CCP1IF = 0; //CCP1 Interrupt Flag |
71 | CCP1IE = 0; //CCP1 Interrupt Enable |
72 | CCP1IP = 0; //CCP1 Interrupt Priority |
73 | |
74 | TMR2IF = 0; //TMR2 to PR2 Match Interrupt Flag |
75 | TMR2IE = 0; //TMR2 to PR2 Match Interrupt Enable |
76 | TMR2IP = 0; //TMR2 to PR2 Match Interrupt Priority |
77 | |
78 | TMR1IF = 0; //TMR1 Overflow Interrupt Flag |
79 | TMR1IE = 0; //TMR1 Overflow Interrupt Enable |
80 | TMR1IP = 0; //TMR1 Overflow Interrupt Priority |
81 | |
82 | OSCFIF = 0; //Osc Fail Interrupt Flag |
83 | OSCFIE = 0; //Osc Fail Interrupt Enable |
84 | OSCFIP = 0; //Osc Fail Interrupt Priority |
85 | |
86 | CMIF = 0; //Comparator Interrupt Flag |
87 | CMIE = 0; //Comparator Interrupt Enable |
88 | CMIP = 0; //Comparator Interrupt Priority |
89 | |
90 | EEIF = 0; //EEPROM Flash Write Interrupt Flag |
91 | EEIE = 0; //EEPROM Flash Write Interrupt Enable |
92 | EEIP = 0; //EEPROM Flash Write Interrupt Priority |
93 | |
94 | BCLIF = 0; //Bus Collision Interrupt Flag |
95 | BCLIE = 0; //Bus Collision Interrupt Enable |
96 | BCLIP = 0; //Bus Collision Interrupt Priority |
97 | |
98 | LVDIF = 0; //Low Voltage Interrupt Flag |
99 | LVDIE = 0; //Low Voltage Interrupt Enable |
100 | LVDIP = 0; //Low Voltage Interrupt Priority |
101 | |
102 | TMR3IF = 0; //TMR3 Overflow Interrupt Flag |
103 | TMR3IE = 0; //TMR3 Overflow Interrupt Enable |
104 | TMR3IP = 0; //TMR3 Overflow Interrupt Priority |
105 | |
106 | CCP2IF = 0; //CCPx Interrupt Flag |
107 | CCP2IE = 0; //CCPx Interrupt Enable |
108 | CCP2IP = 0; //CCPx Interrupt Priority |
109 | |
110 | //T0CON Timer0
|
111 | TMR0ON = 1; //Timer start |
112 | T08BIT = 1; //8 BIT MODE |
113 | T0CS = 0; //Timer0 Clock Source Select bit |
114 | T0SE = 0; //Source Edge Select bit |
115 | PSA = 0; //Timer Clock Source from Prescaler |
116 | T0PS0 = 1; //--Prescaler |
117 | T0PS1 = 0; //--divide by |
118 | T0PS2 = 0; //-- 32 |
119 | |
120 | /*INPUTS*//*OUTPUTS************************************************************/
|
121 | |
122 | TRISB7 = 1; //Nullpunkterkennung |
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.