|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 4:02 am
| Автор |
Съобщение |
|
didofen
Ранг: Популярен
Регистриран на: Вто Юни 27, 2006 11:13 am Мнения: 381 Местоположение: Варна
|
 Re: Моля за малко помощ
какво значи входящ импулс? от външно устройство или от бутона, щото там трябва да се оправиш с трептенията, както вече се говори доста
|
| Пет Авг 26, 2011 10:15 am |
|
 |
|
stojo
Ранг: Минаващ
Регистриран на: Чет Авг 18, 2011 3:44 pm Мнения: 27
|
 Re: Моля за малко помощ
Нищо секретно няма, измислям си разни прости програмки с цел да се запозная по добре с микроконтролерите и по специално с разни програмни решения
|
| Пет Авг 26, 2011 12:30 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Моля за малко помощ
Ако имаш входен импулс, от друго у-во, схема, и искаш да го удължиш, тогава не ти трябва филтър по време, предполага се че няма трептене, и няма смущения, в този случай ще ти трябва и само още един таймер.
|
| Пет Авг 26, 2011 11:24 pm |
|
 |
|
stojo
Ранг: Минаващ
Регистриран на: Чет Авг 18, 2011 3:44 pm Мнения: 27
|
 Re: Моля за малко помощ
Без прекъсване ли?
|
| Съб Авг 27, 2011 9:48 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Моля за малко помощ
Напротив, с прекъсване, кода който съм ти дал е обработката на прекъсването ти по port_b change. С полиране не се прави никога, освен ако единственото което правиш не е това, но и тогава не е никак сигурно.
|
| Съб Авг 27, 2011 10:08 pm |
|
 |
|
stojo
Ранг: Минаващ
Регистриран на: Чет Авг 18, 2011 3:44 pm Мнения: 27
|
 Re: Моля за малко помощ
Ами това е общо взето програмата, работи, но закъснението преди нулиране на порта всеки път е различно. Къде ми е грешката?
|
| Чет Сеп 15, 2011 7:36 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Моля за малко помощ
Какъв е тоя процесор дето гоползваш, гледам че това ти е порт А, 12-ка ли има с такова прекъсване на порт А, 16-ките по спомен бяха само на порт В и то 4,5,6,7 бит. А я си постни и цялата програма че така нещо ми се губи.
|
| Чет Сеп 15, 2011 8:37 pm |
|
 |
|
stojo
Ранг: Минаващ
Регистриран на: Чет Авг 18, 2011 3:44 pm Мнения: 27
|
 Re: Моля за малко помощ
Това е цялата, от mikroC толкос. Процесора е 16f688, той няма порт В.
|
| Чет Сеп 15, 2011 9:15 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Моля за малко помощ
Т.е. на теб цялата програма ти е самото прекъсване? INTCON.B0=0; това какво ще рече, какво е това B0, това някакъв предефиниран регистър ли е, порт B interrupt или що ? Ако е така го нулираш грешно, не бива д аима условие, щом си там значи е имало промяна в състоянието на порта и винаги го нулираш. После това olda=0x07 малко не го разбирам като идея, нали olda се изпозлва за да откриеш на кой пин имаш промяна, защо му задаваш ти стойност, тя трябва да си идва от реалното състояние на порта.
|
| Чет Сеп 15, 2011 10:36 pm |
|
 |
|
stojo
Ранг: Минаващ
Регистриран на: Чет Авг 18, 2011 3:44 pm Мнения: 27
|
 Re: Моля за малко помощ
INTCON.B0 е нулевия бит на регистър intcon. Този бит е флага за прекъсване при промяна на пот А т.е. RAIF. Идеята ми е да го нулирам тогава, когато състоянието на пина, който е предизвикал прекъсването се върне в началното т.е. стане 1, тъй като към управляващите пинове имам външни пул уп резистори. olda го приравнявам към 0х07, щото това е състоянието на порта при което вече може да излезе от прекъсването.
|
| Чет Сеп 15, 2011 11:03 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Моля за малко помощ
Ммм не знам какво прави тази програма, но така ти никога не излизаш от прекъсване, стоиш си все там защото не си си изчистил флага, и то все влиза в прекъсване. Това нещо дори да махнем проблема с прексъването не се прави така. В прекъсването само трябва да определиш кой пин се е променил и евентуално какво му е състоянието,от там ще си сетваш флагове които да следиш в main цикъла, и там ще правиш каквото правиш.
|
| Чет Сеп 15, 2011 11:47 pm |
|
 |
|
didofen
Ранг: Популярен
Регистриран на: Вто Юни 27, 2006 11:13 am Мнения: 381 Местоположение: Варна
|
 Re: Моля за малко помощ
нали се разбрахме, че аконе нулираш флага, няма да излезеш от прекъсване, т.е. излиза се, но веднага се влиза отначало пак
|
| Съб Сеп 17, 2011 11:50 am |
|
 |
|
stojo
Ранг: Минаващ
Регистриран на: Чет Авг 18, 2011 3:44 pm Мнения: 27
|
 Re: Моля за малко помощ
ToHu мерси много, дай ми идея как в main независимо да забавям прехода от 1 към 0 на 3те пина от порт С.
|
| Пон Сеп 19, 2011 3:28 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Моля за малко помощ
Ами ... най-тъпото е да имаш delay, малко по-добре е да имаш for цикъл за всеки сигнал, най-добре, а и най-правилно, е да изпозвлаш таймер, ако бeше малко по човешко CPU имаше много лесно решение, но не е и нямаш добър модул таймери, та вземаш таймер 1, който е 16 битов, и в зависимост от това с каква прециност искаш да генерираш тия импулси го клокваш с различна честота, да речем период 1 ms, така таймера се препълва на 65536. В прекъсванеот на таймер едно пишеш systime++; //systime ти е int32
в прекъсването където определяш кой е задействания вход пишеш :
if(.....) { input_x_change=true; time_x=get_timer_1(); time_x_systime=systime; }
И в майна имаш:
if(!output_x_state) { if(front_up) { output_x=true; output_x_state=true; } } else { if(front_dwn) { if(systime>time_x_systime) { if((65535-time_x)>(pulse_width-get_timer_1()) { output_x=false; output_x_state=false; } } else { if((get_timer_1()-time_x)>pulse_width) { output_x=false; output_x_state=false; } } } }
Идеята е проста, но за да вземеш в предвид че таймера се нулира всеки 65 секунди, и може да си взел стойност близка до 65535 и след това да имаш стойности по малки от нея проверяваш дали има и промяна в константата която инкрементваш, и ако се е инкрементнала смяташ отчитайки превъртането на таймера. Тук вече може да се оптимизира с цел намаляване броя инструкции, за това изчисление.
В този слуай липсва само проверка дали и systime не е превъртяло, но с оглед че е 32 битово, това са ти 1^32*65536/1000 секунди, което не е никак малко има няма 320 хиляди дни. е ако го цъкаш с 1 uS ще са 1000 пъти по малко.
|
| Пон Сеп 19, 2011 5:40 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Моля за малко помощ
Мммм то има и едно по лесно решение де пак с таймера, простъо в таймера имаш 4 променливи : time_inp_1++; time_inp_2++; time_inp_3++; time_inp_4++;
това в прекъсване по таймера.
В прекъсването по входа имаш if(.....) { input_x_change=true; }
А в main цикъла има:
if(inp_x_change) { if(!output_x_state) { time_inp_1=0; output_x=0; output-x_state=true; } else { if(time_inp_1>pulse_width) { output_x=false; output_x_state=false; } } }
като тук вече таймера трбявада с епрепълва за минималното време с което искаш да регулираш импулса, примерно 1 ms, в този случай timer0 е по подходящ.
|
| Пон Сеп 19, 2011 5:46 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|