Отговори на тема  [ 57 мнения ]  Отиди на страница 1, 2, 3, 4  Следваща
PIC 16F Смяна между светлинни ефекти с бутон 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Дек 20, 2016 7:39 pm
Мнения: 32
Местоположение: Русе
Мнение PIC 16F Смяна между светлинни ефекти с бутон
Здравейте! Проблемът ми е, че не мога да се сетя как да реализирам нещо подобно на коледна гирлянда или LED стоп за велосипед, тоест да сменям режими с натискане на бутон, като един от режимите да е OFF (изключено). Пробвах с external interrupt на RB0, но MCU-то не ще и да чуе за прекъсване, докато изпълнява endless loop-a (като се замисля е логично да е така).
Пробвах също и след еднократно изпълнение на рутината да проверява дали стойността на дадена променлива се е изменила, и ако не отново да изпълни еднократно частта от кода, като отново проверява след това, или ако да, да се прехвърли на друга еднократна част код и така нататък. Проблема е че става много тежко за изпълнение, а и се бави с проверката (колкото и да е малко това време, е неприятно да разваля готиния LED ефект). Убеден съм че има и по бял начин да се направи това нещо, но тъй като съм начинаещ, явно не ми достига знанието. Направих си справка с интернет, но опирам само до готов HEX файл, а разбрах, че той не може да се декомпилира. Не съм сигурен дали е позволено да се вмъкне нагледен пример, ако не, предварително се извинявам. Става въпрос за това: https://www.youtube.com/watch?v=1RsISxlNX-Y&t=1s , въпреки, че е с PIC12F. Просто на мен ми трябват 7 пина за 6 двойки срещуположни светодиода (тази част от идеята е реализирана и работи). Останаха ефектите :)

Благодаря!

_________________
Никола Богданов
16 години


Нед Яну 08, 2017 11:47 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Ное 27, 2012 9:27 pm
Мнения: 2011
Мнение Re: PIC 16F Смяна между светлинни ефекти с бутон
При натискане на един бутон примерно RB0 (инициализираш го като вход) да сменя реда по таблицата и съответно в прекъсванията да проверява стойността на входа (бутона). Това е най лесният начин. Може да се реализира и по друг начин и определено ще е по добре от към изпълнение. Не си играй с дизасемблер на хекса ще си загубиш времето. Потърси готов сорс или си направи програмка сам.


Нед Яну 08, 2017 11:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: PIC 16F Смяна между светлинни ефекти с бутон
Ами всякак може да стане, и с прекъсване и с полиране, при всички положения изпълнението на ефектати ще се спре, но той така или иначе не се изпълнява постоянно, тези ефекти ще отнемат 2-3% от ресурса дори на процесор като 12-ката, през останалото време не правиш нищо. Това разбира се ако не мениш състоянията едни след друго и между тях да имаш delay_ms(100) :)
Най-общо, първо решаваш за тия ефекти колко стъпки ще имаш, не че не може да е динамично, но като за начинаещ да започнем с фиксирана дължина и без сложни структури от данни. Да речем че всеки ефект е от 20 стъпки преди да се повтори, ти имаш 6 светодиода, та това са по малко от 8 бита, т.е. 1 байт ти е достатъчен. Правиш си един двумерен масив от по 20 байта. Да речем Х са ти стъпките от ефекта, а Y са ти ефектите.
Пускаш си еидн таймер, варианти много да се направи, но аз те съветвам да изпозлваш хардуерен таймер, вече дали ще влизаш в прекъсване или не няма значение, може да го полираш.
След това решаваш как да клокваш, дали ще мениш настройката на таймера за да получиш различна скорост на ефектите или пък таймера ще генерира еталонно време и по него ще инкрементваш някакъв брояч си е твое решение. За подобно нещо аз бих заложил на таймер който да ми прави 1 или 10 ms и по-този такт да определям дали е време за нова стъпка.
В тялото имаш един безкраен луп като една част от този луп ти е да провериш дали е време за нова стъпка, и ако е да заредиш към диодите следващият байт от масива по Х, и така ги врътиш до безкрай.

Друга в този безкраен цикъл може да си полираш входа на бутона, като му правиш и дебонсинг естетсвено, и ако е натиснат да инкрементваш втори параметър, който ти дава редът (Y).

.. и общо взето това е. Ако искаш д аимаш и off от там, става малко по-сложно, защото не е въпроса да заредиш ефект в който диодите не светят, а да приспиш процесора ако инаистина искаш да си off, т.е. да не харчиш много ток, но това да го оставим за по-нататък ако искаш.

Като направиш това, ще ти предложа да смениш простия масив с по-сложна структура, там за всеки ефект да указваш не само състоянията и тайминга, но и броя стъпки и евентуално някакви други параметри, примерно яркост ... но това вече е за малко по-нататък.


Пон Яну 09, 2017 12:37 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Ное 27, 2012 9:27 pm
Мнения: 2011
Мнение Re: PIC 16F Смяна между светлинни ефекти с бутон
Аз не знам ама ако го прати да спи не се ли намаля консумацията?


Пон Яну 09, 2017 1:00 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: PIC 16F Смяна между светлинни ефекти с бутон
Да де, ама спането е друг момент, щото там имаш и будене, не е за начинаещи, а като гледам е доста начинаещ.


Пон Яну 09, 2017 1:09 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Дек 20, 2016 7:39 pm
Мнения: 32
Местоположение: Русе
Мнение Re: PIC 16F Смяна между светлинни ефекти с бутон
Ще внеса малко пояснения. Това е схемата:
Изображение
6 двойки светодиоди, които се управляват от 8 пина на микроконтролера. Наложи ми се да ги разделя на 2 общи шини по 6 светодиода, тъй като двата крайни са противоположни един на друг, и ако общата шина е една и на нея имам 0 (0V) заради първия светодиод, то втория няма да свети тъй като за да свети му трябва 1 на шината.
Това е кода, който управлява индивидуално всеки светодиод:
Цитат:
void led(int a){
switch (a){
case 1 : osnoven1 = 0; led1i2 = 1; led3i4 = led5i6= 0; break;
case 2 : osnoven1 = 1; led1i2 = 0; led3i4 = led5i6= 1; break;
case 3 : osnoven1 = 0; led3i4 = 1; led1i2 = led5i6 = 0; break;
case 4 : osnoven1 = 1; led3i4 = 0; led1i2 = led5i6= 1; break;
case 5 : osnoven1 = 0; led5i6 = 1; led1i2 = led3i4= 0; break;
case 6 : osnoven1 = 1; led5i6 = 0; led1i2 = led3i4=1; break;

case 7 : osnoven2 = 0; led7i8 = 1; led9i10 = led11i12 =0; break;
case 8 : osnoven2 = 1; led7i8 = 0; led9i10 = led11i12 = 1; break;
case 9 : osnoven2 = 0; led9i10 = 1; led7i8 = led11i12 = 0; break;
case 10 : osnoven2 = 1; led9i10 = 0; led7i8 = led11i12 = 1; break;
case 11 : osnoven2 = 0; led11i12 = 1; led7i8 = led9i10 =0; break;
case 12 : osnoven2 = 1; led11i12 = 0; led7i8 = led9i10 = 1; break;
}
}

Всеки case отговаря на номера на светодиода. "osnoven1" и "osnoven2" са шините за първите и вторите 6 светодиода. "led1i2" е изхода на микроконтролера, който отговаря за светодиод 1 и 2 (RB2) и така нататък.
Светодиодите светвам по този начин:
Цитат:
led(1);

и съответно се изпълнява case 1.
Ефектите ми изглеждат по ето този начин:
Цитат:
void effect1(){
led(1);
led(12);
Delay_ms(100);
led(2);
led(11);
Delay_ms(100);
...
Delay_ms(100);
PORTA = 0;
PORTB = 0;
}


Ето какво се получава.

До тук съм стигнал и не мога да мръдна. Ако съм разбрал правилно, решението е побитово управление на портовете, но ще трябва доста да си поиграя, за да го наглася, тъй като този начин на свързване на LED-овете е доста усукан и е трудно да се координират изходите помежду си.

_________________
Никола Богданов
16 години


Пон Яну 09, 2017 12:17 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: PIC 16F Смяна между светлинни ефекти с бутон
.... ей как го познах това delay_ms(100) и то без да хвърлям боб, представям си какво ще е ако направя и жертвоприношение :D
Не се прави така, разкарай това delay_ms().
Сега не ми се проследява схемата и кода за да ти напиша точните числа. Първо сложи бутона на А6 а В го остави за светодиодите, така всички данни ще отиват към еидн порт.
Няма нужда да управялваш нищо побитово, просто :
case 1 : osnoven1 = 0; led1i2 = 1; led3i4 = led5i6= 0; break;
това ти е хххх0010 или 0х?2 , този въпросуителен ти е състоянието на другите диоди 7-12.
Това число го слагаш в един масив, за еидн ефект ще е едномерен :
char leds[12]={0x02,0xA3,........,0xD0};
Пускаш един таймер който да ти прави прекъсване на всеки 1 ms.
В прекъсването на таймера пишеш :
time_base++;

