Переменная cnt используетя для подсчета кол-ва переполнений регистра TMR0. То есть в данном случае каждые 10 мс переменная cnt увеличивается на 1. То есть если проверять условие ее равенства 100 - мы ждем 1 секунду.
Так вот в следующем коде в случае если эта переменная равна 300 я ее обнуляю.
Обнуляться она не хочет,бывает что обнуляется при первом отсчете до 300, далее просто забывает это сделать.
Проблема конечно решается нестрогим равенством, но это же погрешность.
Обнуляться она не хочет, обнуляется только один первый раз. Но при использоавнии второго кода все отлично срабатывает.
Код 1
CODE:
int Sensor1,Sensor2,Sensor3,Sensor4,Sensor5;
char Txt[6];
unsigned cnt;
void Read_Adc()
{
ADCON0=0b00000001;
delay_us(20);
ADCON0.GO=1;
while(ADCON0.GO);
Sensor1=(ADRESH*4)+(ADRESL/64);
ADCON0=0b00000101;
delay_us(20);
ADCON0.GO=1;
while(ADCON0.GO);
Sensor2=(ADRESH*4)+(ADRESL/64);
ADCON0=0b00001001;
delay_us(20);
ADCON0.GO=1;
while(ADCON0.GO);
Sensor3=(ADRESH*4)+(ADRESL/64);
ADCON0=0b00001101;
delay_us(20);
ADCON0.GO=1;
while(ADCON0.GO);
Sensor4=(ADRESH*4)+(ADRESL/64);
}
void Read_Adc1()
{
ADCON0=0b00010001;
delay_us(20);
ADCON0.GO=1;
while(ADCON0.GO);
Sensor5=(ADRESH*4)+(ADRESL/64);
}
void interrupt() {
if(INTCON.T0IF)
{
cnt++;
TMR0 = 61;
INTCON.T0IF = 0;
}
}
void main()
{
cnt=0;
TRISA = 0b00111111;
ANSEL = 0b00111111;
TRISB.F0=1;
ANSELH.F4=0;
INTCON.GIE=1;
INTCON.T0IE=1;
OPTION_REG.T0CS=0;
OPTION_REG.PSA=0;
OPTION_REG.PS2=1;
OPTION_REG.PS1=1;
OPTION_REG.PS0=1;
Lcd_Init(&PORTD);
Lcd_Cmd(LCD_CURSOR_OFF);
while(PORTB.F0);
do
{
if (cnt==1300) cnt=0;
Read_Adc();
WordToStr(Sensor1,Txt);
Lcd_Out(1,1,Txt);
WordToStr(Sensor2,Txt);
Lcd_Out(1,6,Txt);
WordToStr(Sensor3,Txt);
Lcd_Out(1,11,Txt);
WordToStr(Sensor4,Txt);
Lcd_Out(2,1,Txt);
WordToStr(cnt,Txt);
Lcd_Out(2,11,Txt);
}
while(1);
}
char Txt[6];
unsigned cnt;
void Read_Adc()
{
ADCON0=0b00000001;
delay_us(20);
ADCON0.GO=1;
while(ADCON0.GO);
Sensor1=(ADRESH*4)+(ADRESL/64);
ADCON0=0b00000101;
delay_us(20);
ADCON0.GO=1;
while(ADCON0.GO);
Sensor2=(ADRESH*4)+(ADRESL/64);
ADCON0=0b00001001;
delay_us(20);
ADCON0.GO=1;
while(ADCON0.GO);
Sensor3=(ADRESH*4)+(ADRESL/64);
ADCON0=0b00001101;
delay_us(20);
ADCON0.GO=1;
while(ADCON0.GO);
Sensor4=(ADRESH*4)+(ADRESL/64);
}
void Read_Adc1()
{
ADCON0=0b00010001;
delay_us(20);
ADCON0.GO=1;
while(ADCON0.GO);
Sensor5=(ADRESH*4)+(ADRESL/64);
}
void interrupt() {
if(INTCON.T0IF)
{
cnt++;
TMR0 = 61;
INTCON.T0IF = 0;
}
}
void main()
{
cnt=0;
TRISA = 0b00111111;
ANSEL = 0b00111111;
TRISB.F0=1;
ANSELH.F4=0;
INTCON.GIE=1;
INTCON.T0IE=1;
OPTION_REG.T0CS=0;
OPTION_REG.PSA=0;
OPTION_REG.PS2=1;
OPTION_REG.PS1=1;
OPTION_REG.PS0=1;
Lcd_Init(&PORTD);
Lcd_Cmd(LCD_CURSOR_OFF);
while(PORTB.F0);
do
{
if (cnt==1300) cnt=0;
Read_Adc();
WordToStr(Sensor1,Txt);
Lcd_Out(1,1,Txt);
WordToStr(Sensor2,Txt);
Lcd_Out(1,6,Txt);
WordToStr(Sensor3,Txt);
Lcd_Out(1,11,Txt);
WordToStr(Sensor4,Txt);
Lcd_Out(2,1,Txt);
WordToStr(cnt,Txt);
Lcd_Out(2,11,Txt);
}
while(1);
}
Код 2
CODE:
char Txt[6];
unsigned cnt;
void interrupt() {
if(INTCON.T0IF)
{
cnt++;
TMR0 = 61;
INTCON.T0IF = 0;
}
}
void main()
{
cnt=0;
TRISB.F0=1;
ANSELH.F4=0;
INTCON.GIE=1;
INTCON.T0IE=1;
OPTION_REG.T0CS=0;
OPTION_REG.PSA=0;
OPTION_REG.PS2=1;
OPTION_REG.PS1=1;
OPTION_REG.PS0=1;
Lcd_Init(&PORTD);
Lcd_Cmd(LCD_CURSOR_OFF);
while(PORTB.F0);
while(1)
{
WordToStr(cnt,Txt);
Lcd_Out(2,11,Txt);
if (cnt==300) cnt=0;
}
}
unsigned cnt;
void interrupt() {
if(INTCON.T0IF)
{
cnt++;
TMR0 = 61;
INTCON.T0IF = 0;
}
}
void main()
{
cnt=0;
TRISB.F0=1;
ANSELH.F4=0;
INTCON.GIE=1;
INTCON.T0IE=1;
OPTION_REG.T0CS=0;
OPTION_REG.PSA=0;
OPTION_REG.PS2=1;
OPTION_REG.PS1=1;
OPTION_REG.PS0=1;
Lcd_Init(&PORTD);
Lcd_Cmd(LCD_CURSOR_OFF);
while(PORTB.F0);
while(1)
{
WordToStr(cnt,Txt);
Lcd_Out(2,11,Txt);
if (cnt==300) cnt=0;
}
}