Forum: Mikrocontroller und Digitale Elektronik PIC16F1783 - Problem mit Delayfunktion


von Michael F. (osiris2442)


Lesenswert?

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

von Route_66 (Gast)


Lesenswert?

Michael Fraller schrieb:
> goto $+2

Geht dieser Sprung nicht in die falsche Richtung?

von Michael F. (osiris2442)


Lesenswert?

1
decfsz d1,1
2
goto $+2
3
decfsz d2,1
4
goto $-3

naja er springt dann zu
1
goto $-3

und anschliessend ist er wieder am Anfang.
Dieser Sprung dient nur dazu dass man die Anzahl der Zyklen
einfacher abschätzen kann.

Hab den ASM Code eig von einem Code-Generator für Delay-Routinen.

http://www.piclist.com/techref/piclist/codegen/delay.htm

von Teo D. (teoderix)


Lesenswert?

Michael Fraller schrieb:
> __asm
>
>     cblock
>     d1
>     d2
>     endc

Funst das überhaupt bei inline assembler Code?

von Michael F. (osiris2442)


Lesenswert?

hm, hatte bis jetzt eig keine Probleme damit...

Habe jedoch als Versuch die 2 Programme in ASM geschrieben und
mit MPLAB compiliert und kam zum gleichen Ergebnis.

Aber vielen Dank für deine Antwort ;)

mfg

Edit:
Könnte vl jemand der ebenfals den uC-Typ programmiert
das Programm compilieren/testen und das HEX-File vl uploadn?
Könnte nämlich sein das beim Brennen was schief geht.
Wäre echt dankbar.

von Teo (Gast)


Lesenswert?

Michael Fraller schrieb:
> Habe jedoch als Versuch die 2 Programme in ASM geschrieben und
> mit MPLAB compiliert und kam zum gleichen Ergebnis.

Jo, ich frag mich nur ob der C-compiler die Speicherbelegung auch 
wirklich sieht?!

Michael Fraller schrieb:
> goto $+2

Auch wenn ich da keinen Fehler sehe, mach mal Labels. Is zumindest 
leserlicher und wer weiß :)

von Michael F. (osiris2442)


Lesenswert?

Problem gelöst!

Es ist wie Teo anfangs vermutet hat, dass cblock Probleme macht.
cblock funktioniert anscheinend weder in C noch in ASM.
Hab nun die Variablen anders deklariert und es gab keine Probleme.

Vielen Dank für eure Hilfe, ganz besonders Teo :)

mfg

von Teo (Gast)


Lesenswert?

In ASM sollte es aber eigentlich keine Probleme machen?!


    cblock 0x20

was ich noch übersehen hatte, alles vorher is reserviert! (Datenblatt! 
kenn Deinen Typ nich wirklich)

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.