main ()
while (1)
{
task 1 takes some m sec
.
.
task 2 takes some m sec
.
.
delay until next second
}
char flagRegister = 0;
unsigned long tasks_delay = 0;
sbit endOldtaskCycleFlag at flagRegister.B0;
//Timer1
//Prescaler 1:1; Actual Interrupt Time : 5 ms
//Fosc = 4 MHz
void InitTimer1() {
T1CON = 0x00;
TMR1IF_bit = 0;
TMR1H = 0xFC;
TMR1L = 0x18;
TMR1IE_bit = 1;
INTCON |= 0xC0;
}
void interrupt() {
if((TMR1IE_bit) && (TMR1IF_bit)) {
TMR1IF_bit = 0;
TMR1H = 0xFC;
TMR1L = 0x18;
//Enter your code here
if(endOldtaskCycleFlag == 0)
tasks_delay++;
if(endOldtaskCycleFlag == 1)
tasks_delay--;
}
}
void main() {
InitTimer1();
while(1) {
while(tasks_delay != 0); //Wait here till old task completes
endOldtaskCycleFlag = 0; //Old taks completed
//New task cycle
TMR1ON_bit = 1; //Enable Timer1
Delay_ms(400); //Task1
Delay_ms(450); //Task2 (Final task)
TMR1ON_bit = 0; //Stop Timer1
if(tasks_delay <= 1000) { //Tasks will never take more than 1000 ms
tasks_delay -= 1000;
endOldtaskCycleFlag = 1;
TMR1ON_bit = 1;
}
}
}
char flagRegister = 0;
unsigned long tasks_delay = 0;
sbit endOldtaskCycleFlag at flagRegister.B0;
//Timer1
//Prescaler 1:1; TMR1 Preload = 64536; Actual Interrupt Time : 1 ms
//Fosc = 4 MHz
void InitTimer1() {
T1CON = 0x00;
TMR1IF_bit = 0;
TMR1H = 0xFC;
TMR1L = 0x18;
TMR1IE_bit = 1;
INTCON = 0xC0;
}
void interrupt() {
if((TMR1IE_bit) && (TMR1IF_bit)) {
TMR1IF_bit = 0;
TMR1H = 0xFC;
TMR1L = 0x18;
//Enter your code here
if(endOldtaskCycleFlag == 0)
tasks_delay++;
if(endOldtaskCycleFlag == 1)
tasks_delay--;
}
}
void main() {
TRISD = 0;
PORTD = 0;
LATD = 0;
InitTimer1();
while(1) {
while(tasks_delay != 0); //Wait here till old task completes
endOldtaskCycleFlag = 0; //Old taks completed
//New task cycle
TMR1ON_bit = 1; //Enable Timer1
Delay_ms(400); //Task1
Delay_ms(450); //Task2 (Final task)
TMR1ON_bit = 0; //Stop Timer1
if(tasks_delay <= 1000) { //Tasks will never take more than 1000 ms
tasks_delay = 1000 - tasks_delay;
LATD = tasks_delay;
endOldtaskCycleFlag = 1;
TMR1ON_bit = 1;
}
}
}
char flagRegister = 0;
unsigned long tasks_delay = 0;
sbit endOldtaskCycleFlag at flagRegister.B0;
//Timer1
//Prescaler 1:1; TMR1 Preload = 64536; Actual Interrupt Time : 1 ms
//Fosc = 4 MHz
void InitTimer1() {
T1CON = 0x00;
TMR1IF_bit = 0;
TMR1H = 0xEC;
TMR1L = 0x78;
TMR1IE_bit = 1;
INTCON = 0xC0;
}
void interrupt() {
if((TMR1IE_bit) && (TMR1IF_bit)) {
TMR1IF_bit = 0;
TMR1H = 0xEC;
TMR1L = 0x78;
//Enter your code here
if(endOldtaskCycleFlag == 0)
tasks_delay = tasks_delay + 5;
if(endOldtaskCycleFlag == 1)
tasks_delay = tasks_delay - 5;
}
}
void main() {
TRISD = 0;
PORTD = 0;
LATD = 0;
InitTimer1();
while(1) {
while(tasks_delay != 0); //Wait here till old task completes
endOldtaskCycleFlag = 0; //Old tasks completed
//New task cycle
TMR1ON_bit = 1; //Enable Timer1
tasks_delay = 0;
Delay_ms(400); //Task1
Delay_ms(430); //Task2 (Final task)
if(tasks_delay <= 1000) { //Tasks will never take more than 1000 ms
tasks_delay = 1000 - tasks_delay;
LATD = tasks_delay;
endOldtaskCycleFlag = 1;
}
}
}
OSCCON = 0b01100010; // Internal oscillator @ 4 MHz, Internal RC is used for system clock.
if(tasks_delay <= 1000) { //Tasks will never take more than 1000 ms
tasks_delay = 1000 - tasks_delay + 10;
LATD = tasks_delay;
endOldtaskCycleFlag = 1;
}
char flagRegister = 0;
sbit endOldtaskCycleFlag at flagRegister.B0;
// CONFIG
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTIO1 oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
// End of configuration
#include <stdlib.h> //standard include files
#include <pic.h>
#include <htc.h>
#include <xc.h>
#include <stdio.h>
#include <string.h>
#define _XTAL_FREQ 4000000
int count = 0;
//Timer1
//Prescaler 1:1; TMR1 Preload = 64536; Actual Interrupt Time : 1 ms
//Place/Copy this part in declaration section
void InitTimer1(){
T1CON = 0x01;
PIR1bits.TMR1IF = 0;
TMR1H = 0xFC;
TMR1L = 0x18;
PIE1bits.TMR1IE = 1;
INTCON = 0xC0;
}
void interrupt ISR(){
if (PIR1bits.TMR1IF){
PIR1bits.TMR1IF = 0;
TMR1H = 0xFC;
TMR1L = 0x18;
//Enter your code here
count++;
}
}
void main(void) {
__delay_ms (1);
__delay_us (100);
OSCCON = 0b01100010; // Internal oscillator @ 4 MHz, Internal RC is used for system clock.
TRISB = 0; // Port B as output
InitTimer1(); // Initialize Timer 1
PORTB = 0x00; // Initialize Port B
ei(); // Enable Interrupt
while (1)
{
__delay_ms (400); // task 1
__delay_ms (400); // task 2
// Insert remaining delay until next second
__delay_ms (1000-count);
{
count = 0;
PORTBbits.RB0 = ~PORTBbits.RB0;
PORTBbits.RB1 = ~PORTBbits.RB1;
PORTBbits.RB2 = ~PORTBbits.RB2;
PORTBbits.RB3 = ~PORTBbits.RB3;
PORTBbits.RB4 = ~PORTBbits.RB4;
PORTBbits.RB5 = ~PORTBbits.RB5;
}
}
return;
}
__delay_ms (1000-count - 10);
__delay_ms (1000-count - 10);
I think you are grossly overestimating the error as well
TMRH = 0xfc;
TMRL = 0x18 + TMRL;
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?