Уважаемые знатоки помогите найти проблему в коде Attiny13.

gsmtest

✩✩✩✩✩✩✩
3 Июн 2024
4
0
Идея такова при старте переводим серву в положение 90, при первом нажатии кнопки переходим в подожение 60 и обратно при повторном в положение 120 и обратно.Весь цикл собственно, но при проверке на макетке серву дергает в обе стороны и положение 90 выставляется коряво. Вот скетч:
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; // Обновление предыдущего состояния

}

}
За эквивалент взял скетч на котором все отрабатывает четко, но там 2 кнопки,а нужна одна. Вот скетч:
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;

     }

    }

}
Где я затупил уже бошку сломал, первый год занимаюсь с Ардуиной разобрался а вот Тини тяжко идет.
 
Изменено:

gsmtest

✩✩✩✩✩✩✩
3 Июн 2024
4
0
Вот и затуп нашелся походу. Уже глаза замылились. Спасибо. С тинькой второй раз вожусь слишком много инфы искать , а иной раз так запуташься в двух строках потеряешься.