Прошивка блока питания на ATTINY24 для платформы DIXOM-C12
Микроконтроллер работает от внутреннего генератора на частоте 1Мгц, прошивка занимает 752байта паймяти из доступных 2кБ, и 10 байт оперативки из доступных 128 байт. В общем ещё есть место для фантазий.
Прошивка очень простая, в принципе этого более чем достаточно для нормальной работы платы, все тайминги можно регулировать.
Так как счётчик тикает каждые 100мс, то 1 это 100мс, 10 это 1000мс т.е. 1 секунда и т.д.
PHP код:
#define F_CPU 1000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define POWER_33v _BV(PB0)
#define TABLET_POWER_1 _BV(PB1)
#define TABLET_POWER_2 _BV(PB2)
#define POWER_5v _BV(PA7)
#define BUZZER _BV(PA6)
#define ACC _BV(PA5)
#define OTG_MODE _BV(PA4)
#define REMOT _BV(PA3)
#define REMOT_OU _BV(PA0)
unsigned long timerOFF = 0;
unsigned long timerOn = 0;
int adc_value = 0;
int main(void)
{
DDRB |= POWER_33v; // OUTPUT
DDRB |= TABLET_POWER_1; // OUTPUT
DDRB |= TABLET_POWER_2; // OUTPUT
DDRA |= POWER_5v; // OUTPUT
DDRA |= BUZZER; // OUTPUT
DDRA |= OTG_MODE; // OUTPUT
DDRA |= REMOT; // OUTPUT
DDRA |= REMOT_OU; // OUTPUT
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0);
ADMUX=0x05;
while(1){
ADCSRA |= (1<<ADSC); //Запуск конвертации АЦП
while (ADCSRA & (1<<ADSC)); //Ждём завершение конвертации АЦП
adc_value = ADCW; //Забираем значение АЦП
if (adc_value < 200)
{
///////////////////////////////////////////////////ACC Выключен////////////////////////////////////////////////////
timerOn =0; //Обнуляем счётчик включения
if (timerOFF<=33000000){ //Если таймер выключения меньше 33 млн
timerOFF ++; //То прибавляем 1 каждые 100мс
}
// PORTA |= BUZZER;
if(timerOFF==1) { PORTA |= BUZZER; } //Включаем пищалку
if(timerOFF==4) { PORTA &= ~BUZZER; } //Отключаем пищалку
if(timerOFF==100) { PORTA &= ~REMOT; } //Отключаем питание REMOT
if(timerOFF==120) { PORTA &= ~REMOT_OU; } //Отключаем питание REMOT2 OU (операционные усилители)
if(timerOFF==300) { PORTB &= ~POWER_33v; } //Отключаем питание переферии 3.3v
if(timerOFF==300) { PORTA &= ~POWER_5v; } //Отключаем питание USB HUB
if(timerOFF==200) { PORTA &= ~OTG_MODE; } //перехватываем управление ОТГ у stm32
if(timerOFF==2200) { PORTB &= ~TABLET_POWER_2; } //Отключаем 2-ю фазу питания планшета
if(timerOFF==13000000){ PORTB &= ~TABLET_POWER_1; } //через 2 недели отключаем полностью питание планшета
}else {
///////////////////////////////////////////////////ACC Включён////////////////////////////////////////////////////
timerOFF =0; //Обнуляем счётчик таймера отключения
if (timerOn<=100){ //Если таймер включения меньше 100
timerOn++; //То прибавляем 1 каждые 100мс
}
// PORTA &= ~BUZZER;
if(timerOn==1) { PORTA |= BUZZER; } //Включаем пищалку
if(timerOn==4) { PORTA &= ~BUZZER; } //Отключаем пищалку
if(timerOn==20) { PORTB |= TABLET_POWER_1; } //Включаем 1-ю фазу питания планшета
if(timerOn==20) { PORTB |= TABLET_POWER_2; } //Включаем 2-ю фазу питания планшета
if(timerOn==20) { PORTA |= POWER_5v; } //Включаем питание USB HUB
if(timerOn==20) { PORTB |= POWER_33v; } //Включаем питание переферии 3.3v
if(timerOn==20) { PORTA |= OTG_MODE; } //Отдаём управление режимом отг STM32
if(timerOn==20) { PORTA |= REMOT_OU; } //Включаем питание операционных усилителей
if(timerOn==60) { PORTA |= REMOT; } //Включаем питание REMOT
}
_delay_ms(100); //задержка 100мс для таймеров
} return (0);
}