Идея такова при старте переводим серву в положение 90, при первом нажатии кнопки переходим в подожение 60 и обратно при повторном в положение 120 и обратно.Весь цикл собственно, но при проверке на макетке серву дергает в обе стороны и положение 90 выставляется коряво. Вот скетч:
За эквивалент взял скетч на котором все отрабатывает четко, но там 2 кнопки,а нужна одна. Вот скетч:
Где я затупил уже бошку сломал, первый год занимаюсь с Ардуиной разобрался а вот Тини тяжко идет.
ArduinoIDE:
#define F_CPU 9600000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define TopTimer 200
#define angle60 194 // значение для угла 60 градусов
#define angle90 186 // значение для угла 90 градусов
#define angle120 178 // значение для угла 120 градусов
uint8_t prevState = 0; // Предыдущее состояние порта
//uint8_t currentState = 0;
int main(void)
{
// Инициализация системы
CLKPR = 0x80;
CLKPR |= 1 << CLKPS2; // на 16
// Настройка портов
DDRB |= (1 << PINB1); // PB1 как выход
DDRB &= ~(1 << PINB3); // PB3 как вход
PORTB |= (1<<PINB3);
// Настройка ШИМ
DDRB |= (1 << PINB1); // PB1 как выход
TCCR0A = (1 << WGM01) | (1 << WGM00) | (1 << COM0B1);
TCCR0B = (1 << WGM02) | (1 << CS01) | (1 << CS00); // предделитель на 64
OCR0A = TopTimer; // счетчик до TopTimer
OCR0B=angle90; // angle90; // начальное положение серво 90 градусов
while (1)
{
uint8_t currentState = PINB & (1 << PINB3); // Чтение состояния порта PB3
if (currentState && !prevState) // Если порт активен и это первое срабатывание
{
OCR0B = angle60; // Поворот на 60 градусов
_delay_ms(2000); // Задержка 1 секунда
OCR0B = angle90; // Возврат в положение 90 градусов
}
else if (!currentState && prevState) // Если порт неактивен и это второе срабатывание
{
OCR0B = angle120; // Поворот на 120 градусов
_delay_ms(2000); // Задержка 1 секунда
OCR0B = angle90; // Возврат в положение 90 градусов
}
prevState = currentState; // Обновление предыдущего состояния
}
}
ArduinoIDE:
#define TopTimer 200
#define angle60 194//188
#define angle90 186
#define angle120 178//184
#include <avr/io.h>
#include <avr/interrupt.h>
int main(void)
{
CLKPR=0x80;
CLKPR=1<<CLKPS2;// на 16
//настройка порта
DDRB=(1<<PB1);
PORTB=(1<<PB3); //|(1<<PB4);
//настройка ШИМ
TCCR0A=(1<<WGM01)|(1<<WGM00)|(1<<COM0B0)|(1<<COM0B1);
TCCR0B=(1<<WGM02)|(1<<CS01)|(1<<CS00);//предделитель счетчика на 64
OCR0A=TopTimer; //счетчик будет считать до
OCR0B=angle90; //устравноить серву в 90
while(1)
{
uint8_t buf=(PINB>>3)&0x03; //проверяем сигналы на пинах
switch (buf){
case 0:OCR0B=angle90;break;
case 1:OCR0B=angle60;break;
case 2:OCR0B=angle120;break;
default:break;
}
}
}
Изменено: