Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
PIC контроллеры. Программаторы и первый проект на PIC |
Программирование микроконтролеров,ремонт аудио/видео/бытовой техники,полезные устройства для дома,телефония, обсуждение статей журнала Радио |
|
Опции темы |
21.04.2016, 14:19 | #1202 | |
Форумец
|
Цитата:
Алгоритм: АЦП меряет напряжение на 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
Не в сети |
Здравствуйте! Имеется трехфазный двигатель 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, 21:38 | #1205 |
Форумец
|
Нет, нельзя.
SPI FlashROM Programmer http://rayer.g6.cz/programm/programe.htm. Все очень просто. Шил им W25Q32. |
22.09.2016, 22:40 | #1206 |
Registered User
Сообщений: 391
Регистрация: 16.11.2008
Не в сети |
petrd, может тогда на алике заказать https://ru.aliexpress.com/item/CH341...a-89aeda2f3334
Спасибо Вам petrd |
19.02.2017, 22:05 | #1209 |
Форумец
Сообщений: 17
Регистрация: 19.02.2017
Возраст: 59
Не в сети |
Необходимо сделать аспирационную систему. В ней сначала запускается вытяжка, а через 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(); } } } } Заранее спасибо. |
19.02.2017, 23:03 | #1211 | |
Форумец
Сообщений: 5,631
Регистрация: 22.03.2003
Не в сети |
Цитата:
пишем свою процедуру delay5s которая просто в цикле делает проверку нажатия кнопки стоп, зная время выполнения проверки, высчитывается кол-во вложенных циклов для осуществления нужной задержки. Таким образом получим что даже во время выполнения delay кнопка стоп всегда сработает без задержек! не нужно никаких прерываний. |
|
20.02.2017, 22:28 | #1213 |
Форумец
Сообщений: 17
Регистрация: 19.02.2017
Возраст: 59
Не в сети |
Доброго времени суток.
Пошёл по наименьшему сопротивлению, не стал сильно усложнять, понравилась подсказка по замене delay_ms(), сам примерно думал что-то подобное, но в голове вырисовывался текст на кучу строк с переписыванием почти половины программы. В итоге в процедуре Start() сделал цикл и оказалось всё намного проще. Код:
void Start(){ state=1; delay=0; portb=0x01; do{ if (Off){ return; } delay_ms(10); delay++; } while(delay<1000); portb=0x81; } |
19.08.2017, 18:40 | #1215 |
Форумец
Сообщений: 7
Регистрация: 19.08.2017
Возраст: 38
Не в сети |
petrd, в посте #33 (стр.2 темы) Вы написали,что максимальная задержка,которую можно получить с помощью таймера TMR0 и предделителя,равна примерно 66,304 мс. Но,если предделитель делит на 256,и таймер обнуляется на 256-м импульсе,то максим.задержка получается 256*256=65536 мкс при тактовой 4 МГц? Или как?
|
20.08.2017, 08:48 | #1216 | |
Форумец
|
Цитата:
|
|
20.08.2017, 10:04 | #1217 |
Форумец
Сообщений: 7
Регистрация: 19.08.2017
Возраст: 38
Не в сети |
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 | ||
Форумец
|
Цитата:
Lcd_Chr_CP('0'); А кода ASCII цифр от 0-9 это 48-57 (в десятичной системе), т.е. Lcd_Chr_CP('9'); Lcd_Chr_CP(9+48); это одно и тоже, если написать a = '2'+'3', то а будет равняться 101, а не 5. Цитата:
|
||
20.08.2017, 13:13 | #1219 |
Форумец
Сообщений: 7
Регистрация: 19.08.2017
Возраст: 38
Не в сети |
petrd, спасибо большое, вроде разобрался теперь. А то у Шпака тоже никакого объяснения насчет +48. Получается,писать ch+48 удобно,когда надо выводить по одной цифре,так,наверно
|
01.09.2017, 20:03 | #1220 |
Форумец
Сообщений: 7
Регистрация: 19.08.2017
Возраст: 38
Не в сети |
petrd, скажите, пожалуйста: у меня в программе на Си есть функция,в которой 4 переменных. Почему при отладке в Протеусе, да и в mikroC, я не могу найти в списке переменных эти переменные? Есть только глобальные.
И еще: в mikroC при отладке таймеры должны могут менять свое состояние? P.S. С таймерами я понял - в helpe указано, что они не обновляются, а с переменными... Последний раз редактировалось Aleksandr1111; 01.09.2017 в 21:06. |
01.09.2017, 21:40 | #1221 | |
Форумец
|
Цитата:
А симулятор у них убогий. |
|
04.09.2017, 14:29 | #1222 |
Форумец
Сообщений: 7
Регистрация: 19.08.2017
Возраст: 38
Не в сети |
petrd, написАл volatile unsigned A, B, и т.д., но почему-то этих переменных все равно нет в списке. Эта отладка, честно говоря, что-то совсем не получается, исходный код почему-то тоже пропадает (в протеусе), пишет No source line at PC address [PC=nnnn].Но зато мое устройство хоть как-то наконец заработало )
|
04.09.2017, 21:13 | #1223 | |
Форумец
|
Цитата:
Про Протеус не говорите даже ничего. Смотрите, например. Добавляю в прерывание переменную volatile unsigned short test; и в окне Watch вижу эту переменную. Можно искать по ассемблерному имени interrupt_test_LO |
|
14.09.2017, 23:03 | #1224 |
Форумец
Сообщений: 7
Регистрация: 19.08.2017
Возраст: 38
Не в сети |
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 | |
Форумец
|
Цитата:
Смотрите в каком месте Errid используется, там и ищите. А, вообще, эти вещи нужно отладчиком смотреть. |
|
06.10.2017, 23:44 | #1226 |
Форумец
Сообщений: 7
Регистрация: 19.08.2017
Возраст: 38
Не в сети |
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 | ||
Форумец
|
Цитата:
А=В+С, А - РЕЗУЛЬТАТ, В, С - ОПЕРАНДы. А теперь что написано в хелпе. Цитата:
Пойдем дальше. Но полученный результат может быть присвоен еще более сложной переменной. 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:55 | #1229 |
Форумец
|
|
19.07.2018, 11:09 | #1230 |
9О421О4О77
Сообщений: 1,338
Регистрация: 26.04.2005
Возраст: 58
Не в сети |
Доброго дня всем. Время от времени начинаешь понимать, что надо когда то начинать осваивать, но постоянно находятся причины отложить.
По делу - назрела необходимость сконструировать простое устройство, но время не будет ждать, пока я сам лично научусь. Нужно адаптировать энкодер (валкодер). Попробовал на дискретных элементах - как минимум 3 корпуса и тяжеловатая трассировка. Есть у меня 12F683 - думаю, на нем это получилось бы гораздо проще. Есть прогер - так что и с программированием проблем не будет. Нет самого "малого" - прошивки. Может кто помочь написать? Вернее, просто написать (ибо сам я даже не знаю с чего начинать, а времени научиться сейчас попросту нет)... |