dsPIC30F2011: Probleme mit Timer(Interrupt-Flag und Interrupt)
Mittwoch, 23. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  Programmiersprache C  |  dsPIC30F2011: Probleme mit Timer(Interrupt-Flag und Interrupt) « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: dsPIC30F2011: Probleme mit Timer(Interrupt-Flag und Interrupt)  (Gelesen 369 mal)
 
Schoasch
Sr. Member
****
Offline Offline

Beiträge: 343



Profil anzeigen
« am: Juli 24, 2010, 21:16:43 »

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:

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?
Zitat
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.
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.039 Sekunden mit 18 Zugriffen.
 
Top! Top!