Attiny13 и ШИМ

gzp13
Offline
Зарегистрирован: 06.04.2015

Здравствуйте, хочу считать сигнал с RC приемника, модуляция ШИМ,длительность импульса от 1 до 2мс. Хочу сделать RC переключатель, чтобы при переключении тумблера пульта управления, приемник включал необходимый режим. Совсем запутался,понял что надо делать на прерываниях таймера, т.е за определенный промежуток следить за изменением сигнала, и как только он изменился менять 0 на 1 или наоборот. Подскажите, как можно это реализовать. Частота работы Attiny 1.2МГц, фьюзы стандатрные. Как можно расчитать этот временной интервал в течение которого происходит замер длительности импульса. А может есть способ попроще для моего проекта?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

gzp13 пишет:

хочу считать

Считывайте

gzp13 пишет:

Хочу сделать

Делайте

Зачем всем-то об этом сообщать? А вот, может, "Ларису Ивановну хочу", но не кричу же об этом на каждом углу.

gzp13 пишет:

может есть способ попроще для моего проекта?

Конечно, есть!

Чтобы впихнуть это в 13-ую тиньку - это надо программировать уметь. А если не умеете, то просто возьмите такую же по размеру и всему остальному Attiny-85, в неё вполне влезет библиотека RCSwitch и с её помощью сделаете всё, что Вам нужно.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Вы так бестолково задали вопрос что придется мне его за вас перезадать.

Товарищчь желает сигналом на серву, снимаемым с выхода приёмника дрона,
включать выходы процессора, разные (лампочки всякие),  в зависимости длительности импульса.

Диапазон примерно 1000  -  2000 микросекунд ( настраивается в аппаратуре).

Таких устройств навяно примерно полмиллиона, называются они RC SWITCH.

https://www.google.ru/search?newwindow=1&biw=1920&bih=962&tbm=isch&sa=1&ei=rm3jWv2GH6qR6ATMvbywCQ&q=rc+switch+attiny&oq=rc+switch+attiny&gs_l=psy-ab.3..0i24k1l3.591810.591810.0.592224.1.1.0.0.0.0.330.330.3-1.1.0....0...1c.1.64.psy-ab..0.1.328....0.xu9BcSrvWwM
 

Проще купить, но там два канала и управление двойным "нажатием кнопки"
Switch Working Mode
Each time you press the third channel switch twice or press the third channel button twice,

press the following order to cycle:
2-way output off ->
A-way output open, B-way output off ->
A-way output off, B-way output open ->
2-way output are open ->
two-lamp breathing burst mode ->
2-way output off
... ...cycle

https://www.banggood.com/Two-Channels-Controlled-Switch-Remote-Control-R...

На али дешевле......

gzp13
Offline
Зарегистрирован: 06.04.2015

купить то проще, да и есть они у меня, но я хочу сделать сам,для опыта и мозгов полезно.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

gzp13 пишет:

купить то проще, да и есть они у меня, но я хочу сделать сам,для опыта и мозгов полезно.

И это правильно!
Дерзайте!
http://vg.ucoz.ru/forum/8-146-1

gzp13
Offline
Зарегистрирован: 06.04.2015


void Initialize_Interrupts (void)
{
  MCUCR |= (1 << ISC01) | (1 << ISC00); //Rising front Interrupt on INT0
  GIMSK |= (1 << INT0);         //INT0 Interrupt Enable
  TIMSK0 |= (1 << TOIE0);         //Timer Overflow Interrupt Enable
  sei();                  //Global Interrupts Enable
}

 SIGNAL(INT0_vect)
{
  TCNT0 = 0;               //Reset timer
  TCCR0A = 0;
  TCCR0B |= (1 << CS01) | (1 << CS00); // Set the prescaler to clock/64 & enable timer
  while (PINB & (1 << PINB1))
  {
    timer = TCNT0;
    
  } 
}

