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