Например TDA7294

Форум РадиоКот • Просмотр темы - 12f683 энкодер
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пт май 16, 2025 02:45:09

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: 12f683 энкодер
СообщениеДобавлено: Вс апр 10, 2016 10:06:44 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Чт июл 08, 2010 11:13:18
Сообщений: 187
Рейтинг сообщения: 0
Помогите, пожалуйста ,понять, почему не работает процедура опроса энкодера. Переписал код для JAL с ардуиновского скетча. На ардуине все работает. На JAL и 12f683 яркость светодиода регулируется только в одну сторону. Весь мозг сломал..
Скетч ардуино:
Спойлер
Код:
/*
** Энкодер
** Для управлением яркостью LED используется энкодер Sparkfun
*/
 
int brightness = 120;       // яркость LED, начинаем с половины
int fadeAmount = 10;        // шаг изменения яркости LED
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12;       // pin 12
const int pin_B = 11;       // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
 
void setup()  {
  // declare pin 9 to be an output:
  pinMode(9, OUTPUT);         // устанавливаем pin 9 как выход
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  currentTime = millis();
  loopTime = currentTime;
}
 
void loop()  {
  currentTime = millis();
  if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)
    encoder_A = digitalRead(pin_A);     // считываем состояние выхода А энкодера
    encoder_B = digitalRead(pin_B);     // считываем состояние выхода B энкодера   
    if((!encoder_A) && (encoder_A_prev)){    // если состояние изменилось с положительного к нулю
      if(encoder_B) {
        // выход В в полож. сост., значит вращение по часовой стрелке
        // увеличиваем яркость, не более чем до 255
        if(brightness + fadeAmount <= 255) brightness += fadeAmount;               
      }   
      else {
        // выход В в 0 сост., значит вращение против часовой стрелки     
        // уменьшаем яркость, но не ниже 0
        if(brightness - fadeAmount >= 0) brightness -= fadeAmount;               
      }   
 
    }   
    encoder_A_prev = encoder_A;     // сохраняем значение А для следующего цикла
     
    analogWrite(9, brightness);   // устанавливаем яркость на 9 ножку
   
    loopTime = currentTime;
  }                       
}

Мой код на JAL:
Спойлер
Код:
-- target PICmicro
include 12f683
pragma target CLOCK    4_000_000
pragma target OSC      INTOSC_NOCLKOUT
pragma target WDT      disabled
pragma target MCLR     internal                  -- reset on pin A3
pragma target WDT      DISABLED                  -- watchdog
pragma target BROWNOUT DISABLED                  -- brownout reset
pragma target FCMEN    DISABLED                  -- clock monitoring
pragma target IESO     DISABLED                  -- int/ext osc. switch
--
enable_digital_io()                              -- make all pins digital I/O
--OPTION_REG_NGPPU = 0                           -- pull-ups ON
OSCCON_SCS = 0                                   -- select primary oscillator
OSCCON_IRCF = 0b110                              -- 4 MHz
--
-- setting pins

alias   enc_b           is pin_A5
 pin_A5_direction = input

alias   enc_a           is pin_A4       --энкодер на 2 и 3 ноге
 pin_A4_direction = input

-- configure PWM
pin_ccp1_direction = output
include pwm_hardware
pwm_max_resolution(1)              --включили ШИМ на 5й ноге
pwm1_on()

-- timer setup
const TIMER0_ISR_RATE = 1000  -- 1 kHz isr rate
const DELAY_SLOTS = 1         -- support slots
include timer0_isr_interval
timer0_isr_init()             -- теперь мы можем отслеживать миллисекунды

--setting variables
var byte pwm
var bit old_a
--
pwm = 0
pwm1_set_dutycycle_percent(pwm)   --светодиод не светится

forever loop

if check_delay(0) then       --если таймер нащелкал 5мсек
 set_delay(0, 5)                --устанавливем новый интервал

 if old_a & !enc_a then          --если старое значение А высокое а новое низкое,тогда проверяем В
   if enc_b then
    if pwm!=254 then pwm = pwm + 1 end if    --если В в высоком, то увеличиваем яркость
   end if
   if !enc_b then
    if pwm!=0 then pwm = pwm - 1 end if           --если В в низком, то уменьшаем яркость
   end if
 pwm1_set_dutycycle_percent(pwm)
 end if

old_a = enc_a       --запомнили значение входа А
end if

end loop


Код Ридико видел,но в АВР не силен совершенно, не смогу перевести в JAL, не понимаю, что он там делает, синтаксис совершенно непонятен. Если можно, объясните на пальцах алгоритм. Насколько я понял, в коде Ридико запоминаются предыдущее и предпредыдущее состояния?
Собственно, код:
Спойлер
Код:
//!**************************************************
//! Файл     : button_enc.h
//! Авторское право (с)  :
//! Разработка     :
//! Дата создания  :
//! Описание   
//!   
//!**************************************************
#ifndef __button_enc_H__
#define __button_enc_H__

typedef enum {NULL_ENC=0,PLUS_ENC,MINUS_ENC}REZ_ENC;
extern void Encoder_Init(void);
extern REZ_ENC  Encoder_Exe(void);
#endif // __button_enc_H__

//!**************************************************
//! Файл     : button_enc.c
//! Авторское право (с)  :
//! Разработка     : Ридико Л.И.
//! Модифицировал       :
//! Разработка     :
//! Дата создания  :
//! Описание   
//!   
//!**************************************************
#include "button_enc.h"
#include "hard_config.h"

//---------- Константы: ----------
enum { State0, StateA, StateB, StateAB }; //состояния энкодера
//---------- Переменные: ----------
static char EncPrev;      //предыдущее состояние энкодера
static char EncPrevPrev;  //пред-предыдущее состояние энкодера
//---------- Инициализация энкодера: ----------

void Encoder_Init(void)
{
 EncPrev = State0;       //инициализация предыдущего состояния
 EncPrevPrev = State0;   //инициализация пред-предыдущего состояния
}

//---------- Обработка энкодера: ----------

REZ_ENC Encoder_Exe(void)
{
 char EncCur = 0;
 
 REZ_ENC cRezEnc=NULL_ENC;
 
 if(!Pin_ENC_F1) {EncCur  = StateA;} //опрос фазы 1 энкодера
 if(!Pin_ENC_F2) {EncCur |= StateB;} //опрос фазы 2 энкодера
 if(EncCur != EncPrev)             //если состояние изменилось,
 {
   if(EncPrev == StateAB &&        //если предыдущее состояние StateAB
      EncCur != EncPrevPrev )      //и текущее и пред-предыдущее не равны,
   {
      if(EncCur == StateB) {cRezEnc=PLUS_ENC;}
      else{ cRezEnc=MINUS_ENC;}
   }
   EncPrevPrev = EncPrev;          //сохранение пред-предыдущего состояния
   EncPrev = EncCur;               //сохранение предыдущего состояния
 }
 return cRezEnc;
}


Энкодер китайский с Али,в промежуточном состоянии обе ноги "в воздухе"


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: 12f683 энкодер
СообщениеДобавлено: Вс апр 10, 2016 21:54:00 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Чт июл 08, 2010 11:13:18
Сообщений: 187
Рейтинг сообщения: 0
Разобрался. Увеличил частоту процессора до 8Мгц и уменьшил частоту опроса до 1мсек, все закудахтало. Очевидно,не хватает ресурсов.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: 12f683 энкодер
СообщениеДобавлено: Пн апр 11, 2016 10:22:56 
Сверлит текстолит когтями
Аватар пользователя

Зарегистрирован: Сб июл 11, 2009 18:42:21
Сообщений: 1135
Откуда: Украина, г.Николаев
Рейтинг сообщения: 0
Я бы сделал прерывание (external interrupt) на эту ногу (по ниспадающему или возрастающему фронту, ХЗ какой энкодер), чтобы просто в главной было while(1). Можно ещё код немного оптимизировать. К примеру, вместо ф-ций

Код:
analogWrite(9, brightness);

записывать просто PORTXbits.RXY=1;

с

Код:
 encoder_A = digitalRead(pin_A);     // считываем состояние выхода А энкодера
    encoder_B = digitalRead(pin_B);     // считываем состояние выхода B энкодера   


аналогично. Про асм не говорю, это уже совсем хардкор.

Ну и кварц до 20Мгц внешний этот МК поддерживает.


Ваще я бы немого иначе сделал обработку.

Как-то так.


Состояние энкодера изменилось-->ext_int прерывание-->сбросить флаги-->определить направление-->счётчик крутилки-->крутилку не трогают, навскидку, 20мс?-->изменить яркость.

_________________
Успех - императив!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: 12f683 энкодер
СообщениеДобавлено: Пн апр 11, 2016 15:51:17 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2916
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 23681
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
http://www.microchip.su/showpost.php?p= ... stcount=32


Вернуться наверх
 
Открыт интернет-магазин MEAN WELL.Market – весь ассортимент MEAN WELL, выгодные цены

