Большой Воронежский Форум
Страница 41 из 43
« Первая < 3135363738394041 4243 >
»Радиолюбитель>PIC контроллеры. Программаторы и первый проект на PIC
petrd 10:44 21.04.2016
Ардуина в данной теме совсем не к месту! Не надо! [Ответ]
petrd 14:19 21.04.2016

Сообщение от 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;
     }
}
[Ответ]
MuShu 16:34 03.05.2016
Здравствуйте! Имеется трехфазный двигатель 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: Шим не тот... Буду изучать прерывания... Этот работает на одних задержках. Дайте совет как написать шим на прерываниях. [Ответ]
romchik77 20:29 22.09.2016
Здравствуйте. Можно ли Pickit2 прошить 25Q64BS или все таки искать другой. [Ответ]
petrd 21:38 22.09.2016

Сообщение от romchik77:
Можно ли Pickit2 прошить 25Q64BS

Нет, нельзя.

Сообщение от romchik77:
или все таки искать другой.

SPI FlashROM Programmer http://rayer.g6.cz/programm/programe.htm. Все очень просто. Шил им W25Q32. [Ответ]
romchik77 22:40 22.09.2016
petrd, может тогда на алике заказать https://ru.aliexpress.com/item/CH341...a-89aeda2f3334
Спасибо Вам petrd [Ответ]
ra9cim 18:44 19.02.2017
Доброго времени суток.
Подскажите пож, тема ещё жива или как? Есть несколько вопросов. [Ответ]
petrd 20:28 19.02.2017

Сообщение от ra9cim:
Доброго времени суток.
Подскажите пож, тема ещё жива или как? Есть несколько вопросов.

Задавайте! [Ответ]
ra9cim 22:05 19.02.2017
Необходимо сделать аспирационную систему. В ней сначала запускается вытяжка, а через 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 что можно использовать, а то получается, что при нажатии Пуск и до запуска наждака систему невозможно остановить. Кнопка Стоп не срабатывает, т.к. проц отрабатывает задержку и не реагирует. Больше волнует задержка на включение.
Заранее спасибо. [Ответ]
petrd 22:29 19.02.2017
ИМХО надо применить стейт-машину (автомат состояний) обычно для этого применяется switch....case, а задержки делать на прерываниях от таймера. [Ответ]
DimYch 23:03 19.02.2017

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

можно проще
пишем свою процедуру delay5s
которая просто в цикле делает проверку нажатия кнопки стоп,
зная время выполнения проверки, высчитывается кол-во вложенных циклов для осуществления нужной задержки.

Таким образом получим что даже во время выполнения delay кнопка стоп всегда сработает без задержек! не нужно никаких прерываний. [Ответ]
ra9cim 03:56 20.02.2017
Спасибо, буду пробовать варианты. [Ответ]
ra9cim 22:28 20.02.2017
Доброго времени суток.
Пошёл по наименьшему сопротивлению, не стал сильно усложнять, понравилась подсказка по замене delay_ms(), сам примерно думал что-то подобное, но в голове вырисовывался текст на кучу строк с переписыванием почти половины программы. В итоге в процедуре Start() сделал цикл и оказалось всё намного проще.
Код:
void Start(){
 state=1;
 delay=0;
 portb=0x01;
 do{
  if (Off){
   return;
  }
  delay_ms(10);
  delay++;
 } while(delay<1000);
 portb=0x81;
}
[Ответ]
romchik77 16:31 13.03.2017
День добрый!
FlowCode - универсальная среда разработки и не только Pic и особенно для новичка [Ответ]
Aleksandr1111 18:40 19.08.2017
petrd, в посте #33 (стр.2 темы) Вы написали,что максимальная задержка,которую можно получить с помощью таймера TMR0 и предделителя,равна примерно 66,304 мс. Но,если предделитель делит на 256,и таймер обнуляется на 256-м импульсе,то максим.задержка получается 256*256=65536 мкс при тактовой 4 МГц? Или как? [Ответ]
petrd 08:48 20.08.2017

Сообщение от Aleksandr1111:
petrd, в посте #33 (стр.2 темы) Вы написали,что максимальная задержка,которую можно получить с помощью таймера TMR0 и предделителя,равна примерно 66,304 мс. Но,если предделитель делит на 256,и таймер обнуляется на 256-м импульсе,то максим.задержка получается 256*256=65536 мкс при тактовой 4 МГц? Или как?

Да, все верно. Сейчас сам не понимаю, почему тогда так сказал. [Ответ]
Aleksandr1111 10:04 20.08.2017
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 тактовым генератором? Но эту библиотеку же используют и при кварцевом такт.генераторе? [Ответ]
petrd 11:12 20.08.2017

Сообщение от 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. [Ответ]
Aleksandr1111 13:13 20.08.2017
petrd, спасибо большое, вроде разобрался теперь. А то у Шпака тоже никакого объяснения насчет +48. Получается,писать ch+48 удобно,когда надо выводить по одной цифре,так,наверно [Ответ]
Aleksandr1111 20:03 01.09.2017
petrd, скажите, пожалуйста: у меня в программе на Си есть функция,в которой 4 переменных. Почему при отладке в Протеусе, да и в mikroC, я не могу найти в списке переменных эти переменные? Есть только глобальные.
И еще: в mikroC при отладке таймеры должны могут менять свое состояние?

P.S. С таймерами я понял - в helpe указано, что они не обновляются, а с переменными... [Ответ]
petrd 21:40 01.09.2017

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

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

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

Сообщение от 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  
[Ответ]
Aleksandr1111 23:03 14.09.2017
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-му, и т.д. Но почему-то это условие не проходит, программа, похоже, зависает. Когда я убрал эти строки, все заработало. В чем тут может быть дело? Или тут надо смотреть весь код? [Ответ]
petrd 10:02 15.09.2017

Сообщение от Aleksandr1111:
Но почему-то это условие не проходит, программа, похоже, зависает. Когда я убрал эти строки, все заработало.

Этот код не блокирующий, он не должен по определению ничего повесить.
Смотрите в каком месте Errid используется, там и ищите. А, вообще, эти вещи нужно отладчиком смотреть. [Ответ]
Aleksandr1111 23:44 06.10.2017
petrd, здравствуйте! Подскажите, пожалуйста: имеется unsigned char R[0] (элемент массива) и signed long T;
Далее пишем:
T = R[0];
Происходит ли здесь приведение типов? Или R так и остается unsigned char, а T остается signed long? Хотя в хелпе по микроСи сказано, что "Результат выражения имеет тот же тип, что и оба операнда", т.е. T вроде как должно преобразовываться к unsigned char... [Ответ]
petrd 12:54 09.10.2017

Сообщение от 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.
Но чудеса всякие бывают. Если есть сомнения - надо в отладчике смотреть. [Ответ]
SeregaBud 13:46 27.03.2018
День добрый. У меня такой вопрос- есть пустой пик контроллер и прошивка для него. Может кто-нибудь залить прошивку в пик? Очень нужна помощь! [Ответ]
petrd 13:55 27.03.2018

Сообщение от SeregaBud:
День добрый. У меня такой вопрос- есть пустой пик контроллер и прошивка для него. Может кто-нибудь залить прошивку в пик? Очень нужна помощь!

Смотрите личку. [Ответ]
leobor 11:09 19.07.2018
Доброго дня всем. Время от времени начинаешь понимать, что надо когда то начинать осваивать, но постоянно находятся причины отложить.
По делу - назрела необходимость сконструировать простое устройство, но время не будет ждать, пока я сам лично научусь. Нужно адаптировать энкодер (валкодер). Попробовал на дискретных элементах - как минимум 3 корпуса и тяжеловатая трассировка. Есть у меня 12F683 - думаю, на нем это получилось бы гораздо проще. Есть прогер - так что и с программированием проблем не будет. Нет самого "малого" - прошивки. Может кто помочь написать? Вернее, просто написать (ибо сам я даже не знаю с чего начинать, а времени научиться сейчас попросту нет)... [Ответ]
Страница 41 из 43
« Первая < 3135363738394041 4243 >
Вверх