Доброго здравия всем откликнувшимся. Нашёл у себя в закромах два 16f676. С пиками никогда дела и малейшего не имел, думал выкинуть, но рука не поднялась. А потом решил сделать хоть ночничек какой-нить. Нашел исходник RGB ночника но на attiny13, решил портировать его, но чегото я делаю не так с кодом, ничего не запустилось, хотя вроде настроил и проинициализировал всё правильно. Подскажите в чем причина может быть. Заранее спасибо! Спойлер
Код:
#pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = ON // RA3/MCLR pin function select (RA3/MCLR pin function is MCLR) #pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled) #pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled) #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled) #define _XTAL_FREQ 4000000 #include <pic.h> #include <xc.h> #define OUT_R RC4 #define OUT_G RC3 #define OUT_B RC2 #include <stdlib.h>
unsigned int rgb_r=0,rgb_g=0,rgb_b=0; unsigned int count=0; unsigned int r=0,g=0,b=0; unsigned int step=0; // Timer 0 overflow interrupt service routine void __interrupt() Timer0_ISR(void){ count++; //канал красного if (count == 0) { //если счетчик переполнился и принял значение 0 rgb_r = r; //сохранием значения в буфер OUT_R =1; //выставляем ноги, отвечающие за ШИМ в логическую 1 } if (rgb_r == count) { OUT_R = 0;}//по достижении заданной скважности выводим 0 // канал зелёного if (count == 0) { //если счетчик переполнился и принял значение 0 rgb_g = g; //сохранием значения в буфер OUT_G =1; //выставляем ноги, отвечающие за ШИМ в логическую 1 } if (rgb_g == count) { OUT_G = 0;}//по достижении заданной скважности выводим 0 // канал синего if (count == 0) { //если счетчик переполнился и принял значение 0 rgb_b = b; //сохранием значения в буфер OUT_B =1; //выставляем ноги, отвечающие за ШИМ в логическую 1 } if (rgb_b == count) { OUT_B = 0;}//по достижении заданной скважности выводим 0
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
NStorm, Сделал как Вы сказали- результата не дало. В шпротеусе смотрю по осцилографу, на RC1-RC2 появляются импульсы одновременно длительностью гдето 10 микросекунд, а на RC0-100микросекунд.
Добавлено after 32 minutes 5 seconds: Вроде разобрался. Нужно было флаг переполнения сбрасывать в прерывании void __interrupt() Timer0(void){ count++; //канал красного if (count == 0) { //если счетчик переполнился и принял значение 0 rgb_r = r; //сохранием значения в буфер OUT_R =1; //выставляем ноги, отвечающие за ШИМ в логическую 1 } if (rgb_r == count) { OUT_R = 0;}//по достижении заданной скважности выводим 0 // канал зелёного if (count == 0) { //если счетчик переполнился и принял значение 0 rgb_g = g; //сохранием значения в буфер OUT_G =1; //выставляем ноги, отвечающие за ШИМ в логическую 1 } if (rgb_g == count) { OUT_G = 0;}//по достижении заданной скважности выводим 0 // канал синего if (count == 0) { //если счетчик переполнился и принял значение 0 rgb_b = b; //сохранием значения в буфер OUT_B =1; //выставляем ноги, отвечающие за ШИМ в логическую 1 } if (rgb_b == count) { OUT_B = 0;}//по достижении заданной скважности выводим 0 T0IF=0; }
_________________ Хочется всё и сразу, а получаешь нихрена и постепенно...
Alek_von_German, ах да, в пиках xc8 не делает это автоматом. И еще на всякий случай - в пиках нет разных векторов прерываний, как в AVR. Тут один единственный вектор прерывания на всё. По-хорошему в ISR надо проверять флаги прерываний и по ним смотреть что нужно делать. Но это ес-но в данном случае не актуально ,если активно одно единственное прерывание.
Заголовок сообщения: Re: RGB_ночник на PIC16f676, нужна помощь с кодом
Добавлено: Чт янв 07, 2021 16:57:55
Первый раз сказал Мяу!
Зарегистрирован: Вт май 07, 2013 23:16:23 Сообщений: 36
Рейтинг сообщения:0
Мне кажется, что pic16f676 низкоскоростной для (до 20 Мгц) для реализации RGB светильника. У меня получилось на pic18f452 - 40 Мгц. И то при передаче данных в RGB ленту все "плотничком", ни единой свободной микросекунды.
Доброго здравия всем! Прошу прощения, что снова поднимаю данную тему, но у меня снова возникла проблема с этим кодом. Т.к., мой прошлый компьютер приказал долго жить, а почти все программы и исходники остались на нем без возможности восстановить, свои учебные проекты пытаюсь восстановить по памяти своей(почти отсутствующей). Так вот, вспомнил я, что делал ночник на pic16f676, код восстановил, в протеусе проверил, а в железе работает он как-то странно. Сама ШИМ работает, но паузы между вспышками слишком большие будто частота шим слишком маленькая, и выходит, что светодиоды просто перемигиваются с разной частотой. Всё проверил несколько раз, делители стоят правильно, таймер вроде тоже настроил правильно, да и вообще код считай один в один повторяет мною выложенный ранее, но если раньше он не работал из-за того, что я не сбрасывал флаг, то сейчас я даже и рядом предположить не могу... Спойлер
Код:
#pragma config MCLRE = ON // RA3/MCLR pin function select (RA3/MCLR pin function is MCLR) #pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled) #pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled) #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled) #define _XTAL_FREQ 4000000 #include <pic.h> #include <xc.h> #include <stdio.h> #include <stdint.h> #define OUT_R RC0 #define OUT_G RC1 #define OUT_B RC2
unsigned int rgb_r=0,rgb_g=0,rgb_b=0; unsigned char count=0; unsigned int r=0,g=0,b=0; unsigned char step=0; void __interrupt() Timer0(void){ if (count == 0) { rgb_r = r; OUT_R =1; } if (rgb_r == count) { OUT_R = 0;} if (count == 0) { rgb_g = g; OUT_G =1; } if (rgb_g == count) { OUT_G = 0;} if (count == 0) { rgb_b = b; OUT_B =1; } if (rgb_b == count) { OUT_B = 0;} count++; T0IF = 0;
otest, стыдно сказать, но я так и не понял как работает лог.анализатор в шпротеусе. Но по осциллографу я выяснил, что период составляет порядка 260mS, если я правильно владею калькулятором, то частота шим в данном случаесоставляет ~3.8Hz. Ето же нонсенс. Предделители вообще не стоят никакие, частота камня 4000000.
_________________ Хочется всё и сразу, а получаешь нихрена и постепенно...
Ослик для этого не годится. По лог. анализатору есть хелп. Поставь брек поинты в нужное место и протеус покажет затраченое время. Здесь по русски http://kazus.ru/forums/showthread.php?t=13198
otest, спасибо за ссылку, разобрался. Частота оказалась 22 Гц. Но вот вопрос, как она может быть таковой если частота камня 4.000.000Гц и предделители отключены?
_________________ Хочется всё и сразу, а получаешь нихрена и постепенно...
По умолчанию для всех "среднемладших" справедливо положение, когда частота равна частоте кварца(внутреннего RC генератора) деленного на 4. Это "особенность" ПИКовых... Т.е. кварц 4МГц, а системная тактовая 1МГц (при 20 МГц кварце будет 5МГц максимум против 9,6МГц в тини13, при отключенном предделителе). Единственно те модели (более современные), где PLL заложено да "энхансед" линейка позволяют частоту поднять.
BOB51, да, это я знаю. Мне просто интересно, что я сделал не так в этот раз, если в прошлый раз всё работало как надо. Перечитал уже всё, пересмотрел все настройки и всё равно не понятно где я туплю.
_________________ Хочется всё и сразу, а получаешь нихрена и постепенно...
Под Си вряд-ли подскажу... В принципе... Если это не WS2812-подобные а всего 3х элементные... Достаточно программного ШИМ с частотой от 62-120Гц. Вполне потянет любой МК... Главная сетка частот равна периоду деленному на 256 (или более - зависит от типа МК и системы команд, имеющихся таймеров). На каждом кванте проверяем совпадение по каналам с масками задания и модифицируем вывод. В конце периода обработка изменения данных.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения