/*******************************************************
This program was created by the
CodeWizardAVR V3.12 Advanced
Automatic Program Generator
© Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 14.12.2020
Author :
Company :
Comments:
Chip type : ATmega8A
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*******************************************************/
#define F_CPU 8000000UL
#include <mega8.h>
#include <alcd.h>
#include <stdio.h>
#include <delay.h>
#include <ds18b20.h>
#include <1wire.h>
/*
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=1
#endasm
*/
char lcd_buf[17], lcd_buf2[17];
unsigned int NewState,OldState,upState,downState,time=10,temp=100,i=0,temp_18b20;
bit but=0;
bit str=0;
bit a=0;
unsigned int min=0,sec=0,im=0;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
//////////////////////////////////////////////////////////////////////
//Стар реле и переключение настроек
if (!(PINC&(1<<PORTC4))) //старт-стоп
{
i++;
if (i>65000){
if(str==0){
str=1;
PORTB=(1<<PORTB0);
PORTC=(1<<PORTC1);
while(!(PINC&(1<<PORTC4)));
}
else{
str=0;
PORTB=(0<<PORTB0);
PORTC=(0<<PORTC1);
while(!(PINC&(1<<PORTC4)));
}
i=0;
}
but=1;
}else{i=0;}
if ((PINC&(1<<PORTC4))&&(but==1)&&(a==0)) //первая настройка
{
a=1;
but=0;
}
if ((PINC&(1<<PORTC4))&&a==1&&but==1) //вторая настройка
{
a=0;
but=0;
}
/////////////////////////////////////////////////////////////////////////////////
// Энкодер обработка выводов
NewState=PINC&((1<<PORTC2)|(1<<PORTC3));
if(NewState!=OldState)
{
switch(OldState)
{
case 8:
{
if(NewState == 12) upState++;
if(NewState == 0) downState++;
break;
}
case 0:
{
if(NewState == 8) upState++;
if(NewState == 4) downState++;
break;
}
case 4:
{
if(NewState == 0) upState++;
if(NewState == 12) downState++;
break;
}
case 12:
{
if(NewState == 4) upState++;
if(NewState == 8) downState++;
break;
}
}
OldState=NewState;
}
TCNT0=0x00;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
//таймер счета времени внешний или внутрений кварц
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
im++;
if (im>=30){
sec++;
im=0;
temp_18b20=ds18b20_temperature(0);
}
if (sec>=60)
{
sec=0;
min++;
}
if(min>=60)
{
min=0;
}
TCNT2=0x00;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void main(void)
{
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (1<<DDB0);
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (1<<DDC1) | (0<<DDC0);
PORTC=(0<<PORTC6) | (0<<PORTC5) | (1<<PORTC4) | (1<<PORTC3) | (1<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TCCR0=(0<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=0x00;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//настройки таймера 2(предделитель 1024, от внутреенего источника)
ASSR=0<<AS2;
TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (1<<CS22) | (1<<CS21) | (1<<CS20);
TCNT2=0x00;
OCR2=0x00;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Настройки прерывания Т0 по переполнению, Т2 по совпадению.
TIMSK=(1<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (1<<TOIE0);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
lcd_init(16);
w1_init();
ds18b20_init(0,0,125,DS18B20_12BIT_RES);
#asm("sei")
while (1)
{
/*switch (a) {
case 0:
{ */
if (upState >= 1)
{
temp++;
upState = 0;
}
if (downState >= 1)
{
temp--;
downState = 0;
}/*
break;
}
case 1:
{
if (upState >= 1)
{
time++;
upState = 0;
}
if (downState >= 1)
{
time--;
downState = 0;
}
break;
}
}; */
lcd_clear();
lcd_gotoxy(0,0);
/* sprintf(lcd_buf,"t=%3d\xdf\C%d%d",temp,str,time);
// sprintf(lcd_buf2,"Time=%d:%d", min, sec);
sprintf(lcd_buf2,"Time=%d:%d", min, sec);
lcd_puts(lcd_buf);*/
sprintf(lcd_buf2,"%d=%d=%d=%d=%d", temp, time,str,NewState,a);
lcd_gotoxy(0,1);
lcd_puts(lcd_buf2);
delay_ms(30);
} }
Добрый день. Прошу не ругать сильно, начинаю только осваивать. Столкнулся с проблемой, что после выполнения этой команды
if (!(PINC&(1<<PORTC4))) //старт-стоп
{
i++;
if (i>65000){
if(str==0){
str=1;
PORTB=(1<<PORTB0);
PORTC=(1<<PORTC1);
while(!(PINC&(1<<PORTC4)));
}
else{
str=0;
PORTB=(0<<PORTB0);
PORTC=(0<<PORTC1);
while(!(PINC&(1<<PORTC4)));
}
i=0;
}
перестает считывать данные с портов
NewState=PINC&((1<<PORTC2)|(1<<PORTC3));
переменные выводил на дисплей, гляньте опытным глазом, а то целый день потратил и не нашел ошибку.