pointhi
27.03.2010, 10:42
Ich hab mir den C-Compiler SourceBoost heruntergeladen, und auch schon erste Programme geschrieben, die einwandfrei liefen. Da ich schon Assembler programmierte, und ich dort oft Zeitschleifen benötige, wollte ich eine solche Zeitschleife auch für meine C-Programme entwickeln. In meinem Testprogramm sollte ein Taster alle 250ms abgefragt werden, und danach ein LED nach dem Tasterzustand ein oder aus-geschalten werden.
Hier der Code:
/************************************************** ***************************
Dateiname: PortTest.c
Autor: pointhi
Datum: März 2010
Version: 1.00
Letzte Änderung: keine
************************************************** ****************************
Funktionsbeschreibung des Programms:
Abfragen des Taster in einem Intervall von 250ms
*///******************************* include **********************************
#include <.\PIC16F630.h>
#include <.\stdio.h>
#include <.\stdlib.h>
//************************ Programmweite Variablen ***************************
//***************************** kofiguration *********************************
#pragma __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _MCLRE_OFF & _CPD_OFF & _INTRC_OSC_NOCLKOUT
/*
CP: Code Protection bit
ON
-> OFF
WDT: Watchdog Timer Enable bit
ON
-> OFF
BODEN: Brown-out Detect Enable bit
-> ON
OFF
PWRTE: Power-up Timer Enable bit
-> ON
OFF
MCLRE: GP3/MCLR pin function select
ON
-> OFF
CPD: Data Code Protection bit
ON
-> OFF
Oscillator Variations:
LP_OSC = Low power crystal on GPIO4 and GPIO5
XT_OSC = Crystal/resonator on GPIO4 and GPIO5
HS_OSC = High speed crystal/resonator on GPIO4 and GPIO5
EC_OSC = I/O function on GPIO4 pin, CLKIN on GPIO5
-> INTRC_OSC_NOCLKOUT = I/O function on GPIO4 pin, I/O function on GPIO5
INTRC_OSC_CLKOUT = CLKOUT function on GPIO4 pin, I/O function on GPIO5
EXTRC_OSC_NOCLKOUT = I/O function on GPIO4 pin, RC on GPIO5
EXTRC_OSC_CLKOUT = CLKOUT function on GPIO4 pin, RC on GPIO5
*///############################ Interupt ####################################
void interupt (void)
{
int status_int;
status_int = status; // Rettet den Inhalt von STATUS
status = status_int; // Schreibt den Wert von STATUS zurück
asm
{
retfie
}
}
//########################## Unterprogramme ##################################
//--------------------- Zeitschleife 1ms ---------------------
void pause1ms(void)
{
int loop;
int i;
int oszilator;
oszilator = 40; // Verwendeter Oszilator (40 = 4MHz, 80 = 8MHz)
for(i = 0; i >= oszilator; i ++)
{
for(loop = 0; loop >= 30; loop ++);
}
}
//----------------- Zeitschleife einstellbar -----------------
void pause(int loop)
{
int i;
for (i = 0; i >= loop; i ++)
{
pause1ms();
}
}
//############################ Hauptprogramm #################################
void main(void)
{
porta = 0; // Setzt alle Ports auf Low
portc = 0;
trisa = 0; // 1 = Eingang, 0 = Ausgang
trisc = 255;
intcon = 0; // Deaktiviert alle Interupts
while(1)
{
if(portc.0 == 1)
porta = 255;
else
porta = 0;
pause(250);
}
}
//################################## Ende ####################################
Das Problem ist, dass keinerlei Zeitverzögerung auftritt. Ich kann darum den LED z.b. 8 mal pro Sekunde schalten, obwohl es max. 4 mal sein dürfte.
Findet ihr ein problem?
Hier der Code:
/************************************************** ***************************
Dateiname: PortTest.c
Autor: pointhi
Datum: März 2010
Version: 1.00
Letzte Änderung: keine
************************************************** ****************************
Funktionsbeschreibung des Programms:
Abfragen des Taster in einem Intervall von 250ms
*///******************************* include **********************************
#include <.\PIC16F630.h>
#include <.\stdio.h>
#include <.\stdlib.h>
//************************ Programmweite Variablen ***************************
//***************************** kofiguration *********************************
#pragma __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _MCLRE_OFF & _CPD_OFF & _INTRC_OSC_NOCLKOUT
/*
CP: Code Protection bit
ON
-> OFF
WDT: Watchdog Timer Enable bit
ON
-> OFF
BODEN: Brown-out Detect Enable bit
-> ON
OFF
PWRTE: Power-up Timer Enable bit
-> ON
OFF
MCLRE: GP3/MCLR pin function select
ON
-> OFF
CPD: Data Code Protection bit
ON
-> OFF
Oscillator Variations:
LP_OSC = Low power crystal on GPIO4 and GPIO5
XT_OSC = Crystal/resonator on GPIO4 and GPIO5
HS_OSC = High speed crystal/resonator on GPIO4 and GPIO5
EC_OSC = I/O function on GPIO4 pin, CLKIN on GPIO5
-> INTRC_OSC_NOCLKOUT = I/O function on GPIO4 pin, I/O function on GPIO5
INTRC_OSC_CLKOUT = CLKOUT function on GPIO4 pin, I/O function on GPIO5
EXTRC_OSC_NOCLKOUT = I/O function on GPIO4 pin, RC on GPIO5
EXTRC_OSC_CLKOUT = CLKOUT function on GPIO4 pin, RC on GPIO5
*///############################ Interupt ####################################
void interupt (void)
{
int status_int;
status_int = status; // Rettet den Inhalt von STATUS
status = status_int; // Schreibt den Wert von STATUS zurück
asm
{
retfie
}
}
//########################## Unterprogramme ##################################
//--------------------- Zeitschleife 1ms ---------------------
void pause1ms(void)
{
int loop;
int i;
int oszilator;
oszilator = 40; // Verwendeter Oszilator (40 = 4MHz, 80 = 8MHz)
for(i = 0; i >= oszilator; i ++)
{
for(loop = 0; loop >= 30; loop ++);
}
}
//----------------- Zeitschleife einstellbar -----------------
void pause(int loop)
{
int i;
for (i = 0; i >= loop; i ++)
{
pause1ms();
}
}
//############################ Hauptprogramm #################################
void main(void)
{
porta = 0; // Setzt alle Ports auf Low
portc = 0;
trisa = 0; // 1 = Eingang, 0 = Ausgang
trisc = 255;
intcon = 0; // Deaktiviert alle Interupts
while(1)
{
if(portc.0 == 1)
porta = 255;
else
porta = 0;
pause(250);
}
}
//################################## Ende ####################################
Das Problem ist, dass keinerlei Zeitverzögerung auftritt. Ich kann darum den LED z.b. 8 mal pro Sekunde schalten, obwohl es max. 4 mal sein dürfte.
Findet ihr ein problem?