Hi,
Ich hoffe, Ihr könnt mir etwas weiter helfen.
Ich bastel gerade an einer kleiner Bewässerungsanlage für meine Balkonpflanzen. Dazu habe ich den dsPIC30F2011 gewählt. ( Ich weis, ziemlich übertrieben.... aber ich hab den noch herumliegen gehabt und wollte mal was mit einem dsPIC machen).
Betreiben tu ich den Chip mit dem internen RC-Oszillator.
Mein Programm sollte so aussehen, dass ich einen Timer laufen lassen und dieser mir den dsPIC alle 1s aus dem schalf holt und die sekunden hoch zählt. Vorerst soll einmal um 6Uhr früh und 6Uhr abend für 30sec gegossen werden.
Mein Problem momentan ist aber, dass der Timer nicht ordentlich läuft. Laut dem Simulator sollter er den PortB toggeln. Aber das tut er nicht. Meine Messungen zeigen, das er weder in die ISR rein geht noch auf das Interruptflag reagiert.... bzw das dieses gesetzt wird. Kann mir da bitte jemand sagen, wie ich den Timer ordentlich zum laufen bekomme?
Hier der Code:
#include <p30f2011.h>
#define Pumpe LATDbits.LATD0
#define CLK_PIN LATBbits.LATB5
int sekunden_counter,minuten_counter,stunden_counter;
char Pumpe_einschalten,Pumpen_einschaltdauer_counter;
// Set Fuses
_FOSC(CSW_FSCM_ON & LPRC & FRC_PLL4);
_FWDT(WDT_OFF); /* Turn off the Watch-Dog Timer. */
_FBORPOR(MCLR_EN & PWRT_OFF); /* Enable MCLR reset pin and turn off the power-up timers. */
_FGS(CODE_PROT_OFF); /* Disable Code Protection */
void _ISR _T1Interrupt(void)
{
LATB = 0;
LATB = 0xffff;
/* reset Timer 1 interrupt flag */
IFS0bits.T1IF = 0;
}
int main(void)
{
LATB = 0x0000;
TRISB = 0x0001;
LATC = 0x0000;
TRISC = 0x0000;
LATD = 0x0000;
TRISD = 0x0000;
//Timer initialisieren
T1CON = 0;
/* reset Timer 1 interrupt flag */
IFS0bits.T1IF = 0;
/* set Timer1 interrupt priority level to 4 */
IPC0bits.T1IP = 4;
/* enable Timer 1 interrupt */
IEC0bits.T1IE = 1;
/* set Timer 1 period register */
PR1 = 0x1c1d;
// Set Prescaler to 1:256
T1CONbits.TCKPS = 3;
// Continiue timer operation in Idle mode
T1CONbits.TSIDL = 0;
/* select internal timer clock */
T1CONbits.TCS = 0;
T1CONbits.TGATE = 0;
/* enable Timer 1 and start the count */
T1CONbits.TON = 1;
//Alle Variablen initialisieren:
Pumpen_einschaltdauer_counter = 0;
Pumpe_einschalten = 0;
sekunden_counter = 0;
minuten_counter = 0;
stunden_counter = 0;
//Pumpe ausschalten
Pumpe = 0;
while(1)
{
//Zum Debuggen
if (IFS0bits.T1IF)
{
LATB = 0;
LATB = 0xffff;
//CLK_PIN = !CLK_PIN;
IFS0bits.T1IF = 0;
}
}
while(1)
{
//Zum Debuggen
CLK_PIN = !CLK_PIN;
//Sekunden Erhöhen
if (sekunden_counter >= 60)
{
minuten_counter++;
sekunden_counter = 1;
//Einschaltdauer der Pumpe mitzählen
if (Pumpe_einschalten == 1)
{
Pumpen_einschaltdauer_counter ++;
}
}
//Minuten erhöhen
if (minuten_counter >= 60)
{
stunden_counter++;
minuten_counter = 1;
}
//Stunden erhöhen
if (stunden_counter >= 24)
{
stunden_counter = 1;
}
//Einschaltzeiten
//Um 00:01:01 soll die Pumpe starten
if ((stunden_counter == 0) & (minuten_counter == 2) & (sekunden_counter == 1))
{
Pumpe_einschalten = 1;
}
//Um 00:01:01 soll die Pumpe starten
if ((stunden_counter == 12) & (minuten_counter == 2) & (sekunden_counter == 1))
{
Pumpe_einschalten = 1;
}
// Ausschaltzeiten
//Um 00:01:01 soll die Pumpe starten
if ((stunden_counter == 0) & (minuten_counter == 2) & (sekunden_counter == 30))
{
Pumpe_einschalten = 0;
}
//Um 00:01:01 soll die Pumpe starten
if ((stunden_counter == 12) & (minuten_counter == 2) & (sekunden_counter == 30))
{
Pumpe_einschalten = 0;
}
//Damit die Pumpe maximal 2minuten eingeschalten ist
if (Pumpen_einschaltdauer_counter >= 2)
Pumpe_einschalten =0;
if (Pumpe_einschalten == 1)
{
Pumpe = 1;
}
else if(Pumpe_einschalten == 0)
{
Pumpe = 0;
Pumpen_einschaltdauer_counter = 0;
}
//Enter IDLE-Mode: Timer läuft weiter
Idle();
/* reset Timer 1 interrupt flag */
IFS0bits.T1IF = 0;
}
}
Besten Dank.
mfg
Schoasch
PS: Wieso schreibt er mir eigentlich folgende Fehlermeldung?
Bewaesserung.c: In function '_T1Interrupt':
Bewaesserung.c:15: warning: PSV model not specified for '_T1Interrupt';
assuming 'auto_psv' this may affect latency
Ich habs so hingeschrieben, wie es in der Header beschrieben ist.