CODE
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#define F_CPU 20000000UL // 20 MHz
#define buzz_on DDRD |= (1<<5); //включить бузер (установить в 1 DDRD.5)
#define buzz_off DDRD &= ~(1<<5); //выключить бузер (установить в 0 DDRD.5)
#define charge_on PORTD |= (1<<6); //включить бузер (установить в 1 PORTD.6)
#define charge_off PORTD &= ~(1<<6); //выключить бузер (установить в 0 PORTD.6)
#define Hz_on PORTB |= (1<<5); //включить индикатор 50 Гц (установить в 1 PORTD.6)
#define Hz_off PORTB &= ~(1<<5); //выключить индикатор 50 Гц (установить в 0 PORTD.6)
#define led_1_on PORTD &= ~(1<<0); //включить 1-й светодиод (установить в 0 PORTD.0)
#define led_1_off PORTD |= (1<<0); //выключить 1-й светодиод (установить в 1 PORTD.0)
#define led_2_on PORTD &= ~(1<<1); //включить 2-й светодиод (установить в 0 PORTD.1)
#define led_2_off PORTD |= (1<<1); //выключить 2-й светодиод (установить в 1 PORTD.1)
#define led_3_on PORTD &= ~(1<<2); //включить 3-й светодиод (установить в 0 PORTD.2)
#define led_3_off PORTD |= (1<<2); //выключить 3-й светодиод (установить в 1 PORTD.2)
#define led_4_on PORTD &= ~(1<<3); //включить 4-й светодиод (установить в 0 PORTD.3)
#define led_4_off PORTD |= (1<<3); //выключить 4-й светодиод (установить в 1 PORTD.3)
#define led_5_on PORTD &= ~(1<<4); //включить 5-й светодиод (установить в 0 PORTD.4)
#define led_5_off PORTD |= (1<<4); //выключить 5-й светодиод (установить в 1 PORTD.4)
#define ch_1_on PORTB &= ~(1<<2); //включить 5-й светодиод (установить в 0 PORTB.2)
#define ch_1_off PORTB |= (1<<2); //выключить 5-й светодиод (установить в 1 PORTB.2)
#define ch_2_on PORTB &= ~(1<<1); //включить 5-й светодиод (установить в 0 PORTB.1)
#define ch_2_off PORTB |= (1<<1); //выключить 5-й светодиод (установить в 1 PORTB.1)
#define ch_3_on PORTB &= ~(1<<0); //включить 5-й светодиод (установить в 0 PORTB.0)
#define ch_3_off PORTB |= (1<<0); //выключить 5-й светодиод (установить в 1 PORTB.0)
#define t_tk 3 //1 = 10 ms время устранения дребезга
#define t_pause 20
#define charge_max 996 //5.9
#define charge_min 977 //5.8V
#define charge_5 940 //5.6 V
#define charge_4 876 //5.2 V
#define charge_3 809 //4.8 V
#define charge_2 741 //4.4 V
#define charge_1 674 //4.0 V
unsigned int adc_data;
char t_tk1;
char t_tk2;
char t_p;
char SB1; //bit
char SB2; //bit
char ch=1;
unsigned int v;
/*
FUSES =
{
.low = (FUSE_CKSEL3),//20 MHz кварц, быстрый старт
.high = (FUSE_BODLEVEL1 & FUSE_SPIEN),//BOD 2.7 V
.extended = EFUSE_DEFAULT,
};
LOCKBITS = (LB_MODE_1);//пока все можно
*/
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | 0b11000000;
ADCSRA |= (1<<ADSC); //начать преобразование
while (!(ADCSRA & (1<<ADIF))) {asm("nop");}; //ждем появления флага завершения преобр.
ADCSRA |= (1<<ADIF);//сбросить флаг
return ADCW;
}
void charge(void) {
led_1_off;
led_2_off;
led_3_off;
led_4_off;
led_5_off;
ch_1_off;
ch_2_off;
ch_3_off;
Hz_off;
while(PIND & (1<<PIND7)) {
if(read_adc(6)<=charge_max) {
charge_on;
led_1_off;
wdt_enable(WDTO_1S);
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
sleep_mode ();
}
else {
wdt_disable();
charge_off;
led_1_on;
for(;;) {
if(TIFR1 & (1<<TOV1)) {
PORTB ^= (1<<5);//мигаем индикатором 50 Гц
TCNT1H = 0xD9; //setup
TCNT1L = 0xDB;
TCCR1B = 0x05; //start Timer 2 Hz
TIFR1 |= (1<<TOV1); }
if(read_adc(6)<=charge_min) {break;} } } }//while
}
void scale (unsigned int a)
{
if(a>10) {led_1_on;}
else {led_1_off;}
if(a>250) {led_2_on;}
else {led_2_off;}
if(a>490) {led_3_on;}
else {led_3_off;}
if(a>730) {led_4_on;}
else {led_4_off;}
if(a>970) {led_5_on;}
else {led_5_off;}
}
ISR(PCINT0_vect)// нажата/отпущена одна из кнопок
{
if(!(PINB & (1<<PINB3))) {SB1=1; t_tk1=0;}//если SB1(режим) нажата Проверка, PIND0 = 0?
else {SB1=0;}
if(!(PINB & (1<<PINB4))) {SB2=1; t_tk2=0;}//если SB1(режим) нажата Проверка, PIND0 = 0?
else {SB2=0;}
}
ISR(TIMER2_COMPA_vect)
{
t_tk1++;
t_tk2++;
t_p++;
}
ISR(PCINT2_vect)//подано/снято напряжение заряда
{
if(PIND & (1<<PIND7)) {charge();}
}
int main(void)
{
PCICR=0b00000101; //разрешаем прерывания pin change
PCMSK2=0b10000000;//PCINT23 -> PD7 (есть напряжение зарядки)
PCMSK0=0b00011000;//PCINT3 -> PB3;(кнопка вкл/выкл реж.50 Гц) PCINT4 -> PB4;(кнопка проверки заряда)
DDRB=0b00100111;//7,6-кварц;5-led 50Гц;4,3-кнопки "заряд","50Гц";2,1,0-светодиоды усиления
PORTB=0b00000111;
DDRC=0b00000000;//6 RESET; 5-0 входы АЦП
PORTC=0b00000000;
DDRD=0b01011111;//7-зарядное напр; 6-управл зарядкой; 5-бузер; 4-0-светодиоды уровня
PORTD=0b01011111;
OCR0A= 0x4E;//TIMER0 prescale:64 WGM: CTC 3906,250Hz
TCCR0A = 0x10;
TCCR0B = 0x03; //start timer
OCR2A = 0xC3;//TIMER2 99,649Hz CTC
TIMSK2 = 0b00000010;
TCCR2A = 0b00000010;
TCCR2B = 0b00000111; //start
TCNT1H = 0xD9; //setup
TCNT1L = 0xDB;
TCCR1B = 0x05; //start Timer 2 Hz
ADCSRA=0b10000111;
asm("sei");
charge();
while(1)
{
if((!(PINB & (1<<PINB4)))&(SB2==1)&(t_tk2>t_tk)&(t_p>t_pause)) {
//то, что происходит при нажатии кнопки SB2 "заряд" - показываем уровень напряжения//_delay_ms (150);
asm("nop");
t_p=0;}
if((!(PINB & (1<<PINB3)))&(SB1==1)&(t_tk1>t_tk)&(t_p>t_pause)) {//то, что происходит при нажатии кнопки SB1 "50 Гц"
ch++;
t_p=0;
if(ch==6) ch=0;}
if(ch==0) {
v=0;
Hz_off;
v=read_adc(0);//max
ch_1_on;
ch_2_off;
ch_3_off;
scale(v);}
if(ch==1) {
v=0;
Hz_off;
v=read_adc(1);//low
ch_1_off;
ch_2_on;
ch_3_off;
scale(v);}
if(ch==2) {
v=0;
Hz_off;
v=read_adc(2);//min
ch_1_off;
ch_2_off;
ch_3_on;
scale(v);}
if(ch==3) {
v=0;
adc_data=0;
Hz_on;
for(char i=0;i<=253;i++) {
adc_data=read_adc(3);//max
if(adc_data>v) {v=adc_data;} }
ch_1_on;
ch_2_off;
ch_3_off;
scale(v);}
if(ch==4) {
v=0;
adc_data=0;
Hz_on;
for(char i=0;i<=253;i++) {
adc_data=read_adc(4);//low
if(adc_data>v) {v=adc_data;} }
ch_1_off;
ch_2_on;
ch_3_off;
scale(v);}
if(ch==5) {
v=0;
adc_data=0;
Hz_on;
for(char i=0;i<=253;i++) {
adc_data=read_adc(5);//min
if(adc_data>v) {v=adc_data;} }
ch_1_off;
ch_2_off;
ch_3_on;
scale(v);}
}//while
return 0;
}//main
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#define F_CPU 20000000UL // 20 MHz
#define buzz_on DDRD |= (1<<5); //включить бузер (установить в 1 DDRD.5)
#define buzz_off DDRD &= ~(1<<5); //выключить бузер (установить в 0 DDRD.5)
#define charge_on PORTD |= (1<<6); //включить бузер (установить в 1 PORTD.6)
#define charge_off PORTD &= ~(1<<6); //выключить бузер (установить в 0 PORTD.6)
#define Hz_on PORTB |= (1<<5); //включить индикатор 50 Гц (установить в 1 PORTD.6)
#define Hz_off PORTB &= ~(1<<5); //выключить индикатор 50 Гц (установить в 0 PORTD.6)
#define led_1_on PORTD &= ~(1<<0); //включить 1-й светодиод (установить в 0 PORTD.0)
#define led_1_off PORTD |= (1<<0); //выключить 1-й светодиод (установить в 1 PORTD.0)
#define led_2_on PORTD &= ~(1<<1); //включить 2-й светодиод (установить в 0 PORTD.1)
#define led_2_off PORTD |= (1<<1); //выключить 2-й светодиод (установить в 1 PORTD.1)
#define led_3_on PORTD &= ~(1<<2); //включить 3-й светодиод (установить в 0 PORTD.2)
#define led_3_off PORTD |= (1<<2); //выключить 3-й светодиод (установить в 1 PORTD.2)
#define led_4_on PORTD &= ~(1<<3); //включить 4-й светодиод (установить в 0 PORTD.3)
#define led_4_off PORTD |= (1<<3); //выключить 4-й светодиод (установить в 1 PORTD.3)
#define led_5_on PORTD &= ~(1<<4); //включить 5-й светодиод (установить в 0 PORTD.4)
#define led_5_off PORTD |= (1<<4); //выключить 5-й светодиод (установить в 1 PORTD.4)
#define ch_1_on PORTB &= ~(1<<2); //включить 5-й светодиод (установить в 0 PORTB.2)
#define ch_1_off PORTB |= (1<<2); //выключить 5-й светодиод (установить в 1 PORTB.2)
#define ch_2_on PORTB &= ~(1<<1); //включить 5-й светодиод (установить в 0 PORTB.1)
#define ch_2_off PORTB |= (1<<1); //выключить 5-й светодиод (установить в 1 PORTB.1)
#define ch_3_on PORTB &= ~(1<<0); //включить 5-й светодиод (установить в 0 PORTB.0)
#define ch_3_off PORTB |= (1<<0); //выключить 5-й светодиод (установить в 1 PORTB.0)
#define t_tk 3 //1 = 10 ms время устранения дребезга
#define t_pause 20
#define charge_max 996 //5.9
#define charge_min 977 //5.8V
#define charge_5 940 //5.6 V
#define charge_4 876 //5.2 V
#define charge_3 809 //4.8 V
#define charge_2 741 //4.4 V
#define charge_1 674 //4.0 V
unsigned int adc_data;
char t_tk1;
char t_tk2;
char t_p;
char SB1; //bit
char SB2; //bit
char ch=1;
unsigned int v;
/*
FUSES =
{
.low = (FUSE_CKSEL3),//20 MHz кварц, быстрый старт
.high = (FUSE_BODLEVEL1 & FUSE_SPIEN),//BOD 2.7 V
.extended = EFUSE_DEFAULT,
};
LOCKBITS = (LB_MODE_1);//пока все можно
*/
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | 0b11000000;
ADCSRA |= (1<<ADSC); //начать преобразование
while (!(ADCSRA & (1<<ADIF))) {asm("nop");}; //ждем появления флага завершения преобр.
ADCSRA |= (1<<ADIF);//сбросить флаг
return ADCW;
}
void charge(void) {
led_1_off;
led_2_off;
led_3_off;
led_4_off;
led_5_off;
ch_1_off;
ch_2_off;
ch_3_off;
Hz_off;
while(PIND & (1<<PIND7)) {
if(read_adc(6)<=charge_max) {
charge_on;
led_1_off;
wdt_enable(WDTO_1S);
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
sleep_mode ();
}
else {
wdt_disable();
charge_off;
led_1_on;
for(;;) {
if(TIFR1 & (1<<TOV1)) {
PORTB ^= (1<<5);//мигаем индикатором 50 Гц
TCNT1H = 0xD9; //setup
TCNT1L = 0xDB;
TCCR1B = 0x05; //start Timer 2 Hz
TIFR1 |= (1<<TOV1); }
if(read_adc(6)<=charge_min) {break;} } } }//while
}
void scale (unsigned int a)
{
if(a>10) {led_1_on;}
else {led_1_off;}
if(a>250) {led_2_on;}
else {led_2_off;}
if(a>490) {led_3_on;}
else {led_3_off;}
if(a>730) {led_4_on;}
else {led_4_off;}
if(a>970) {led_5_on;}
else {led_5_off;}
}
ISR(PCINT0_vect)// нажата/отпущена одна из кнопок
{
if(!(PINB & (1<<PINB3))) {SB1=1; t_tk1=0;}//если SB1(режим) нажата Проверка, PIND0 = 0?
else {SB1=0;}
if(!(PINB & (1<<PINB4))) {SB2=1; t_tk2=0;}//если SB1(режим) нажата Проверка, PIND0 = 0?
else {SB2=0;}
}
ISR(TIMER2_COMPA_vect)
{
t_tk1++;
t_tk2++;
t_p++;
}
ISR(PCINT2_vect)//подано/снято напряжение заряда
{
if(PIND & (1<<PIND7)) {charge();}
}
int main(void)
{
PCICR=0b00000101; //разрешаем прерывания pin change
PCMSK2=0b10000000;//PCINT23 -> PD7 (есть напряжение зарядки)
PCMSK0=0b00011000;//PCINT3 -> PB3;(кнопка вкл/выкл реж.50 Гц) PCINT4 -> PB4;(кнопка проверки заряда)
DDRB=0b00100111;//7,6-кварц;5-led 50Гц;4,3-кнопки "заряд","50Гц";2,1,0-светодиоды усиления
PORTB=0b00000111;
DDRC=0b00000000;//6 RESET; 5-0 входы АЦП
PORTC=0b00000000;
DDRD=0b01011111;//7-зарядное напр; 6-управл зарядкой; 5-бузер; 4-0-светодиоды уровня
PORTD=0b01011111;
OCR0A= 0x4E;//TIMER0 prescale:64 WGM: CTC 3906,250Hz
TCCR0A = 0x10;
TCCR0B = 0x03; //start timer
OCR2A = 0xC3;//TIMER2 99,649Hz CTC
TIMSK2 = 0b00000010;
TCCR2A = 0b00000010;
TCCR2B = 0b00000111; //start
TCNT1H = 0xD9; //setup
TCNT1L = 0xDB;
TCCR1B = 0x05; //start Timer 2 Hz
ADCSRA=0b10000111;
asm("sei");
charge();
while(1)
{
if((!(PINB & (1<<PINB4)))&(SB2==1)&(t_tk2>t_tk)&(t_p>t_pause)) {
//то, что происходит при нажатии кнопки SB2 "заряд" - показываем уровень напряжения//_delay_ms (150);
asm("nop");
t_p=0;}
if((!(PINB & (1<<PINB3)))&(SB1==1)&(t_tk1>t_tk)&(t_p>t_pause)) {//то, что происходит при нажатии кнопки SB1 "50 Гц"
ch++;
t_p=0;
if(ch==6) ch=0;}
if(ch==0) {
v=0;
Hz_off;
v=read_adc(0);//max
ch_1_on;
ch_2_off;
ch_3_off;
scale(v);}
if(ch==1) {
v=0;
Hz_off;
v=read_adc(1);//low
ch_1_off;
ch_2_on;
ch_3_off;
scale(v);}
if(ch==2) {
v=0;
Hz_off;
v=read_adc(2);//min
ch_1_off;
ch_2_off;
ch_3_on;
scale(v);}
if(ch==3) {
v=0;
adc_data=0;
Hz_on;
for(char i=0;i<=253;i++) {
adc_data=read_adc(3);//max
if(adc_data>v) {v=adc_data;} }
ch_1_on;
ch_2_off;
ch_3_off;
scale(v);}
if(ch==4) {
v=0;
adc_data=0;
Hz_on;
for(char i=0;i<=253;i++) {
adc_data=read_adc(4);//low
if(adc_data>v) {v=adc_data;} }
ch_1_off;
ch_2_on;
ch_3_off;
scale(v);}
if(ch==5) {
v=0;
adc_data=0;
Hz_on;
for(char i=0;i<=253;i++) {
adc_data=read_adc(5);//min
if(adc_data>v) {v=adc_data;} }
ch_1_off;
ch_2_off;
ch_3_on;
scale(v);}
}//while
return 0;
}//main
Нужна подсказка что это может быть. Спасибо.