Guten Morgen! Ich habe hier ein Problem auf einem PIC mit dem Interrupt on Change am PortB. Ein Drehimpulsgeber ist wie am Bild angeschlossen. Wenn ich am Drehimpulsgeber drehe funktioniert mein Programm. Wenn ich aber auf den Drehimpulsgeber drücke dann Schaltet er zwischen 10 und 100 Hz um. Nur das er zusätzlich noch die frequenz (frequ) erhöht. Ich finde aber nicht heraus warum.
1 | #pragma interruptlow high_isr |
2 | void high_isr( void ) |
3 | { |
4 | char hdt[] = "100"; |
5 | char zen[] = " 10"; |
6 | |
7 | // Am Drehimpulsgeber wurde gedreht. |
8 | if( INTCONbits.RBIF && PORTBbits.RB5 ) // Interrupt on Change ist aufgetreten |
9 | { |
10 | if( PORTBbits.RB4 == PORTBbits.RB3 ) |
11 | { |
12 | frequ += add_frequ; |
13 | } |
14 | else |
15 | { |
16 | frequ -= add_frequ; |
17 | } |
18 | set_new_frequ(); |
19 | } |
20 | // Der Drehimpulsgeber wurde gedrückt |
21 | else if( INTCONbits.RBIF && !PORTBbits.RB5 ) // Interrupt on Change ist aufgetreten |
22 | { |
23 | if( stat == 0x00 ) |
24 | stat = 0x01; |
25 | else |
26 | stat = 0x00; |
27 | |
28 | if( add_frequ == 10 ) |
29 | { |
30 | add_frequ = 100; |
31 | SetDDRamAddr( 0x4C ); |
32 | while( BusyXLCD() ); |
33 | putsXLCD( hdt ); |
34 | while( BusyXLCD() ); |
35 | } |
36 | else if( add_frequ == 100 ) |
37 | { |
38 | add_frequ = 10; |
39 | SetDDRamAddr( 0x4C ); |
40 | while( BusyXLCD() ); |
41 | putsXLCD( zen ); |
42 | while( BusyXLCD() ); |
43 | } |
44 | |
45 | while( !PORTBbits.RB5 ); // Warten bis der Impulsgeber wieder los gelassen wird. |
46 | } |
47 | |
48 | INTCONbits.RBIF = 0; // Interruptflag löschen |
49 | return; |
50 | } |
Ich hoffe ihr seht da was. Wenn ich mehr vom Code braucht sagt es mir. BG Andreas