|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:27 am
| Автор |
Съобщение |
|
nobodyshadow
Ранг: Почетен член
Регистриран на: Съб Окт 30, 2004 5:18 am Мнения: 691
|
 Re: Прекъсване на цикъл
Така както си го написал трябва да се извърти целия цикъл за да ти регистрира промяна в състоянието на бутона.Трябва да си пуснеш някакъв таймер който да ти генерира прекъсване на всяка секунда примерно и да ти проверява състоянието на бутона.
_________________ Не мога да знам всичко,а и не искам.Тогава би било прекалено лесно и скучно!
|
| Чет Окт 27, 2011 4:35 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
 Re: Прекъсване на цикъл
От теб се иска да седнеш и да откриеш разликите 
|
| Чет Окт 27, 2011 5:25 pm |
|
 |
|
SteEely
Ранг: Минаващ
Регистриран на: Съб Окт 01, 2011 11:00 pm Мнения: 24
|
 Re: Прекъсване на цикъл
 Ето какво се опитвам да направя: диодите от led-1 до led-4 са индикация кой канал работи, а led_out показва времевия пакет При включване светва по дефаут led-1(първи канал) out=1 (250s) out=0 (50s) след еднократно натискане на bt-1 светва led-2(втори канал) out=1 (200s) out=0 (50s) след двукратно натискане на bt-1 светва led-3(трети канал) out=1 (150s) out=0 (50s) след трикратно натискане на bt-1 светва led-4(четвърти канал) out=1 (100s) out=0 (50s) след четирикратно натискане на bt-1 светва led-1(пак първи канал) out=1 (250s) out=0 (50s) И проблема е, че когато добавя в кода времевите пакети не мога да реализирам прекъсване при натиснат бутон.
|
| Чет Окт 27, 2011 5:31 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
 Re: Прекъсване на цикъл
Явно ще трябва да ни "светнеш" какво е времеви пакет.
|
| Чет Окт 27, 2011 5:35 pm |
|
 |
|
SteEely
Ранг: Минаващ
Регистриран на: Съб Окт 01, 2011 11:00 pm Мнения: 24
|
 Re: Прекъсване на цикъл
Образно съм го написал  out=1 (200s) out=0 (50s) 200 секунди свети led_out 50 не свети
|
| Чет Окт 27, 2011 5:50 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
 Re: Прекъсване на цикъл
Това означава ли че ако натисна примерно 2 пъти един след друг бутона, то първия ти "времеви пакет" ще се прекъсне и ще започне да се изпълнява 2-рия или като свръши първия тогава втория започва да се изпълнява?
|
| Чет Окт 27, 2011 6:04 pm |
|
 |
|
SteEely
Ранг: Минаващ
Регистриран на: Съб Окт 01, 2011 11:00 pm Мнения: 24
|
 Re: Прекъсване на цикъл
Да трябва да се прекъсне (то това ми е проблема)
|
| Чет Окт 27, 2011 6:07 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
 Re: Прекъсване на цикъл
Ами седни малко и прочети как се реализират прекъсванията, настройка и четене на таймери. Като си сигурен че вече знаеш как да боравиш с тях - пиши да доизчистим идеята. Можеш да се опиташ да направиш един таймер който да извиква прекъсване на 1 секунда, което да ползваме за отправна точка на твоя проблем.
|
| Чет Окт 27, 2011 6:16 pm |
|
 |
|
itso.t
Ранг: Форумен бог
Регистриран на: Чет Фев 03, 2005 2:21 am Мнения: 12765 Местоположение: София
|
 Re: Прекъсване на цикъл
Принципно е хубаво да се стараеш да не използваш подобни закъснения. Това е загуба на машинно време. Направи го с брояч, таймер или комбинация от двете.
|
| Чет Окт 27, 2011 7:39 pm |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 Моите 50 ст.
 |  |  |  | Код: typedef unsigned char UInt8; typedef unsigned short UInt16;
#define LED_OUT RB0 #define BUTTON RB2 #define PATTERN_NUM 4
typedef struct { UInt8 channelsMask; UInt8 onTime; UInt8 offTime; } TPattern;
static UInt8 patternIndex; static UInt8 timer; static UInt8 stage; static const TPattern patterns[PATTERN_NUM] = { // channelMask, onTime, offTime { 0x10, 250, 50 }, // [0] { 0x20, 200, 50 }, // [1] { 0x40, 150, 50 }, // [2] { 0x80, 100, 50 } // [3] };
static void PatternManagement(void);
void main(void) { // Initializations patternIndex = 0; TRISB = 0;
// Нагласи си някой хардуерен таймер с период 1 секунда (TMR0, TMR2...) // Разреши си прекъсването от таймера PatternManagement(); GIE = 1; // Глобално разрешаване на прекъсванията
while (1) { if (1 == BUTTON) { PatternManagement();
while (1 == BUTTON) { // Чакаме да отпуснеш бутона } } } }
static void PatternManagement(void) { stage = 0; PORTB = patterns[patternIndex].channelsMask; timer = patterns[patternIndex].onTime; LED_OUT = 1;
// Тук презареждаш хардуерния таймер с 1 секунда // Разрешаваш прекъсването от хардуерния таймер
patternIndex++;
if (PATTERN_NUM == patternIndex) { patternIndex = 0; } }
static void interrupt(void) { if (1 == timer) { if (0 == stage) { timer = patterns[patternIndex].offTime; LED_OUT = 0; stage = 1; } else { timer = 0; // Забраняваш прекъсването от хардуерния таймер } } else { if (1 < timer) { timer--; } } }
|  |  |  |  |
|
| Пет Окт 28, 2011 1:46 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
 Re: Прекъсване на цикъл
 |  |  |  | Код: #include "D:\MyDocuments\Isdelia\test\buton.h" #byte port_a=0x05 #bit buton=0x06.0 #bit led_1=0x05.0 #bit led_2=0x05.1 #bit led_3=0x05.2 #bit led_4=0x05.3 #bit out_1=0x06.1
int16 time1, interval_1, interval_2; int1 pressed, button_press; int deb, press_time, state, temp;
typedef struct { int led; int16 int_1; int16 int_2; } Data_type;
static const Data_type data[4] = { // led, interval_1, interval_2 { 0x01, 25000, 5000 }, // [0] { 0x02, 20000, 5000 }, // [1] { 0x04, 15000, 5000 }, // [2] { 0x08, 10000, 5000 } // [3] };
#int_TIMER2 //interrupt any 10 ms void TIMER2_isr(void) { //generate time impuls time1++; if(out_1) // when output is High { if(time1==interval_1) { out_1=false; // set output to Low time1=0; } } else // when output is Low { if(time1==interval_2) { out_1=true; // set output to High time1=0; } } // check button state if(!buton) // when the button is pressed { if(pressed) // check press flag { press_time++; // increase debounce timer if(press_time>deb) //if impuls is long enought { button_press=true; press_time=0; } } else { pressed=true; // set press glag } } else { pressed=false; // reset press flag press_time=0; } }
void main() {
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DIV_BY_16,156,4); setup_ccp1(CCP_OFF); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); enable_interrupts(INT_TIMER2); enable_interrupts(GLOBAL); set_tris_a(0); set_tris_b(1);
//var & output init deb=10; //debounce time 10*10 = 100 ms state=0; // set state to 0 time1=0; // reset time1 variable interval_1=data[state].int_1; // set interval 1 interval_2=data[state].int_2; // set interval 2 port_a=0; // clear port a led_1=true; // set led1 out_1=true; // set output to high
// main program
while(true) { if(button_press) // when button is pressed { button_press=false; // clear button flag if(state>2) { state=0; } else { state++; } time1=0; // reset timer var out_1=true; // set output to true interval_1=data[state].int_1; // load int1 interval_2=data[state].int_2; // load int2 temp=port_a&0xF0; // get port A and set first 4 bytes to 0 port_a=temp|data[state].led; // set port A tiwh new LED value } } } |  |  |  |  |
ето ти нещо работещо, само не е направено да не превключва ако задържаш бутона натиснат, това лесно може да стане ако ти трябва. Ползва се таймер 2, настроен е да прекъсва всеки 10 ms. Всичко е на отделни редове за да тие по лесно да го четеш, кода е за CCS и pIC16F628, но пика няма значение.
|
| Нед Ное 06, 2011 7:42 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
 Re: Прекъсване на цикъл
п.с. гледам че колегата по горе ти е дал решение, би трябвало вече да си се справил със задачата.
|
| Нед Ное 06, 2011 11:28 pm |
|
 |
|
SteEely
Ранг: Минаващ
Регистриран на: Съб Окт 01, 2011 11:00 pm Мнения: 24
|
 Re: Прекъсване на цикъл
Благодаря на всички за помощта Търсих на много места информация книги ... какво ли не, и не намирах информация за пикове на С, и се ядосах и реших да се захвана с асемблер понеже имам много литература, а и преди години съм си правил прости програмки. Разгледах предложеното решение от @ТоНи ред по ред и поне се светнах как се работи с ISR-а а и доста неща ми се изясниха, но не ми е ясно каква е разликата между CSS компилатора и Hi-TechC защото при компилиране с Hi-TechC вади много грешки и е явно, че има разлика. Иска ми се да го реализирам на С защото другата част от кода е на С.
|
| Пон Ное 14, 2011 10:38 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
 Re: Прекъсване на цикъл
 |  |  |  | SteEely написа: Благодаря на всички за помощта Търсих на много места информация книги ... какво ли не, и не намирах информация за пикове на С, и се ядосах и реших да се захвана с асемблер понеже имам много литература, а и преди години съм си правил прости програмки. Разгледах предложеното решение от @ТоНи ред по ред и поне се светнах как се работи с ISR-а а и доста неща ми се изясниха, но не ми е ясно каква е разликата между CSS компилатора и Hi-TechC защото при компилиране с Hi-TechC вади много грешки и е явно, че има разлика. Иска ми се да го реализирам на С защото другата част от кода е на С. |  |  |  |  |
Не знам каква е разликата, HTC пробвах преди много години, сигурно 8, и нещо не ми хареса тогава, нямам спомени. Със сигурност ще има разлика в дефиниране на променливи, в това отношение CSS е нестандартен, както и в някои функции на компилатора, но такива мисля не съм изпозлвал, но не знам там дефинирането на бит дали е същото като в CSS.
|
| Чет Ное 17, 2011 1:41 am |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|