Открыта удобная площадка с выгодными ценами, поставляющая весь ассортимент продукции, производимой компанией MEAN WELL – от завоевавших популярность и известных на рынке изделий до новинок. MEAN WELL.Market предоставляет гарантийную и сервисную поддержку, удобный подбор продукции, оперативную доставку по России. На сайте интернет-магазина посетители смогут найти обзоры, интересные статьи о применении, максимальный объем технических сведений.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: 12f683 энкодер
СообщениеДобавлено: Пн апр 11, 2016 18:08:16 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Чт июл 08, 2010 11:13:18
Сообщений: 187
Рейтинг сообщения: 0
Тут обнаружилось,что в Джале фигово реализованы прерывания =( всю работу по сохранению регистров и прочий лабутенах предполагается делать программисту в блоках, написанных на асме. Понятно, что первое, что я сделал, когда горшок таки начал варить, это попробовал провернуть тот же алгоритм, используя прерывания,для меня это новая непознанная тема. Как ни плясал,ничего не получается. Отладки как таковой не предусмотрено, прерывания работают(проверял с режимом сна), если есть forever loop с какой-либо полезной нагрузкой, ничего не пашет,значение переменной заполнения ШИМ не изменяется.
Код с прерываниями:
Спойлер
Код:
-- target PICmicro
include 12f683
pragma target CLOCK    8_000_000
pragma target OSC      INTOSC_NOCLKOUT
pragma target WDT      disabled
pragma target MCLR     internal                  -- reset on pin A3
pragma target WDT      DISABLED                  -- watchdog
pragma target BROWNOUT DISABLED                  -- brownout reset
pragma target FCMEN    DISABLED                  -- clock monitoring
pragma target IESO     DISABLED                  -- int/ext osc. switch
--
OSCCON_SCS = 0                                   -- select primary oscillator
OSCCON_IRCF = 0b111                              -- 8 MHz
enable_digital_io()                              -- make all pins digital I/O
-- setting pins

alias   enc_b           is pin_A5
 pin_A5_direction = input

alias   enc_a           is pin_A4
 pin_A4_direction = input
 
alias   led           is pin_A2
 pin_A2_direction = output
led = off

OPTION_REG_NGPPU = 0   --\
WPU_WPU4 = 1           -- подтяжка
WPU_WPU5 = 1           --/
IOC_IOC5 = 1 --разрешаем прерывание
OPTION_REG_INTEDG = 0      -- прерывание по переходу в низкий уровень
INTCON_GIE = on          -- глобальное разрешение прерываний
INTCON_GPIF = off         -- снимаем флаг прерывания по GPIO
--

--setting variables
var byte pwm_cnt, pwm = 10
--

procedure interrupt is      -- обработчик прерывания по нажатию кнопки
pragma interrupt
 if INTCON_GPIF then         -- снимаем флаг прерывания по GPIO
  INTCON_GPIF = off
  INTCON_GPIE = off         -- запрещаем  прерывания по GPIO

  if enc_a then
    if pwm!=254 then pwm = pwm + 1 end if
   else
    if pwm!=0 then pwm = pwm - 1 end if
   end if
   
 INTCON_GPIE = on         -- разрешаем  прерывания по GPIO
 end if
end procedure

forever loop
  pwm_cnt = pwm_cnt + 1   --когда дотикает до 255,само станет нулем
  if pwm_cnt < pwm then led = on else led = off end if
end loop


Вернуться наверх
 
LED-драйверы MOSO - надежные решения для индустриальных приложений

Продукция MOSO предназначена в основном для индустриальных приложений, использует инновационные решения на основе более 200 собственных патентов для силовой электроники и соответствует международным стандартам. LED-драйверы MOSO применяются в системах наружного освещения разных отраслей, включая промышленность, сельское хозяйство, транспорт и железную дорогу. В ряде серий реализована возможность дистанционного контроля и программирования работы по заданному сценарию. Разберем решения MOSO подробнее>>
Не в сети
 Заголовок сообщения: Re: 12f683 энкодер
СообщениеДобавлено: Вт апр 12, 2016 07:30:27 
Сверлит текстолит когтями
Аватар пользователя

Зарегистрирован: Сб июл 11, 2009 18:42:21
Сообщений: 1135
Откуда: Украина, г.Николаев
Рейтинг сообщения: 0
ask3t
Меняйте компилятор :) . Если в этом не отладки, то он и даром не нужен. Тут помочь проблематично, т.к. похоже грабли именно в нём.

_________________
Успех - императив!


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: 12f683 энкодер
СообщениеДобавлено: Вт апр 12, 2016 12:10:04 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Чт июл 08, 2010 11:13:18
Сообщений: 187
Рейтинг сообщения: 0
Посоветуйте что-нибудь. Лично я склоняюсь к Микропаскалю, потому как есть кое-какой опыт программирования в Делфях. АСМ не осилю, слишком жестко. По Си нужна хорошая обучалка, потому как конструкции этого языка вгоняют меня в ступор.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: 12f683 энкодер
СообщениеДобавлено: Вт апр 12, 2016 14:24:08 
Вымогатель припоя

Карма: -3
Рейтинг сообщений: 77
Зарегистрирован: Сб мар 19, 2011 15:19:47
Сообщений: 546
Откуда: Владивосток
Рейтинг сообщения: 0
В защиту С, C++
Учился на фортране, на перфокартах.))))
Спустя много лет, может и не оптимально, но пишу на С микроконтроллеры.
И кажется все очень просто.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: 12f683 энкодер
СообщениеДобавлено: Вт апр 12, 2016 14:45:20 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Чт июл 08, 2010 11:13:18
Сообщений: 187
Рейтинг сообщения: 0
const1105 писал(а):
В защиту С, C++
И кажется все очень просто.

Есть какое-нибудь толковое руководство для нубаса? По идее, в МК нет ничего сложного в плане программирования по определению, ибо почти все заточено под дерганье ногами. Но синтаксис...синтаксис мне кажется очень специфическим,так скажем.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: 12f683 энкодер
СообщениеДобавлено: Вт апр 12, 2016 16:39:44 
Сверлит текстолит когтями
Аватар пользователя

Зарегистрирован: Сб июл 11, 2009 18:42:21
Сообщений: 1135
Откуда: Украина, г.Николаев
Рейтинг сообщения: 0
гугл в помощь. на паскале народ тоже пишет весьма прилично. просто найти нормальный компилятор с отладкой и другими няхами.

_________________
Успех - императив!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: 12f683 энкодер
СообщениеДобавлено: Вт апр 12, 2016 21:38:04 
Друг Кота
Аватар пользователя

Карма: 55
Рейтинг сообщений: 389
Зарегистрирован: Чт мар 20, 2008 01:06:40
Сообщений: 3230
Откуда: Севастополь
Рейтинг сообщения: 0
Спойлер... а в поддержку асма : ИК-приемник RC5/RC6 с энкодером для регулятора громкости + эмулятор PS/2-клавиатуры.
Все это влезало в память старого PIC12F629 и нормально работало на 4MHz.

_________________
>(*.*)<
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: 12f683 энкодер
СообщениеДобавлено: Ср апр 13, 2016 03:58:39 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2916
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 23681
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
ask3t писал(а):
в МК нет ничего сложного в плане программирования по определению, ибо почти все заточено под дерганье ногами. Но синтаксис...синтаксис мне кажется очень специфическим,так скажем.

Вы заблуждаетесь про "дерганье ногами".
Это все равно как говорить про любое человеческое умение. Дело не в дерганье. А в РЕЗУЛЬТАТЕ этого дерганья.
Можно дергать пинами разъема HDMI и получить на экране тупую заставку, можно вращающуюся фигуру, а можно блокбастер с миллионными просмотрами.
И все это можно свести к "дерганью".
Си и его синтаксис легко осваивается и ПОНИМАЕТСЯ, если понимаешь АРХИТЕКТУРУ микроконтроллера.
Понимаешь почему она именно такая, а не иная.
Тогда, кстати и АСМ становится родным.
ЗЫ. Чуть выше по теме я привел ответ на Ваш вопрос. Завершенный ответ.
Откройте ссылку и получите Си код и его прототип в АСМе.
Это даже не потребует знания Си.
Конструкции там очень простые.
ЗЗЫ. Подключение механического энкодера не требует использования прерываний. Как и подключение кнопки. Это все интерфейсы НЕ РЕАЛЬНОГО ВРЕМЕНИ.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: 12f683 энкодер
СообщениеДобавлено: Ср апр 13, 2016 07:14:28 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Чт июл 08, 2010 11:13:18
Сообщений: 187
Рейтинг сообщения: 0
Спойлер
КРАМ писал(а):
ask3t писал(а):
в МК нет ничего сложного в плане программирования по определению, ибо почти все заточено под дерганье ногами. Но синтаксис...синтаксис мне кажется очень специфическим,так скажем.

Вы заблуждаетесь про "дерганье ногами".
Это все равно как говорить про любое человеческое умение. Дело не в дерганье. А в РЕЗУЛЬТАТЕ этого дерганья.
Можно дергать пинами разъема HDMI и получить на экране тупую заставку, можно вращающуюся фигуру, а можно блокбастер с миллионными просмотрами.
И все это можно свести к "дерганью".
Си и его синтаксис легко осваивается и ПОНИМАЕТСЯ, если понимаешь АРХИТЕКТУРУ микроконтроллера.
Понимаешь почему она именно такая, а не иная.
Тогда, кстати и АСМ становится родным.
ЗЫ. Чуть выше по теме я привел ответ на Ваш вопрос. Завершенный ответ.
Откройте ссылку и получите Си код и его прототип в АСМе.
Это даже не потребует знания Си.
Конструкции там очень простые.
ЗЗЫ. Подключение механического энкодера не требует использования прерываний. Как и подключение кнопки. Это все интерфейсы НЕ РЕАЛЬНОГО ВРЕМЕНИ.

Согласен,с упрощением перебрал. Буду изучать Си, что ж еще поделать. Спасибо, что тратите свое время на разъяснение прописных истин нубасам =)


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y