Hallo ich hab nen keleines Problem und es wäre super wenn mir jemand weiter helfen könnte:) , danke im vorsus für jede Hilfe ich verwende den PIC18F46K20. Der PIC soll einen Interrupt auslösen wenn ein Byte über die USART enpfangen wird. Das Problem ist dass der Interrupt in einer Endlosschleife ausgeführt wird trotz dass das Flagbit gelöscht wird.?? Das Byte sende ich vom PC aus. Die USART und die kommunikation mit dem PC funktioniert. Hat von euch jemand ne idee was ich falsch mache? hier der code
1 | #pragma config FOSC = INTIO67, FCMEN = OFF, IESO = OFF
|
2 | #pragma config PWRT = ON, BOREN = OFF, BORV = 18
|
3 | #pragma config WDTEN = OFF, WDTPS = 1
|
4 | #pragma config MCLRE = ON, HFOFST = OFF, LPT1OSC = OFF, PBADEN = OFF
|
5 | #pragma config CCP2MX = PORTBE, STVREN = OFF, LVP = OFF, XINST = OFF, DEBUG = OFF
|
6 | #pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF
|
7 | #pragma config CPB = OFF, CPD = OFF
|
8 | #pragma config EBTR0 = OFF
|
9 | #pragma config EBTR1 = OFF
|
10 | #pragma config EBTR2 = OFF
|
11 | #pragma config EBTR3 = OFF
|
12 | |
13 | #define USE_OR_MASKS
|
14 | |
15 | #include "p18f46K20.h" |
16 | #include "delays.h" |
17 | #include "usart.h" |
18 | |
19 | unsigned char i,j; |
20 | |
21 | #pragma code
|
22 | |
23 | void PORT_INIT(void); |
24 | void UART_CONFIG(void); |
25 | |
26 | void ISH(void); |
27 | void ISL(void); |
28 | void INT_UART_INIT(void); |
29 | |
30 | #pragma code IVH = 0x08 // Interrupt-Vektor fuer hohe Prioritaet (HP)
|
31 | void IVH(void) |
32 | {
|
33 | _asm // So werden Assembler-Befehle in C eingebettet |
34 | goto ISH // Interrupt Service Routine fuer HP |
35 | _endasm
|
36 | }
|
37 | |
38 | #pragma code IVL = 0x18 // Interrupt-Vektor fuer niedere (low) Prioritaet (LP)
|
39 | void IVL(void) |
40 | {
|
41 | _asm
|
42 | goto ISL // Interrupt Service Routine fuer LP |
43 | _endasm
|
44 | }
|
45 | |
46 | void main(void) |
47 | {
|
48 | PORT_INIT(); |
49 | UART_CONFIG(); |
50 | INT_UART_INIT(); |
51 | LATD=0x00; |
52 | Delay10KTCYx(100); |
53 | |
54 | while(1); |
55 | }
|
56 | |
57 | void PORT_INIT(void) |
58 | {
|
59 | OSCCONbits.IRCF2 = 1; |
60 | OSCCONbits.IRCF1 = 0; // 16MHz |
61 | OSCCONbits.IRCF0 = 1; |
62 | |
63 | TRISD=0x00; |
64 | }
|
65 | |
66 | void UART_CONFIG(void) |
67 | {
|
68 | unsigned char config = 0, baudconfig = 0; |
69 | unsigned int spbrg = 0; |
70 | |
71 | CloseUSART(); |
72 | |
73 | config = USART_TX_INT_OFF | USART_RX_INT_ON | USART_ASYNCH_MODE | USART_EIGHT_BIT | USART_CONT_RX | USART_BRGH_LOW; |
74 | spbrg =25; // 2400 Baud |
75 | OpenUSART(config, spbrg); |
76 | |
77 | baudconfig = BAUD_8_BIT_RATE | BAUD_AUTO_OFF; |
78 | baudUSART(baudconfig); |
79 | }
|
80 | |
81 | void INT_UART_INIT(void) |
82 | {
|
83 | PIE1bits.RCIE=1; // enable USART resieve interrupts |
84 | IPR1bits.RCIP=1; // high priority |
85 | |
86 | RCONbits.IPEN = 1; // Interrupt-Prioritaeten deaktiviert |
87 | INTCONbits.GIE = 1; // Interrupts global aktiviert |
88 | INTCONbits.PEIE = 1; // Periphere Interrupts aktiviert |
89 | }
|
90 | |
91 | #pragma interrupt ISH
|
92 | void ISH(void) |
93 | {
|
94 | LATD++; |
95 | PIR1bits.RCIF = 0; |
96 | }
|
97 | |
98 | #pragma interruptlow ISL
|
99 | void ISL(void) {} |