В основния ти цикъл слагаш едно :

if(time_base>100)
{
time_base=0
port_B = leds[step];
if(step==11)
{
step = 0;
}
else
{
step++;
}
}

Това ти е всичко, доста хардкорднато но за да схавнеш идеята.


Пон Яну 09, 2017 12:34 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: PIC 16F Смяна между светлинни ефекти с бутон
Бутона, го правиш по подобен начин, за него в прекъсванеот на таймера може да добавиш еидн параметър :
deboubce_time++;

В основният цикъл имаш още една проверка :
if(!button)
{
if(button_push)
{
if(debounce_time>50)
{
button_pressed=true;
}
}
else
{
button_push =true;
debounce_time=0;
}
}
else
{
button_push = false;
}

И на друго място си проверяваш :

if(button_pressed)
{
button_pressed = false;
do something , например effect++;
}

а това effect го използваш в двумерен масив, да ти указва кой е ефекта, разбирира се трябва да го инкементваш с проверка че не надвишава размрността на масива ти ..... това по-горе е съвсем съвсем примерно за да схванеш идеята.


Пон Яну 09, 2017 12:47 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Дек 20, 2016 7:39 pm
Мнения: 32
Местоположение: Русе
Мнение Re: PIC 16F Смяна между светлинни ефекти с бутон
ToHu написа:
Пускаш един таймер който да ти прави прекъсване на всеки 1 ms.
В прекъсването на таймера пишеш :
time_base++;

Таймерът би трябвало да е Timer0, преди да го пусна трябва да изчистя съответния регистър,
Цитат:
TMR0 = 0;

след това има няколко реда код, които са някакви настройки:
Цитат:
// set up interrupt registers
OPTION_REG.T0CS = 0; // clock source is internal instruction clock
OPTION_REG.PSA = 0; // prescaler assigned to TMR0
OPTION_REG |= 0x07; // set the prescaler to 1:64 scale using an or
INTCON.GIE = 1; // enable global interrupts
INTCON.T0IE = 1; // enable TMR0 interrupt

Не можах да разбера как стартирам таймера и къде по точно го стартирам.

Има много хубави туториали (на Microchip), но там обхващат всички случаи, таймери и неща, свързани с тях, че накрая се обърквам жестоко. За сега си помагам само с конкретни случай и примери към тях от интернет, но все нещо остава неясно.

ToHu написа:
Няма нужда да управляваш нищо побитово, просто :
case 1 : osnoven1 = 0; led1i2 = 1; led3i4 = led5i6= 0; break;
това ти е хххх0010 или 0х?2 , този въпросителен ти е състоянието на другите диоди 7-12.
Това число го слагаш в един масив, за един ефект ще е едномерен :
char leds[12]={0x02,0xA3,........,0xD0};

Тези неща също не са ми особено ясни. Това, което започва с 0b предполагам е binary, а 0x е hexadecimal. Това означава ли, че 0bxxxxxxxx може да се представи като 0xXX и да означава същото нещо за компилатора? Как да превърна този case 1 (информацията за изходите в него) в двоичен код? Всеки изход отговаря на пореден бит?

Благодаря за отделеното време!


Пон Яну 09, 2017 1:34 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 03, 2005 2:21 am
Мнения: 12765
Местоположение: София
Мнение Re: PIC 16F Смяна между светлинни ефекти с бутон
Някой, това реалната схема ли ще е или е само за симулациите.
Ако да, сложи някой и друг токоограничаващ резистор последователно на светодиодите.


