Пн сен 13, 2021 20:28:26
Вт сен 14, 2021 05:39:52
О да.Bondosha писал(а):когда разберусь с проблемой
А проблемаBondosha писал(а):в чем проблема
Вт сен 14, 2021 06:46:32
Вт сен 14, 2021 10:05:13
Вт сен 14, 2021 17:21:52
#ifndef MAIN_H_
#define MAIN_H_
// Определение частоты для компилятора.
#define F_CPU 9600000UL // Attiny13 9.6MHz / PWM 36.8 KHz / CKDIV8 = 1
#include <util/delay.h>
#include <avr/io.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <stdbool.h> // bool in C99
#define nop __asm__ __volatile__ ("nop");
typedef uint8_t u8;
typedef uint16_t u16;
int main(void);
static void setup(void);
static void wakeup(void);;
static u8 bat_getvoltage(void);
#endif /* MAIN_H_ */
#include <util/delay.h>
#include <avr/io.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <stdbool.h> // bool in C99
int count = 0;
volatile uint8_t timer1 = 0;
volatile uint8_t timer2 = 0;
volatile uint8_t timerADC = 0;
volatile uint8_t countMode = 0; //????? ?????????? ??????
volatile uint8_t reqChangeMode = 0; //????, ???????????? ????? ????????? ???????? ?????
u8 adc_raw = 0;
u8 adc_raw2 = 0;
volatile uint8_t timerADC2 = 0;
volatile uint16_t voltage_buffer = 0;
volatile uint16_t voltage_counter = 0;
ISR(TIM0_COMPA_vect)
{
knopka_check();
bat_check();
}
void bat_check(void)
{
u8 adc_raw = bat_getvoltage();
if ((adc_raw <= 207)&&(adc_raw > 183))
{
PORTB = (countMode) ? 0b0111 : 0b0101;
} else if ((adc_raw <= 183)&&(adc_raw > 130))
{
if(++timer1 == 100)
{
PORTB = 0b1000;
timer1 = 0;
}
else PORTB = (countMode) ? 0b1011 : 0b1001;
}
else if (adc_raw <= 130)
{
if (++timer2 >= 100)
{
PORTB = (countMode) ? 0b1111 : 0b1101;
timer2 = 0;
}
else PORTB = 0b1100;
}
if (adc_raw > 210)
{
PORTB = (countMode) ? 0b1111 : 0b1101;
}
if (adc_raw < 30)
{
DDRB = 0b00000011;
PORTB = 0b00000000;
}
}
void knopka_check(void) {
u8 adc_knopki = bat_getvoltage();
if (adc_knopki < 90)
{
if (count < 250)
count++;
} else {
if (count > 0)
count--;
if ((count >= 4)&&(count < 50))
{
countMode = (countMode + 1) & 0x1;
reqChangeMode = 1;
count = 0;
}
}
if (reqChangeMode) {
reqChangeMode = 0;
switch (countMode) {
case 0:
{
PORTB = 0b00001101;
}
break;
case 1:
{
PORTB = 0b00001111;
}
break;
}
}
}
int main(void) {
setup();
sei ();
while(1) {
}
}
void setup(void){
ADMUX =
(1 << ADLAR) | (1 << REFS0) | (1 << MUX1) | (0 << MUX0);
ADCSRA |= (1 << ADEN)|(1 << ADPS2)|(1 << ADPS1);
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (1<<ACI) | (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0);
TCCR0B = (0 << CS02) | (1 << CS01) | (1 << CS00 );
TCCR0A = (0 << WGM02) | (1 << WGM01) | (0 << WGM00);
OCR0A = 69;
TCNT0 = 0;
TIMSK0|=(1<<OCIE0A)|(0<<TOIE0);
DDRB = 0b00001111;
PORTB = 0b00001101;
wakeup();
}
void wakeup(void) {
ADCSRA |= (1 << ADSC);
}
u8 bat_getvoltage(void) {
_delay_us(50);
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC));
return ADCH;
}
Вт сен 14, 2021 18:31:48
Если на долю секунды разомкнуть кнопку, то ...Bondosha писал(а):Полунажатие кнопки (кнопка KAN15-A, контакты на долю секунды размыкаются)
Вт сен 14, 2021 18:34:32
Вт сен 14, 2021 19:34:38
Вт сен 14, 2021 19:44:02
нет гистерезисаBondosha писал(а): между б и в ловит помеху какую-то или перепады резкие от акб и получается очень быстрый стробоскоп.
#define RedLight_ON() DDRB |= (1<<PB2)
#define RedLight_OFF() DDRB &=~(1<<PB2)
#define BlueLight_ON() DDRB |= (1<<PB3)
#define BlueLight_OFF() DDRB &=~(1<<PB3)
#define out1_set() DDRB |= (1<<PB0)+(1<<PB1); PORTB = (1<<PB0)
#define out1_clr() PORTB &=~(1<<PB0)
#define out2_set() PORTB |= (1<<PB1)
#define out2_clr() PORTB &=~(1<<PB1)
Вт сен 14, 2021 19:54:14
Вт сен 14, 2021 20:17:40
не в гистерезисе дело.slav0n писал(а):нет гистерезиса
Ср сен 15, 2021 07:56:42
Bondosha писал(а):а пример этого гистерезиса можно, пожалуйста?
void bat_check(void)
{
u8 adc_raw = bat_getvoltage();
if(adc_raw > 210) {//MAX - 211
...
} else
if(adc_raw > 183) {//210 - 184
...
} else
if(adc_raw < 170) //HYSTERESIS 183 - 170
if(adc_raw > 150) {//169 - 151
...
} else
if(adc_raw > 30) {//150 - 31
...
} else { // adc_raw <= 30
...
}
}
Ср сен 15, 2021 10:46:51
Ср сен 15, 2021 14:24:54
там же написано:Bondosha писал(а):между 150 и 170 вообще ничего не происходит
//HYSTERESIS 183 - 170
void bat_check(void)
{
static u8 dutycycle;
u8 adc_raw = bat_getvoltage();
if (adc_raw > 210) { //MAX - 211
BlueLight_ON();
dutycycle = 0;
} else
if (adc_raw > 183) { //210 - 184
BlueLight_OFF();
dutycycle = 5;
} else
if (adc_raw < 170) //HYSTERESIS 183 - 170
if (adc_raw > 150) { //169 - 151
BlueLight_OFF();
dutycycle = 95;
} else
if (adc_raw > 30) { //150 - 31
BlueLight_OFF();
dutycycle = 0;
} else { // adc_raw <= 30
BlueLight_OFF();
dutycycle = 0;
}
static u8 timer;
if(++timer >= 100) timer = 0;
if(dutycycle && timer > dutycycle) RedLight_ON();
else RedLight_OFF();
}
Ср сен 15, 2021 17:17:54
Ср сен 15, 2021 21:36:51
Ср сен 15, 2021 21:58:28
Ср сен 15, 2021 22:06:01
Ср сен 15, 2021 22:25:42
Ср сен 15, 2021 22:28:37