Guten Morgen, wie muss ich bei folgendem Chip mit Interrupts umgehen (typspezifische Befehle, ...)? - PIC18F45K22 Ich habe den Chip auf einem Entwicklungsboard Easy PIC v7. VIELEN DANK!
Hier gibts das Datasheet zum runterladen: http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en546239
Das klingt nach Kaffeesatz und Glaskugel! Welchen Interrupt willst Du benutzen (müssen einzeln für jede Periferie eingeschaltet werden) welche Programierspache, was soll die ISR tun etc. fragen über fragen... mfG Michael
Guten Abend, ich möchte folgendes Programm auf meinem Easy PIC v7 (PIC18F45K22) zum laufen bringen!? Das folgende Programm ist für den PIC18F4550 geschrieben.
1 | #include <p18f4550.h> |
2 | #include <portb.h> |
3 | #include <timers.h> |
4 | #include <delays.h> |
5 | |
6 | /* low voltage programming off*/
|
7 | #pragma config LVP = OFF
|
8 | /* wathdog timer off*/
|
9 | #pragma config WDT = OFF
|
10 | /* portb komplett digital */
|
11 | #pragma config PBADEN = OFF
|
12 | #pragma config DEBUG = ON
|
13 | |
14 | void isr_high(); |
15 | void isr_low(); |
16 | |
17 | #pragma code high_vector= 0x08
|
18 | void high_isr (void){ |
19 | _asm
|
20 | goto isr_high |
21 | _endasm
|
22 | }
|
23 | #pragma code
|
24 | |
25 | #pragma code low_vector= 0x18
|
26 | void low_isr (void){ |
27 | _asm
|
28 | goto isr_low |
29 | _endasm
|
30 | }
|
31 | #pragma code
|
32 | |
33 | #pragma interrupt isr_high
|
34 | void isr_high(){ |
35 | if(INTCONbits.INT0IF== 1){ |
36 | INTCONbits.INT0IF= 0; |
37 | PORTD= 0x0F; |
38 | Delay10KTCYx(255); |
39 | }
|
40 | }
|
41 | |
42 | #pragma interruptlow isr_low
|
43 | void isr_low(){ |
44 | static unsigned char counter= 0; |
45 | if(INTCONbits.TMR0IF== 1){ |
46 | INTCONbits.TMR0IF= 0; |
47 | if(counter %2) |
48 | PORTD= 0x30; |
49 | else{ |
50 | PORTD= 0xC0; |
51 | counter= 0; |
52 | }
|
53 | counter++; |
54 | }
|
55 | }
|
56 | |
57 | void main(){ |
58 | static unsigned char counter= 0; |
59 | TRISD= 0x00; |
60 | TRISC= 0x00; |
61 | TRISB= 0x01; |
62 | PORTD= 0x00; |
63 | PORTC= 0x01; |
64 | |
65 | RCONbits.IPEN= 1; /*enable low interrupts generally*/ |
66 | INTCON2bits.TMR0IP= 0; /*timer0 auf low int*/ |
67 | INTCONbits.PEIE = 1; // Enable Peripheral interrupt |
68 | INTCONbits.GIEL = 1; // Enble Global interrupt low |
69 | INTCONbits.GIEH = 1; // Enble Global interrupt high |
70 | |
71 | OpenTimer0(TIMER_INT_ON & T0_SOURCE_INT & T0_16BIT & T0_PS_1_128); |
72 | OpenRB0INT(PORTB_CHANGE_INT_ON & FALLING_EDGE_INT &PORTB_PULLUPS_OFF); |
73 | WriteTimer0(0); |
74 | |
75 | while(1){ |
76 | if(counter %2) |
77 | PORTC= 0xF0; |
78 | else{ |
79 | PORTC= 0x0F; |
80 | counter= 0; |
81 | }
|
82 | Delay10KTCYx(255); |
83 | counter++; |
84 | }
|
85 | }
|
So auf den ersten Block sollte es reichen, das Include zu ändern. Und dann sollte man über den Sinn von Delays in ISRs nachdenken...
Interrupt Service Routine. Und Delay sind da schon recht gewöhnungsbedürftig drin. mfG Michael
Geht der hier nicht in den DEBUG Modus ? #pragma config DEBUG = ON Nimm die ganzen #pragma raus und stell es im Compilerprogramm ein. PROJECT/EDIT PROJEKCT
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.