Forum: Mikrocontroller und Digitale Elektronik Interrupt On Change


von Lukas D. (lukas_d)


Lesenswert?

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

von Purzel H. (hacky)


Lesenswert?

Initialisierung der Register? Allenfalls aendert der Adressiermode, wenn 
das Register ausserhalb des Bereiches liegt.

von Lukas D. (lukas_d)


Lesenswert?

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

von Chris B. (dekatz)


Lesenswert?

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).

von Lukas D. (lukas_d)


Lesenswert?

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"

von Chris B. (dekatz)


Lesenswert?

Dann ist es das nicht. Nachgesehen - bei beiden Controllern sind die 
PullUp per Default OFF.

von Lukas D. (lukas_d)


Lesenswert?

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

von Lukas D. (Gast)


Lesenswert?

Hab den Fehler. Programmiergerät hat defekt. Läuft alles.

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.