Большой Воронежский Форум

Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел.
Вернуться   Большой Воронежский Форум » Компьютеры и все, что с ними связано » »Радиолюбитель
Программирование микроконтролеров,ремонт аудио/видео/бытовой техники,полезные устройства для дома,телефония, обсуждение статей журнала Радио

Ответ
 
Опции темы
Старый 21.04.2016, 10:44   #1201   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Ардуина в данной теме совсем не к месту! Не надо!
  Ответить с цитированием
Старый 21.04.2016, 14:19   #1202   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от Vdmit Посмотреть сообщение
Хотел бы от Вас ещё такой же урок с АЦП . Какой-нибудь незамысловатый пример от уровня напряжения на какой-нибудь ноге . Спасибо !
Код для PIC12F683 (просто он в железе запаян был, а 675 надо было паять, суть та же).
Алгоритм: АЦП меряет напряжение на GP1 и в зависимости от напряжения меняет скважность ШИМ, соответственно меняется яркость свечения светодиода.


Код:
unsigned short Period, Pulse, value;

void interrupt ()
{
 static unsigned short count = 0;
 
 if(T0IF_bit)
  {
    count++;
    if(count < Period){
     if (count < Pulse)
      GP0_bit = 1;
     else
      GP0_bit = 0;
     }
    else {
      count = 0;
      GP0_bit = 1;
     }
    T0IF_bit = 0;
  }
}
void main() {
     ANSEL  = 0x00;
     ADCON0 = 0x00;
 
     // GP1 (AN1) - midle pin resistor 10 kOm
     TRISIO1_bit = 1;           // GP1 input
     // set ADC
     ADCS1_bit = 1; 	        // internal oscillator RC for ADC
     ADCS0_bit = 1;
     ADFM_bit  = 0;      	// Left adj
     CHS0_bit = 1;              // AN1 chanel select
     ANS1_bit  = 1;		// AN1 analog input
     ADON_bit = 1;              // on ADC
     // GP0 connect LED
     TRISIO0_bit = 0;
     GP0_bit = 0;
     // set TMR0
     OPTION_REG = 0x88;
     // on interrupt
     T0IE_bit = 1;
     GIE_bit = 1;
     
     Period = 64;
     Pulse = 1;
     
     for(;;){
       GO_DONE_bit = 1;                     // Start ADC
       while (GO_DONE_bit) continue;
       value = ADRESH>>2;
       Pulse = value;
     }
}
  Ответить с цитированием
Старый 03.05.2016, 16:34   #1203   
Форумец
 
Сообщений: 2
Регистрация: 06.09.2015
Возраст: 43

MuShu вне форума Не в сети
Здравствуйте! Имеется трехфазный двигатель 34 вольта 300 герц. Хочу попробовать написать программку на PIC16F1823 для управления этим мотором. Я так понимаю надо 3 программных шим регулятора с коэффициентом заполнения 5-50 смещенных по фазе на 120градусов (1/3). Если пример программного шим я нашел и сейчас изучаю, то вот как организовать их синхронную работу не могу понять.
Пример шим
Код:
// LED RGB module connections
sbit RED1 at RA0_bit;
sbit GREEN1 at RA1_bit;
sbit BLUE1 at RA2_bit;
sbit RED1_Direction at TRISA0_bit;
sbit GREEN1_Direction at TRISA1_bit;
sbit BLUE1_Direction at TRISA2_bit;

int i = 0 ,PWN_COUNTER = 256;

void PWM_FADE_0_TO_1(void);
void PWM_FADE_1_TO_0(void);
void Delay(int num);

void main(void)
{

 TRISA = 0;
 PORTA = 0;


 while(1){
          PWM_FADE_0_TO_1();
          PWM_FADE_1_TO_0();
          }
}

void PWM_FADE_0_TO_1(void)        // Duty cycle -  0%  to  100%
{
 for (i = 0; i < PWN_COUNTER; i++)
 {
  RED1 = 0;

  Delay(PWN_COUNTER - i);
  RED1 = 1;

  Delay(i);
  }
 for (i = 0; i < PWN_COUNTER; i++)
 {
  GREEN1 = 0;

  Delay(PWN_COUNTER - i);
  GREEN1 = 1;

  Delay(i);
  }
 for (i = 0; i < PWN_COUNTER; i++)
 {
  BLUE1 = 0;

  Delay(PWN_COUNTER - i);
  BLUE1 = 1;

  Delay(i);
  }
}

void PWM_FADE_1_TO_0(void)         // Duty cycle -  100% to 0%
{
 for (i = 0; i < PWN_COUNTER; i++)
 {
  RED1 = 1;

  Delay(PWN_COUNTER - i);
  RED1 = 0;

  Delay(i);
  }
 for (i = 0; i < PWN_COUNTER; i++)
 {
  GREEN1 = 1;

  Delay(PWN_COUNTER - i);
  GREEN1 = 0;

  Delay(i);
  }
 for (i = 0; i < PWN_COUNTER; i++)
 {
  BLUE1 = 1;

  Delay(PWN_COUNTER - i);
  BLUE1 = 0;

  Delay(i);
  }
}

void Delay(int num)
{
 while(num>0)
 num--;
}
Не знаю насколько оптимальный код, но на практике работает.
PS: Шим не тот... Буду изучать прерывания... Этот работает на одних задержках. Дайте совет как написать шим на прерываниях.

Последний раз редактировалось MuShu; 03.05.2016 в 18:10. Причина: зы
  Ответить с цитированием
Старый 22.09.2016, 20:29   #1204   
Registered User
 
Аватар для romchik77
 
Сообщений: 391
Регистрация: 16.11.2008

romchik77 вне форума Не в сети
Здравствуйте. Можно ли Pickit2 прошить 25Q64BS или все таки искать другой.
  Ответить с цитированием
Старый 22.09.2016, 21:38   #1205   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от romchik77 Посмотреть сообщение
Можно ли Pickit2 прошить 25Q64BS
Нет, нельзя.
Цитата:
Сообщение от romchik77 Посмотреть сообщение
или все таки искать другой.
SPI FlashROM Programmer http://rayer.g6.cz/programm/programe.htm. Все очень просто. Шил им W25Q32.
  Ответить с цитированием
Старый 22.09.2016, 22:40   #1206   
Registered User
 
Аватар для romchik77
 
Сообщений: 391
Регистрация: 16.11.2008

romchik77 вне форума Не в сети
petrd, может тогда на алике заказать https://ru.aliexpress.com/item/CH341...a-89aeda2f3334
Спасибо Вам petrd
  Ответить с цитированием
Старый 19.02.2017, 18:44   #1207   
Форумец
 
Сообщений: 17
Регистрация: 19.02.2017
Возраст: 59

ra9cim вне форума Не в сети
Доброго времени суток.
Подскажите пож, тема ещё жива или как? Есть несколько вопросов.
  Ответить с цитированием
Старый 19.02.2017, 20:28   #1208   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от ra9cim Посмотреть сообщение
Доброго времени суток.
Подскажите пож, тема ещё жива или как? Есть несколько вопросов.
Задавайте!
  Ответить с цитированием
Старый 19.02.2017, 22:05   #1209   
Форумец
 
Сообщений: 17
Регистрация: 19.02.2017
Возраст: 59

ra9cim вне форума Не в сети
Необходимо сделать аспирационную систему. В ней сначала запускается вытяжка, а через 10 сек. включается наждак. Обратно также, только задержка после отключения наждака составляет 5 сек. Решил сделать на пике, но некоторые места не устраивают.
Код:
#define On button(&porta,1,10,0)
#define Off button(&porta,0,10,0)
unsigned short state;

void Start(){
 state=1;
 portb=0x01;
 delay_ms(10000); // задержка включения наждака
 portb=0x81;
}
void Stop(){
 state=0;
 portb=0x01;
 delay_ms(5000); // задержка отключения вытяжки
 portb=0;
}
void Init(){
 CMCON=7;
 OPTION_REG = 0x87;
 INTCON.T0IE=1;
 INTCON.GIE=1;
 trisa=0xe7;
 trisb=0;
 portb=0;
 state=0;
}// Init

void main(){
 init();
 while(1){
  if (Off){
   if (state!=0){
    Stop();
   }
  }
  else{
   if (On){
    Start();
   }
  }
 }
}
Чем заменить данные задержки. Вместо delay_ms что можно использовать, а то получается, что при нажатии Пуск и до запуска наждака систему невозможно остановить. Кнопка Стоп не срабатывает, т.к. проц отрабатывает задержку и не реагирует. Больше волнует задержка на включение.
Заранее спасибо.
  Ответить с цитированием
Старый 19.02.2017, 22:29   #1210   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
ИМХО надо применить стейт-машину (автомат состояний) обычно для этого применяется switch....case, а задержки делать на прерываниях от таймера.
  Ответить с цитированием
Старый 19.02.2017, 23:03   #1211   
Форумец
 
Аватар для DimYch
 
Сообщений: 5,631
Регистрация: 22.03.2003

DimYch вне форума Не в сети
Цитата:
Сообщение от petrd Посмотреть сообщение
ИМХО надо применить стейт-машину (автомат состояний) обычно для этого применяется switch....case, а задержки делать на прерываниях от таймера.
можно проще
пишем свою процедуру delay5s
которая просто в цикле делает проверку нажатия кнопки стоп,
зная время выполнения проверки, высчитывается кол-во вложенных циклов для осуществления нужной задержки.

Таким образом получим что даже во время выполнения delay кнопка стоп всегда сработает без задержек! не нужно никаких прерываний.
  Ответить с цитированием
Старый 20.02.2017, 03:56   #1212   
Форумец
 
Сообщений: 17
Регистрация: 19.02.2017
Возраст: 59

ra9cim вне форума Не в сети
Спасибо, буду пробовать варианты.
  Ответить с цитированием
Старый 20.02.2017, 22:28   #1213   
Форумец
 
Сообщений: 17
Регистрация: 19.02.2017
Возраст: 59

ra9cim вне форума Не в сети
Доброго времени суток.
Пошёл по наименьшему сопротивлению, не стал сильно усложнять, понравилась подсказка по замене delay_ms(), сам примерно думал что-то подобное, но в голове вырисовывался текст на кучу строк с переписыванием почти половины программы. В итоге в процедуре Start() сделал цикл и оказалось всё намного проще.
Код:
void Start(){
 state=1;
 delay=0;
 portb=0x01;
 do{
  if (Off){
   return;
  }
  delay_ms(10);
  delay++;
 } while(delay<1000);
 portb=0x81;
}
  Ответить с цитированием
Старый 13.03.2017, 16:31   #1214   
Registered User
 
Аватар для romchik77
 
Сообщений: 391
Регистрация: 16.11.2008

romchik77 вне форума Не в сети
День добрый!
FlowCode - универсальная среда разработки и не только Pic и особенно для новичка
  Ответить с цитированием
Старый 19.08.2017, 18:40   #1215   
Форумец
 
Сообщений: 7
Регистрация: 19.08.2017
Возраст: 38

Aleksandr1111 вне форума Не в сети
petrd, в посте #33 (стр.2 темы) Вы написали,что максимальная задержка,которую можно получить с помощью таймера TMR0 и предделителя,равна примерно 66,304 мс. Но,если предделитель делит на 256,и таймер обнуляется на 256-м импульсе,то максим.задержка получается 256*256=65536 мкс при тактовой 4 МГц? Или как?
  Ответить с цитированием
Старый 20.08.2017, 08:48   #1216   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от Aleksandr1111 Посмотреть сообщение
petrd, в посте #33 (стр.2 темы) Вы написали,что максимальная задержка,которую можно получить с помощью таймера TMR0 и предделителя,равна примерно 66,304 мс. Но,если предделитель делит на 256,и таймер обнуляется на 256-м импульсе,то максим.задержка получается 256*256=65536 мкс при тактовой 4 МГц? Или как?
Да, все верно. Сейчас сам не понимаю, почему тогда так сказал.
  Ответить с цитированием
Старый 20.08.2017, 10:04   #1217   
Форумец
 
Сообщений: 7
Регистрация: 19.08.2017
Возраст: 38

Aleksandr1111 вне форума Не в сети
petrd, объясните,пожалуйста: когда выводят заданную цифру ch (переменная unsigned char) на lcd дисплей, пишут: Lcd_Chr_CP(48+ch); Зачем нужно прибавлять 48?
И еще: в хелпе к микроС, в библиотеке ADC (АЦП) говорится:
This routine initializes PIC’s internal ADC module to work with RC clock. -т.е. с RC тактовым генератором? Но эту библиотеку же используют и при кварцевом такт.генераторе?

Последний раз редактировалось Aleksandr1111; 20.08.2017 в 10:21.
  Ответить с цитированием
Старый 20.08.2017, 11:12   #1218   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от Aleksandr1111 Посмотреть сообщение
когда выводят заданную цифру ch (переменная unsigned char) на lcd дисплей, пишут: Lcd_Chr_CP(48+ch); Зачем нужно прибавлять 48?
потому что в этой функции в скобках надо писать код символа ASCII, а не просто цифру, т.е. для вывода символа цифры "0" надо написать
Lcd_Chr_CP('0');
А кода ASCII цифр от 0-9 это 48-57 (в десятичной системе), т.е.
Lcd_Chr_CP('9');
Lcd_Chr_CP(9+48);
это одно и тоже, если написать
a = '2'+'3', то а будет равняться 101, а не 5.
Цитата:
И еще: в хелпе к микроС, в библиотеке ADC (АЦП) говорится:
This routine initializes PIC’s internal ADC module to work with RC clock. -т.е. с RC тактовым генератором? Но эту библиотеку же используют и при кварцевом такт.генераторе?
Имеется ввиду не тактовый генератор МК, а внутренний RC генератор модуля ADC.
  Ответить с цитированием
Старый 20.08.2017, 13:13   #1219   
Форумец
 
Сообщений: 7
Регистрация: 19.08.2017
Возраст: 38

Aleksandr1111 вне форума Не в сети
petrd, спасибо большое, вроде разобрался теперь. А то у Шпака тоже никакого объяснения насчет +48. Получается,писать ch+48 удобно,когда надо выводить по одной цифре,так,наверно
  Ответить с цитированием
Старый 01.09.2017, 20:03   #1220   
Форумец
 
Сообщений: 7
Регистрация: 19.08.2017
Возраст: 38

Aleksandr1111 вне форума Не в сети
petrd, скажите, пожалуйста: у меня в программе на Си есть функция,в которой 4 переменных. Почему при отладке в Протеусе, да и в mikroC, я не могу найти в списке переменных эти переменные? Есть только глобальные.
И еще: в mikroC при отладке таймеры должны могут менять свое состояние?

P.S. С таймерами я понял - в helpe указано, что они не обновляются, а с переменными...

Последний раз редактировалось Aleksandr1111; 01.09.2017 в 21:06.
  Ответить с цитированием
Старый 01.09.2017, 21:40   #1221   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от Aleksandr1111 Посмотреть сообщение
petrd, скажите, пожалуйста: у меня в программе на Си есть функция,в которой 4 переменных. Почему при отладке в Протеусе, да и в mikroC, я не могу найти в списке переменных эти переменные? Есть только глобальные.
И еще: в mikroC при отладке таймеры должны могут менять свое состояние?

P.S. С таймерами я понял - в helpe указано, что они не обновляются, а с переменными...
Локальные переменные создаются только на время жизни функции, поэтому компилятор на этапе компиляции их может соптимизировать и увидеть их будет проблематично. Поэтому на время отладки их можно сделать volatile и тогда они будут видны.
А симулятор у них убогий.
  Ответить с цитированием
Старый 04.09.2017, 14:29   #1222   
Форумец
 
Сообщений: 7
Регистрация: 19.08.2017
Возраст: 38

Aleksandr1111 вне форума Не в сети
petrd, написАл volatile unsigned A, B, и т.д., но почему-то этих переменных все равно нет в списке. Эта отладка, честно говоря, что-то совсем не получается, исходный код почему-то тоже пропадает (в протеусе), пишет No source line at PC address [PC=nnnn].Но зато мое устройство хоть как-то наконец заработало )
  Ответить с цитированием
Старый 04.09.2017, 21:13   #1223   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от Aleksandr1111 Посмотреть сообщение
petrd, написАл volatile unsigned A, B, и т.д., но почему-то этих переменных все равно нет в списке. Эта отладка, честно говоря, что-то совсем не получается, исходный код почему-то тоже пропадает (в протеусе), пишет No source line at PC address [PC=nnnn].Но зато мое устройство хоть как-то наконец заработало )


Про Протеус не говорите даже ничего.
Смотрите, например. Добавляю в прерывание переменную volatile unsigned short test; и в окне Watch вижу эту переменную. Можно искать по ассемблерному имени interrupt_test_LO
Миниатюры
Нажмите на изображение для увеличения
Название: ScreenShot.png
Просмотров: 24
Размер:	147.4 Кб
ID:	2944449  
  Ответить с цитированием
Старый 14.09.2017, 23:03   #1224   
Форумец
 
Сообщений: 7
Регистрация: 19.08.2017
Возраст: 38

Aleksandr1111 вне форума Не в сети
petrd, У меня в программе есть функция void receive_rf_packet(void), в ней есть массив rx_dat[6], в котором сохраняются принятые байты некоторой информации (они должны будут приниматься по радиоканалу)( в одном пакете принимается 6 байт) от другого МК. В эту функцию я попытался ввести проверку, правильно ли приняты байты:
if ((rxdat[0] != rxdat[2]) || (rxdat[1] != rxdat[3]) || (rxdat[0] != rxdat[4]) || (rxdat[1] != rxdat[5]))
{
Errid = 1;//идентификатор ошибки
}

Т.е., 0-ой элемент массива должен быть равен 2-му, 1-ый - 3-му, и т.д. Но почему-то это условие не проходит, программа, похоже, зависает. Когда я убрал эти строки, все заработало. В чем тут может быть дело? Или тут надо смотреть весь код?
  Ответить с цитированием
Старый 15.09.2017, 10:02   #1225   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от Aleksandr1111 Посмотреть сообщение
Но почему-то это условие не проходит, программа, похоже, зависает. Когда я убрал эти строки, все заработало.
Этот код не блокирующий, он не должен по определению ничего повесить.
Смотрите в каком месте Errid используется, там и ищите. А, вообще, эти вещи нужно отладчиком смотреть.
  Ответить с цитированием
Старый 06.10.2017, 23:44   #1226   
Форумец
 
Сообщений: 7
Регистрация: 19.08.2017
Возраст: 38

Aleksandr1111 вне форума Не в сети
petrd, здравствуйте! Подскажите, пожалуйста: имеется unsigned char R[0] (элемент массива) и signed long T;
Далее пишем:
T = R[0];
Происходит ли здесь приведение типов? Или R так и остается unsigned char, а T остается signed long? Хотя в хелпе по микроСи сказано, что "Результат выражения имеет тот же тип, что и оба операнда", т.е. T вроде как должно преобразовываться к unsigned char...
  Ответить с цитированием
Старый 09.10.2017, 12:54   #1227   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от Aleksandr1111 Посмотреть сообщение
petrd, здравствуйте! Подскажите, пожалуйста: имеется unsigned char R[0] (элемент массива) и signed long T;
Далее пишем:
T = R[0];
Происходит ли здесь приведение типов? Или R так и остается unsigned char, а T остается signed long? Хотя в хелпе по микроСи сказано, что "Результат выражения имеет тот же тип, что и оба операнда", т.е. T вроде как должно преобразовываться к unsigned char...
Вы что-то не так прочитали и не так поняли. R как было размером 1 байт, так и останется, а Т так и останется размером в 4 байта.
А=В+С,
А - РЕЗУЛЬТАТ,
В, С - ОПЕРАНДы.
А теперь что написано в хелпе.
Цитата:

The basic rule of automatic (implicit) conversion is that the operand of simpler type is converted (promoted) to the type of more complex operand. Then, the type of the result is that of more complex operand.
Базовое правило - если есть два операнда, то из двух операндов самый простой приводится к сложному и результат тоже будет сложным.
Пойдем дальше.
Но полученный результат может быть присвоен еще более сложной переменной.
char B;
unsigned int C;
unsigned long A;

итого:
В+С -> char + unsigned int -> unsigned int
а если A= B+C, то без приведения типов получается, что unsigned long != unsigned int, т.е.
надо написать явное приведение:
А = (unsigned long)(B+C);
хотя если не приводить явно, то должно автоматом привести к unsigned long.
Но чудеса всякие бывают. Если есть сомнения - надо в отладчике смотреть.
  Ответить с цитированием
Старый 27.03.2018, 13:46   #1228   
Форумец
 
Сообщений: 7
Регистрация: 04.10.2011

SeregaBud вне форума Не в сети
Программирование

День добрый. У меня такой вопрос- есть пустой пик контроллер и прошивка для него. Может кто-нибудь залить прошивку в пик? Очень нужна помощь!
  Ответить с цитированием
Старый 27.03.2018, 13:55   #1229   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от SeregaBud Посмотреть сообщение
День добрый. У меня такой вопрос- есть пустой пик контроллер и прошивка для него. Может кто-нибудь залить прошивку в пик? Очень нужна помощь!
Смотрите личку.
  Ответить с цитированием
Старый 19.07.2018, 11:09   #1230   
9О421О4О77
 
Аватар для leobor
 
Сообщений: 1,338
Регистрация: 26.04.2005
Возраст: 58

leobor вне форума Не в сети
Доброго дня всем. Время от времени начинаешь понимать, что надо когда то начинать осваивать, но постоянно находятся причины отложить.
По делу - назрела необходимость сконструировать простое устройство, но время не будет ждать, пока я сам лично научусь. Нужно адаптировать энкодер (валкодер). Попробовал на дискретных элементах - как минимум 3 корпуса и тяжеловатая трассировка. Есть у меня 12F683 - думаю, на нем это получилось бы гораздо проще. Есть прогер - так что и с программированием проблем не будет. Нет самого "малого" - прошивки. Может кто помочь написать? Вернее, просто написать (ибо сам я даже не знаю с чего начинать, а времени научиться сейчас попросту нет)...
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind