программный шим

На этом форуме Вы можете задать вопросы знатокам программы и автору.
Ответить
Аватара пользователя
alex555
Рядовой
Сообщения: 24
Зарегистрирован: 14.02.2016{, 12:24}
Репутация: 0
Откуда: москва

программный шим

#1

Сообщение alex555 » 11.04.2016{, 23:47}

Доброго времени суток. Подскажите пожалуйста как организовать программный шим в среде программирования ФЛПРОГ. Можно ли его совмещать с аппаратным шимом?

Аватара пользователя
alex555
Рядовой
Сообщения: 24
Зарегистрирован: 14.02.2016{, 12:24}
Репутация: 0
Откуда: москва

программный шим

#2

Сообщение alex555 » 21.02.2017{, 20:11}

Добрый вечер. Может кто подскажет с блоком пользователя "программный шим". Библиотекой пользовался с форума http://arduino.ru/forum/programmirovani ... bom-vyvode. Если быть точнее не библиотекой а функцией(библиотека не скачивается). Функция вставляется в новую вкладку 
#ifdef ALL
#define PIN_0
#define PIN_1
#define PIN_2
#define PIN_3
#define PIN_4
#define PIN_5
#define PIN_6
#define PIN_7
#define PIN_8
#define PIN_9
#define PIN_10
#define PIN_11
#define PIN_12
#define PIN_13
#define PIN_14
#define PIN_15
#define PIN_16
#define PIN_17
#define PIN_18
#define PIN_19
#endif

#define SBI(port, pin) asm volatile ("sbi %0, %1" :: "I" (_SFR_IO_ADDR(port)), "I" (pin))

#define CHECK(pwms, port, pin) \
asm volatile ( \
   "cpc %0, %1      \n\t" \
   "brlo 0f         \n\t" \
   "cbi %2, %3      \n\t" \
   "rjmp 1f         \n\t" \
   "0: sbi %2, %3   \n\t" \
   "1: nop          \n\t" \
   : "+r" (pwm), "+r" (pwms) \
   : "I" (_SFR_IO_ADDR(port)), "I" (pin)\
   )\
   
void Init_PWM()
{
  cli();
  TCCR2A = 0;   
  TCCR2B = 3;   //CLK
  OCR2A = 1;
  TIMSK2 = 2;   //разрешаем прерывание по совпадению
  sei();

#ifdef PIN_0
  SBI(DDRD, 0);
#endif
#ifdef PIN_1
  SBI(DDRD, 1);
#endif
#ifdef PIN_2
  SBI(DDRD, 2);
#endif
#ifdef PIN_3
  SBI(DDRD, 3);
#endif
#ifdef PIN_4
  SBI(DDRD, 4);
#endif
#ifdef PIN_5
  SBI(DDRD, 5);
#endif
#ifdef PIN_6
  SBI(DDRD, 6);
#endif
#ifdef PIN_7
  SBI(DDRD, 7);
#endif
#ifdef PIN_8
  SBI(DDRB, 0);
#endif
#ifdef PIN_9
  SBI(DDRB, 1);
#endif
#ifdef PIN_10
  SBI(DDRB, 2);
#endif
#ifdef PIN_11
  SBI(DDRB, 3);
#endif
#ifdef PIN_12
  SBI(DDRB, 4);
#endif
#ifdef PIN_13
  SBI(DDRB, 5);
#endif
#ifdef PIN_14
  SBI(DDRC, 0);
#endif
#ifdef PIN_15
  SBI(DDRC, 1);
#endif
#ifdef PIN_16
  SBI(DDRC, 2);
#endif
#ifdef PIN_17
  SBI(DDRC, 3);
#endif
#ifdef PIN_18
  SBI(DDRC, 4);
#endif
#ifdef PIN_19
  SBI(DDRC, 5);
#endif


volatile uint8_t pwm;
volatile uint8_t pwms[20];

void analog_Frequence(byte prescaler)
{
  TCCR2B = prescaler;   //CLK
}

void analog_Write(byte pin, byte value)
{
  pwms [pin]= value;
}

byte analog_State(byte pin)
{
  return pwms[pin];
}

ISR(TIMER2_COMPA_vect)
{
asm volatile ("clr %0" : "+r" (TCNT2)); // TCNT2 = 0;

#ifdef PIN_0
  CHECK(pwms[0], PORTD, 0);
#endif
#ifdef PIN_1
  CHECK(pwms[1], PORTD, 1);
#endif
#ifdef PIN_2
  CHECK(pwms[2], PORTD, 2);
#endif
#ifdef PIN_3
  CHECK(pwms[3], PORTD, 3);
#endif
#ifdef PIN_4
  CHECK(pwms[4], PORTD, 4);
#endif
#ifdef PIN_5
  CHECK(pwms[5], PORTD, 5);
#endif
#ifdef PIN_6
  CHECK(pwms[6], PORTD, 6);
#endif
#ifdef PIN_7
  CHECK(pwms[7], PORTD, 7);
#endif
#ifdef PIN_8
  CHECK(pwms[8], PORTB, 0);
#endif
#ifdef PIN_9
  CHECK(pwms[9], PORTB, 1);
#endif
#ifdef PIN_10
  CHECK(pwms[10], PORTB, 2);
#endif
#ifdef PIN_11
  CHECK(pwms[11], PORTB, 3);
#endif
#ifdef PIN_12
  CHECK(pwms[12], PORTB, 4);
#endif
#ifdef PIN_13
  CHECK(pwms[13], PORTB, 5);
#endif
#ifdef PIN_14
  CHECK(pwms[14], PORTC, 0);
#endif
#ifdef PIN_15
  CHECK(pwms[15], PORTC, 1);
#endif
#ifdef PIN_16
  CHECK(pwms[16], PORTC, 2);
#endif
#ifdef PIN_17
  CHECK(pwms[17], PORTC, 3);
#endif
#ifdef PIN_18
  CHECK(pwms[18], PORTC, 4);
#endif
#ifdef PIN_19
  CHECK(pwms[19], PORTC, 5);
#endif

asm volatile ("inc %0" : "+r" (pwm)); //pwm++;
}
Вложения
progSHIM-CODE-.ubi
(23.58 КБ) 42 скачивания

Аватара пользователя
alex555
Рядовой
Сообщения: 24
Зарегистрирован: 14.02.2016{, 12:24}
Репутация: 0
Откуда: москва

программный шим

#3

Сообщение alex555 » 21.02.2017{, 20:23}

файл ФЛПРОГ
Вложения
4211420.flp
(62.03 КБ) 42 скачивания

Аватара пользователя
alex555
Рядовой
Сообщения: 24
Зарегистрирован: 14.02.2016{, 12:24}
Репутация: 0
Откуда: москва

программный шим

#4

Сообщение alex555 » 21.02.2017{, 20:36}

Пример  получившегося  файла ARDUINO IDE/
Строчку #define PIN__126594874_2 NOMERPIN  в начале программы  надо привести к виду #define PIN_4, где 4 номер выхода шим.

Добавлено (21.02.2017, 20:36)
---------------------------------------------
Или может кто подскажет в каком направлении копать. Библиотеку какую-нибудь
Вложения
pr47.rar
(1.34 КБ) 37 скачиваний

Аватара пользователя
alex555
Рядовой
Сообщения: 24
Зарегистрирован: 14.02.2016{, 12:24}
Репутация: 0
Откуда: москва

программный шим

#5

Сообщение alex555 » 23.02.2017{, 00:30}

Получилось с горем пополам.

пользовался ресурсами форума http://arduino.ru/forum/programmirovani ... bom-vyvode
Библиотеку PWM ненашел все ссылки битые. Приходится делать новую вкладку"PWM" в скетче и вставлять 
туда    "скетчнаНОВОЙвкладкеНазываетсяPWM". Невкакую нехочет работать с функцией защиты от дребезга контактов(я подоз
реваю что дело в millis() ). Тригер ТТ работает.Впринципе если первым в программе будет включаться 
светодиод с ШИМОМ то дребезг контактов мешать не будет. Вроде как используется 2 таймер нужно это учитывать при подключении
других устройств.Можно попробывать поменять таймер в библиотеке-функции.Следует обратить внимание на #define PIN_(здесь должен быть 
номер выхода)
Вложения
0012692.ubi
(23.86 КБ) 38 скачиваний
6234096.flp
(63.24 КБ) 38 скачиваний
pr10.rar
(1.35 КБ) 40 скачиваний
6609262.txt
(1.37 КБ) 38 скачиваний
PWM.txt
(3.05 КБ) 42 скачивания

Ответить

Вернуться в «Спросить у знатоков»