ISR (TIM0_OVF_vect)
{
  timer++;
  if (timer > 65000) {timer = 30;}
}
int main()
{
  DDRB |= (1 << PB0);   // OUTPUT
  DDRB &= ~(1 << PB1);  // INPUT
  Initialize_Interrupts();   
    while (1)
  {    
        
    if (timer > 30 || timer < 13)   
    {        
      PORTB |= (1 << PB0); // HIGH
      _delay_ms(80);
      PORTB &= ~(1 << PB0); // LOW
      _delay_ms(80);
      PORTB |= (1 << PB0); // HIGH
      _delay_ms(80);
      PORTB &= ~(1 << PB0); // LOW
      _delay_ms(80);
      PORTB |= (1 << PB0); // HIGH
      _delay_ms(80);
	  }

Вот приблизительно собрал код( с разных поделок). Вопросик, строка if (timer > 30 || timer < 13) что значит, не  могу понять.Я так понимаю что количество тиков при таком предделителе на одну секунду будет 18750, т.е за 1 мс количество тиков составляет 18,75.Строка  if (timer > 65000) {timer = 30;}- я правильно понимаю, что при достижении этих тиков порога 65000 отсчет тиков будет производиться заново от значения 30? Но почему от 30? И еще вопросик к знатокам,строка while (PINB & (1 << PINB1)){timer = NT0; } значит, что  когда на пине1 будет лог.1 то таймер обнуляется, т.е сигнал изменился и таймер запускается снова? После строки if (timer > 30 || timer < 13) идет выполнение того что должно вкючаться тумблером( в данном примере пищалка сигнал SOS). Вот как тиьна поймет, ели я положение тумблера переведу в положение выключено?  Установкой битов в функции MCUCR |= (1 << ISC01) | (1 << ISC00); ??

nik182
Offline
Зарегистрирован: 04.05.2015

Вот на тиньке делал для RC - два канала рулят четырьмя выходами. Логика не интересна, но всё работает.  

#define In1Pin 0
#define In2Pin 1
#define Out11Pin 2
#define Out12Pin 3
#define Out21Pin 4
#define Out22Pin 5

#define off1()     {digitalWrite(Out11Pin, LOW );digitalWrite(Out12Pin, LOW );}
#define on11()     {digitalWrite(Out11Pin, HIGH );digitalWrite(Out12Pin, LOW );}
#define on12()     {digitalWrite(Out12Pin, HIGH );digitalWrite(Out11Pin, LOW );}
#define off2()     {digitalWrite(Out21Pin, LOW );digitalWrite(Out22Pin, LOW );}
#define on21()     {digitalWrite(Out21Pin, HIGH );digitalWrite(Out22Pin, LOW );}
#define on22()     {digitalWrite(Out22Pin, HIGH );digitalWrite(Out21Pin, LOW );}

bool flf,flb;
word p,p2;
uint8_t mode;

void setup() {
   off1();
   off2();
   pinMode( Out11Pin, OUTPUT );      
   pinMode( Out12Pin, OUTPUT );      
   pinMode( Out21Pin, OUTPUT );      
   pinMode( Out22Pin, OUTPUT );      
   flf=flb=false;
   mode=1;
}

void loop() { 
while(1){
  p=pulseIn(In1Pin,HIGH,90000L); //    
  if (p<100) {  off2();   off1(); break;};
  if (p > 1550) {flf=true; flb=true; off1();mode=0;};
  switch (mode)
  {
    case 0: off1(); if ( p < 1540) mode=1; break;
    case 1: on11(); if ( p < 1440) mode=2; break;
    case 2: on11(); if ( p > 1450) mode=3; break;
    case 3: on11(); if ( p < 1440) mode=4; break;  
    case 4: on12(); if ( p > 1460) mode=3; break;  
  }
  p2=pulseIn(In2Pin,HIGH,90000L); //    ;
  if (p2<100) break;
  if ((p2 > 1200) && (p2 < 1800)) { off2();}; 
  if (p2 < 1200) { on21();}; 
  if (p2 > 1800) { on22();}; 
}
}  

 

gzp13
Offline
Зарегистрирован: 06.04.2015

Это понятно, а как сделать чтобы при пропадании сигнала от передатчика, включались например огни, т.е как поймать этот сигнал? Как я понимаю,надо ловить сигнал по длительности.