Переключение режима кнопкой.
Добавлено: Вт окт 11, 2016 19:35:16
Нужно переключать два режима с одного на другой - кнопокй без фиксатора. В момент переключения может работать устройство, которое легко сажает всю батарейку, если держать ключ (полевой транзистор) открытым. Поэтому открываю ключ на 1 ms - так не сажает.
Однако, когда нажимаю кнопку, и МК ее обрабатывает - вся система вешается. Т.е. батарейка, которую я использую (литионка на 4 В), показывает 0.5 В. И единственный способ запустить снова работу - это разьеденить цепь и заново замкнуть.
Код использую такой
И еще вопрос.
Микроконтроллер управляет через ключ в виде полевого транзистора можным устройством.
Если задать команду
PORTB &=~(1<<2);
_delay_ms(4000);
PORTB |= (1<<2);
_delay_us(1000);
То выдает сигнал раз в 4 сек.
Но если добавить после этого
_delay_ms(4000);
PORTB |= (1<<2);
_delay_us(1000);
PORTB &=~(1<<2);
_delay_ms(1000);
PORTB |= (1<<2);
_delay_us(1000);
Т.е. должен срабатывать так: 4 сек ждет, сигнал, 1 сек ждет, сигнал, 4 сек ждет и т.д.
Но по факту работает так: 4 сек ждет, сигнал, 4 сек ждет и т.д.
Почему?
Однако, когда нажимаю кнопку, и МК ее обрабатывает - вся система вешается. Т.е. батарейка, которую я использую (литионка на 4 В), показывает 0.5 В. И единственный способ запустить снова работу - это разьеденить цепь и заново замкнуть.
Код использую такой
Спойлер
Код: Выделить всё
#include <util/delay.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
char mod = 0;
int FixTime = 5400;
volatile uint8_t i;
volatile uint8_t Sec;
int tp = 0; // time pain - время сколько бьет током.
ISR(TIM0_OVF_vect)
{
if (!(++i%4)) //period 1s
{ PORTB ^= (1<<PB0);
Sec++;
}
}
int main(void) {
PRR = (1<<PRADC); // shut down ADC
TIMSK0 = (1<<TOIE0); // timer0 overflow interrupt enable
TCCR0B = (1<<CS02) | (1<<CS00); // prescaler 1/1024
DDRB |= (1<<PB0);
i=0; Sec=0;
sei();
int RandTime = 3600 + random()%3600;
DDRB |=(1<<2); //транзистор
DDRB |=(1<<3); //cветодиод З
DDRB |=(1<<4); //cветодиод К
DDRB &=~(1<<1); //кнопка
while (1)
{
if (mod==0) //если первый режим включен, то когда прошедшее время равно RandTime - подаем напряжение на ножку.
{
while (tp <= 20)
{
PORTB &=~(1<<2);
_delay_ms(100);
PORTB |= (1<<2);
_delay_us(1000);
tp++;
}
tp = 0;
}
else //если второй режим включен, то когда прошедшее время равно FixTime - подаем напряжение на ножку.
{
while (tp <= 20)
{
PORTB &=~(1<<2);
_delay_ms(4000);
PORTB |= (1<<2);
_delay_us(1000);
tp++;
}
tp = 0;
}
if (PINB & (1<<1)) //Если на ножке есть напряжение то:
{
if (mod==0) //Если включен режим 0, меняем его на 1
{
mod = 1;
Sec = 0; //обнуляем время
_delay_ms(100);
}
else //Если включен 1 режим, меняем его на 0
{
mod = 0;
Sec = 0; //обнуляем время
_delay_ms(100);
}
}
}
}
Микроконтроллер управляет через ключ в виде полевого транзистора можным устройством.
Если задать команду
Спойлер
while (1)PORTB &=~(1<<2);
_delay_ms(4000);
PORTB |= (1<<2);
_delay_us(1000);
Но если добавить после этого
Спойлер
PORTB &=~(1<<2);_delay_ms(4000);
PORTB |= (1<<2);
_delay_us(1000);
PORTB &=~(1<<2);
_delay_ms(1000);
PORTB |= (1<<2);
_delay_us(1000);
Но по факту работает так: 4 сек ждет, сигнал, 4 сек ждет и т.д.
Почему?