Hallo,
Ich programmiere seit längerem PIC Mikrocontroller und seit kurzem auch
den Typ 16F1783.
Ich habe nun folgendes Problem.
Das Programm sollte nur ein Rechtecksignal an PortB ausgeben,
und dafür habe ich eine kleine Delayfunktion geschrieben:
1 | #include <pic14/pic16f1783.h>
|
2 |
|
3 | unsigned int __at (_CONFIG1) __CONFIG1 = _FOSC_INTOSC & _WDTE_OFF & _MCLRE_OFF & _CP_OFF & _CLKOUTEN_OFF;
|
4 | unsigned int __at (_CONFIG2) __CONFIG2 = _PLLEN_ON & _LVP_OFF;
|
5 |
|
6 | void delay(void)
|
7 | {
|
8 | __asm
|
9 |
|
10 | cblock
|
11 | d1
|
12 | d2
|
13 | endc
|
14 |
|
15 | //ca 8000 Zyklen:
|
16 | movlw 0x3F
|
17 | movwf d1
|
18 | movlw 0x07
|
19 | movwf d2
|
20 |
|
21 | decfsz d1,1
|
22 | goto $+2
|
23 | decfsz d2,1
|
24 | goto $-3
|
25 |
|
26 | __endasm;
|
27 | }
|
28 |
|
29 | void main(void)
|
30 | {
|
31 | OSCCON=0xF8; // INTOSC
|
32 |
|
33 | TRISB=0x00;
|
34 | LATB=0x00;
|
35 |
|
36 | while(1)
|
37 | {
|
38 | LATB=~LATB;
|
39 | delay();
|
40 | }
|
41 | }
|
Wenn ich das Programm jedoch in den PIC brenne, ist PORTB auf 0xFF und
es ändert sich nichts. Es scheint als würde das Programm in der
Delayfunktion hängen bleiben.
Wenn ich jedoch das Programm geringfügig ändere und die zweite Schleife
in ASM entferne:
1 | #include <pic14/pic16f1783.h>
|
2 |
|
3 | unsigned int __at (_CONFIG1) __CONFIG1 = _FOSC_INTOSC & _WDTE_OFF & _MCLRE_OFF & _CP_OFF & _CLKOUTEN_OFF;
|
4 | unsigned int __at (_CONFIG2) __CONFIG2 = _PLLEN_ON & _LVP_OFF;
|
5 |
|
6 | void delay(void)
|
7 | {
|
8 | __asm
|
9 |
|
10 | cblock
|
11 | d1
|
12 | d2
|
13 | endc
|
14 |
|
15 | movlw 0x3F
|
16 | movwf d1
|
17 | movlw 0x07
|
18 | movwf d2
|
19 |
|
20 | decfsz d1,1
|
21 | goto $-1
|
22 |
|
23 | __endasm;
|
24 | }
|
25 |
|
26 | void main(void)
|
27 | {
|
28 | OSCCON=0xF8; // INTOSC
|
29 |
|
30 | TRISB=0x00;
|
31 | LATB=0x00;
|
32 |
|
33 | while(1)
|
34 | {
|
35 | LATB=~LATB;
|
36 | delay();
|
37 | }
|
38 | }
|
funktioniert das Programm problemlos und es entsteht eine
Rechteckfrequenz an PORTB. (Weiters kann ich auch sicherstellen dass der
uC mit dem internen Oszillator von 32MHz läuft)
Ich weiss jedoch nicht wo der Fehler in der Delayfunktion liegt, da
dieselbe Funktion problemlos bei anderen Typen funktioniert.
Weiters habe ich das Programm an mehreren 16F1783 getestet, und
dasgleiche Ergebnis bekommen.
Hoffe ihr könnt mir helfen.
Zur Info:
Compiler: sdcc v3.2
Brennter: sprut Brenner8 v0.17
mfg