Свежие обсуждения
Микроконтроллеры

Ликбез по С для микроконтроллеров PIC

1 50 64

2 Vladikas
В смысле? Если правильно понял, то выкладываю архив всей папки с проектом(там же hex) плюс файл для протеуса.

174556.rar

 

Прошу прощения... Думал, что set_pwm1_duty(value) это самодельная функция, а она встроенная. Тем не менее спасибо за готовый проект. Заметил некое дрожание импульсов. Что-то не так...

 

Не за что.

Vladikas : Заметил некое дрожание импульсов. Что-то не так...

У меня это дрожание то проявляеться, то исчезает, в не зависимости от программы.
Даже когда просто пишу например set_pwm1_duty(50). По моему это протеус виноват.

 

А может это следствие программности ШИМа? Когда делал несколько независимых программных ШИМов на асме, то боролся с дрожанием (джиттер вроде называется), следил чтоб по какому бы пути программа не пошла время обработки счётчиков было бы одинаковым, вплоть до одного машинного такта.

А в железе есть возможность проверить?

 

Vladikas: следил чтоб по какому бы пути программа не пошла время обработки счётчиков было бы одинаковым, вплоть до одного машинного такта.

Не совсем пойму про обработку счетчиков, можно поподробней?
На железе пока проверить не могу, как соберу так проверю.

 

Left Radio: Не совсем пойму про обработку счетчиков, можно поподробней?
Завтра посмотрю как работает наша прога, посчитаю циклы, потом расскажу. В этом компиляторе нельзя ассемблерный код посмотреть, типа как в МикроСи делается? Если нет, то хуже... Ещё вопрос... Таймер похоже вообще не используется? Просто постоянно опрашивается клавиатура, без всяких задержек. Или нет?

 

Vladikas: В этом компиляторе нельзя ассемблерный код посмотреть, типа как в МикроСи делается?

Можно, вкладка Compile, пункт C/ASM List .
Хотел сделать опрос клавиш каждое(или каждое 10;100....) прерывание таймера, но сейчас глянул, оказывается забыл
Ну тогда да, в данном варианте таймер не используется.

Возник злободневный вопрос, как можно не делением разложить число, типа 1024, полученное от АЦП в в четыре числа: 1;0;2;4 ?

 

Left Radio: Возник злободневный вопрос, как можно не делением разложить число, типа 1024, полученное от АЦП в в четыре числа: 1;0;2;4 ?
Например так:
В начале обнуляем ячейки с получаемым содержимым каждого из десятичных разрядов(они полубайты кстати):

raz0=0x00; //
raz1=0x00; //
raz2=0x00; //
raz3=0x00; //

можно писать сразу 0x30, для алфавитно-цифр. ЖКИ, вместо нулей тут. Потом подсчитываем(переменная chet - это int16 результат от АЦП):
while(chet>=1000) {raz0++; chet-=1000;}
while(chet>=100) {raz1++; chet-=100;}
while(chet>=10) {raz2++; chet-=10;}
raz3=chet;

 

2 AleksBak

Спасибо!

 

Можно оптимизировать немного верхний фрагмент кода, отказаться от переменной raz3 или chet.