SergL писал(а):
частота нифига не 8МГц, а где-то ~1МГц
новые микроконтроллеры идут с завода с запрограммированным фьюзом CKDIV8 и активным внутренним генератором 8МГц, таким образом эти МК работают на частоте 1 МГц "из коробки"
о как... ...а в даташите:
The device is shipped with CKSEL = “0010”, SUT = “10”, and CKDIV8 programmed. The default
clock source setting is therefore the Internal Oscillator running at 8 MHz with longest start-up
time and an initial system clock prescaling of 8. This default setting ensures that all users can
make their desired clock source setting using an In-System or High-voltage Programmer
и при чтении фьюзов из CKSEL только CKSEL1 выставлен
а я же сам выставляю деление частоты
Добавлено after 3 minutes 8 seconds:пока программа выглядит так:
/*
* pump_comtrol_2.cpp
*
* Created: 21.05.2019 16:10:37
* Author : lsv_general
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#define Port_Sens200Top PA5
#define Pin_Sens200Top PINA5
#define Port_Sens200Bottom PA6
#define Pin_Sens200Bottom PINA6
#define Port_Sens500Bottom PA7
#define Pin_Sens500Bottom PINA7 // есть вода +5V
#define Port_SensShower PA4
#define Pin_SensShower PINA4
#define Port_Reserv PA3
#define Pin_Reserv PINA3
#define Port_Run200 PB4
#define Port_RunShower PB6
#define Port_Pump PB5
volatile uint16_t c_sec = 0;
volatile uint16_t c_msec = 0;
volatile uint8_t iSens500 = 0;
volatile bool isWork = false;
volatile bool Pump200Work = false;
volatile bool PumpShowerWork = false;
volatile bool bNeed200 = false;
volatile bool bTest = false;
ISR ( TIMER0_COMPA_vect)
{
c_sec++;
if (c_sec>999){ //999
c_sec=0;
if (iSens500>0) {
iSens500--;
}
isWork=true;
}
c_msec++;
}
void delay(uint16_t msec)
{
c_msec=0;
while (c_msec!=msec){
}
}
bool Pin500Bottom()
{
return !(PINA & (1 << Pin_Sens500Bottom));
}
void PumpOn()
{
PORTB |= _BV(Port_Pump);
}
void PumpOff()
{
PORTB &= ~_BV(Port_Pump);
}
void Valve200On()
{
PORTB |= _BV(Port_Run200);
Pump200Work=true;
}
void Valve200Off()
{
PORTB &= ~_BV(Port_Run200);
Pump200Work=false;
}
void ValveShowerOn()
{
PORTB |= _BV(Port_RunShower);
PumpShowerWork=true;
}
void ValveShowerOff()
{
PORTB &= ~_BV(Port_RunShower);
PumpShowerWork=false;
}
void AllOff()
{
PumpOff();
Valve200Off();
ValveShowerOff();
}
int main(void)
{
MCUCR = (1<<PUD);
DDRA = (0<<Port_Sens200Top)|(0<<Port_Sens200Bottom)|(0<<Port_Sens500Bottom)|(0<<Port_SensShower)|(1<<Port_Reserv);
DDRB = (1<<Port_Run200)|(1<<Port_RunShower)|(1<<Port_Pump);
TCCR0A = (0<<ICEN0)|(0<<TCW0)|(1<<CTC0)|(0<<ICNC0)|(0<<ICES0)|(0<<ACIC0); // 8-bit CTC mode
TCCR0B = (1<<CS02)|(0<<CS01)|(1<<CS00);//0x05; // делитель 1024
TCNT0L = 0;
OCR0A = 1; // число для сравнения счетчика
TIMSK = (1<<OCIE0A);
sei();
//delay(1000);
while (1)
{
if (isWork){
isWork=false;
if (bNeed200) {
bNeed200 = bNeed200 && (PINA & (1 << Pin_Sens200Top));
} else {
bNeed200 = (PINA & (1 << Pin_Sens200Top)) && (PINA & (1 << Pin_Sens200Bottom));
}
if (Pin500Bottom()) { // уровень резервного бака ! нельзя включать насос.
AllOff();
iSens500 = 5; // ожидаем наполнение нижнего бака - 1 минуту.
}
if (iSens500>0) {
continue;
}
bTest=!bTest;
if (bTest){
PORTA |= 1 << Port_Reserv;
} else {
PORTA &= ~1 << Port_Reserv;
}
// сначала проверяем реле давления - для поддержания давления воды
if (PINA & (1 << Pin_SensShower)) {
ValveShowerOn();
PumpOn();
if (bNeed200) { // если было включено наполнение верхнего бака - отключаем клапан
Valve200Off();
}
continue;
}
if ((!(PINA & (1 << Pin_SensShower))) && PumpShowerWork) { // реле давления отключилось - выключаем накачку
if (bNeed200) { // требуется наполнение верхнего бака - переключаем клапаны
Valve200On();
ValveShowerOff();
} else { // иначе - отключаем клапаны и насос
AllOff();
}
continue;
}
// проверяем необходимость наполнения верхнего бака
if (bNeed200) {
Valve200On();
PumpOn();
} else { // иначе - выключаем насос
Valve200Off();
PumpOff();
}
}
}
}
с делителем и другими настройками таймера пока буду "играться"
Добавлено after 57 seconds:...блин, все табы "испортились"