Пон Яну 09, 2017 2:08 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: PIC 16F Смяна между светлинни ефекти с бутон
хммм .... не се обиждай но доста неща май не са ясни, явно и с двоичната аритметика не си наясно ... искаш да се учиш или просто искаш да направиш тази мигалка, ако е второто ще ми отнеме много по малко време да ти го напиша отколкото да обеснявам .....
Ако ще се учиш има някои фундаментални неща свързани с цифрова електроника, ако си наясно с нея другото също ще ти е ясно, но ако не си трбява да прочетеш нещо базово за микроконтролерите, имаше тук колега с някаква книга, не съм я преглеждал в детайли но май обхващаше някои основни неща.
Иначе директно отговор на въпроса но в кратък и синтезиран вид, най-общо процесора работи с числа, този тъй като е осембитов работи с осембитови числа. Той разбира от двоичен код, всчико в него става двоично, 0b.... е числото в двоичен вид. Потърси в гугъл за двоична система, не ми се пише толкова.
Та това число си има изражение във всяка друга система, шестнайстична, десеттична и т.н. 0х или 0h е същото това число в шестнайстичен кофд, а ако пишеш просто числото компилатора по подразбиране го взема като десеттично.
Дали ще напишеш a= 0х02 , a= 2, а=0b00000010 за компилатора е едно и също.
Всеки порт А, В ... ти е регистър, 8 тригера най-просто казано. Всеки един от тези тригери ти съответства на еидн бит от 8 битово число. Port_b_0 ти е най-младшия а Port_b_7 ти е най старшия. Ако присвоиш на port_B като регистър някаква стойност, тя ще рефлектира в-у всички негови битове, т.е. изходи. Да речем Ниско ниво = Н, високо ниво = В, искаш да са НВНВНВНВ това изразено в двоичен вид е 01010101, което пък съответства на шестнайстично число 0х55 или на десеттично 85. В програмата може да го пишеш както ти е лесно, ако директно присвояваш стойности да речем дирекнто битовите е по-лесно да го въвеждаш двоично 0b .. да но ако имаш масив е малко дълго да ги напишеш всичките двоично, и обикновенно се пишат шестнайстично. Върпосът вече е дали можеш да ги конвертираш на ум или ще изпозлваш калкулатор. Обикновенно се изпозлват шестнайстични стойности защото са по-разбираеми, лесно се свеждат до двоични, може да ги пишеш и десеттични но по трудно се чете.

Та ака искаш да направиш този порт в това състояние просто му присвояваш стойност 0x55 .....


Пон Яну 09, 2017 2:12 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Дек 20, 2016 7:39 pm
Мнения: 32
Местоположение: Русе
Мнение Re: PIC 16F Смяна между светлинни ефекти с бутон
Искам да се науча. Харесва ми да съчетавам софтуер с хардуер, а и имам много собствени идеи, които съм реализирал и тепърва ще реализирам. Бих казал, че основните неща са ми ясни, тъй като прочетох книгата на Млад конструктор "PIC микроконтролери", и разбрах най-важното. Просто имам навика да питам по 100 пъти, някакво чувство за несигурност...
ToHu написа:
..., а ако пишеш просто числото компилатора по подразбиране го взема като десеттично.
Дали ще напишеш a= 0х02 , a= 2, а=0b00000010 за компилатора е едно и също

Този път ми стана ясно и го запомних, благодаря. Ако се бях замислил, нямаше да питам, миналата година учих бройните системи в училище #-o

_________________
Никола Богданов
16 години


Пон Яну 09, 2017 2:49 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Дек 20, 2016 7:39 pm
Мнения: 32
Местоположение: Русе
Мнение Re: PIC 16F Смяна между светлинни ефекти с бутон
itso.t написа:
Някой, това реалната схема ли ще е или е само за симулациите.
Ако да, сложи някой и друг токоограничаващ резистор последователно на светодиодите.

Това е само за симулациите. Така и така Proteus няма нищо против да няма резистор :D .
Когато се стигне до хардуерна реализация ще го направя както се прави - с резистор.

_________________
Никола Богданов
16 години


Пон Яну 09, 2017 2:53 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: PIC 16F Смяна между светлинни ефекти с бутон
С какво компилираш между другото, не ч еима някакво голямо значение но ....


Пон Яну 09, 2017 3:11 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Дек 20, 2016 7:39 pm
Мнения: 32
Местоположение: Русе
Мнение Re: PIC 16F Смяна между светлинни ефекти с бутон
Компилирам с mikroC на MikroElektronika, демо версия (ограничена до 2000 програмни думи). Избрах това IDE и компилатор, защото има много хубава библиотека с примери, а е и по-лесна и подредена за работа от MPLAB-X според мен.

_________________
Никола Богданов
16 години


Пон Яну 09, 2017 3:16 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 57 мнения ]  Отиди на страница 1, 2, 3, 4  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 15 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни