»Радиолюбитель>PIC контроллеры. Программаторы и первый проект на PIC
petrd 10:44 21.04.2016
Ардуина в данной теме совсем не к месту! Не надо!
[Ответ]
petrd 14:19 21.04.2016
Сообщение от Vdmit:
Хотел бы от Вас ещё такой же урок с АЦП . Какой-нибудь незамысловатый пример от уровня напряжения на какой-нибудь ноге . Спасибо !
Код для PIC12F683 (просто он в железе запаян был, а 675 надо было паять, суть та же).
Алгоритм: АЦП меряет напряжение на GP1 и в зависимости от напряжения меняет скважность ШИМ, соответственно меняется яркость свечения светодиода.
Здравствуйте! Имеется трехфазный двигатель 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:
или все таки искать другой.
Необходимо сделать аспирационную систему. В ней сначала запускается вытяжка, а через 10 сек. включается наждак. Обратно также, только задержка после отключения наждака составляет 5 сек. Решил сделать на пике, но некоторые места не устраивают.
Чем заменить данные задержки. Вместо delay_ms что можно использовать, а то получается, что при нажатии Пуск и до запуска наждака систему невозможно остановить. Кнопка Стоп не срабатывает, т.к. проц отрабатывает задержку и не реагирует. Больше волнует задержка на включение.
Заранее спасибо.
[Ответ]
petrd 22:29 19.02.2017
ИМХО надо применить стейт-машину (автомат состояний) обычно для этого применяется switch....case, а задержки делать на прерываниях от таймера.
[Ответ]
DimYch 23:03 19.02.2017
Сообщение от petrd:
ИМХО надо применить стейт-машину (автомат состояний) обычно для этого применяется switch....case, а задержки делать на прерываниях от таймера.
можно проще
пишем свою процедуру delay5s
которая просто в цикле делает проверку нажатия кнопки стоп,
зная время выполнения проверки, высчитывается кол-во вложенных циклов для осуществления нужной задержки.
Таким образом получим что даже во время выполнения delay кнопка стоп всегда сработает без задержек! не нужно никаких прерываний.
[Ответ]
Доброго времени суток.
Пошёл по наименьшему сопротивлению, не стал сильно усложнять, понравилась подсказка по замене delay_ms(), сам примерно думал что-то подобное, но в голове вырисовывался текст на кучу строк с переписыванием почти половины программы. В итоге в процедуре Start() сделал цикл и оказалось всё намного проще.
День добрый!
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, написАл volatileunsigned A, B, и т.д., но почему-то этих переменных все равно нет в списке. Эта отладка, честно говоря, что-то совсем не получается, исходный код почему-то тоже пропадает (в протеусе), пишет No source line at PC address [PC=nnnn].Но зато мое устройство хоть как-то наконец заработало )
[Ответ]
petrd 21:13 04.09.2017
Сообщение от Aleksandr1111: petrd, написАл volatileunsigned A, B, и т.д., но почему-то этих переменных все равно нет в списке. Эта отладка, честно говоря, что-то совсем не получается, исходный код почему-то тоже пропадает (в протеусе), пишет No source line at PC address [PC=nnnn].Но зато мое устройство хоть как-то наконец заработало )
Про Протеус не говорите даже ничего.
Смотрите, например. Добавляю в прерывание переменную volatile unsigned short test; и в окне Watch вижу эту переменную. Можно искать по ассемблерному имени interrupt_test_LO Изображения
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:
День добрый. У меня такой вопрос- есть пустой пик контроллер и прошивка для него. Может кто-нибудь залить прошивку в пик? Очень нужна помощь!
Доброго дня всем. Время от времени начинаешь понимать, что надо когда то начинать осваивать, но постоянно находятся причины отложить.
По делу - назрела необходимость сконструировать простое устройство, но время не будет ждать, пока я сам лично научусь. Нужно адаптировать энкодер (валкодер). Попробовал на дискретных элементах - как минимум 3 корпуса и тяжеловатая трассировка. Есть у меня 12F683 - думаю, на нем это получилось бы гораздо проще. Есть прогер - так что и с программированием проблем не будет. Нет самого "малого" - прошивки. Может кто помочь написать? Вернее, просто написать (ибо сам я даже не знаю с чего начинать, а времени научиться сейчас попросту нет)...
[Ответ]