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

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

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

Сообщение alex555 »

Доброго времени суток. Подскажите пожалуйста как организовать программный шим в среде программирования ФЛПРОГ. Можно ли его совмещать с аппаратным шимом?
Аватара пользователя
alex555
Рядовой
Сообщения: 24
Зарегистрирован: 14 фев 2016, 12:24
Откуда: москва

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

Сообщение alex555 »

Добрый вечер. Может кто подскажет с блоком пользователя "программный шим". Библиотекой пользовался с форума 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++;
}
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
alex555
Рядовой
Сообщения: 24
Зарегистрирован: 14 фев 2016, 12:24
Откуда: москва

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

Сообщение alex555 »

файл ФЛПРОГ
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
alex555
Рядовой
Сообщения: 24
Зарегистрирован: 14 фев 2016, 12:24
Откуда: москва

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

Сообщение alex555 »

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

Добавлено (21.02.2017, 20:36)
---------------------------------------------
Или может кто подскажет в каком направлении копать. Библиотеку какую-нибудь
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
alex555
Рядовой
Сообщения: 24
Зарегистрирован: 14 фев 2016, 12:24
Откуда: москва

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

Сообщение alex555 »

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

пользовался ресурсами форума http://arduino.ru/forum/programmirovani ... bom-vyvode
Библиотеку PWM ненашел все ссылки битые. Приходится делать новую вкладку"PWM" в скетче и вставлять 
туда    "скетчнаНОВОЙвкладкеНазываетсяPWM". Невкакую нехочет работать с функцией защиты от дребезга контактов(я подоз
реваю что дело в millis() ). Тригер ТТ работает.Впринципе если первым в программе будет включаться 
светодиод с ШИМОМ то дребезг контактов мешать не будет. Вроде как используется 2 таймер нужно это учитывать при подключении
других устройств.Можно попробывать поменять таймер в библиотеке-функции.Следует обратить внимание на #define PIN_(здесь должен быть 
номер выхода)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Ответить

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

Кто сейчас на конференции

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