-
Постов
23 -
Зарегистрирован
-
Посещение
Информация о Владислав Бобриков
- День рождения 10.01.1998
Контакты
-
Skype
vladonka1
Информация
-
Пол
Мужчина
-
Город
Кременчуг
Электроника
-
Стаж в электронике
1-2 года
-
Сфера радиоэлектроники
Радиосвязь, микрокотнроллеры, автоматика, робототехника
Посетители профиля
1 177 просмотров профиля
Достижения Владислав Бобриков
-
Я имел ввиду, что функция, обрабатывающая прерывания "идет". Кажется до меня немного доходит, то есть если я впишу в прерывание открытие реле, то оно в одном прерывании откроется и будет открытым, независимо от сигнала, а потом в основном цикле программы(по таймеру, без delay), проверить, допустим, через 3 секунды на пине высокий уровень ? тогда оставить реле включенным, если низкий - оффнуть. Или не очень правильно мыслю ?)
-
Всем привет ! Программу доделал, устройство на макетной плате собрал, скоро буду в диптрейсе делать разводку реальной платы. Всем спасибо за помощь, скоро выложу все исходники ! Есть последняя проблема, оказывается нужно еще подключить реле, с этим проблем нет, но на катушку реле напряжение с порта(естественно через транзистор) должно подаваться при определенном условии: когда идет вода через датчик воды(в нем датчик холла на каретке). В программе счет проливаемой через датчик воды идет по внешнему прерыванию, но если я втулю открытие порта по прерыванию то реле будет тупо щелкать(потому что прерывания по нарастаящему фронту), но мне нужно сделать так, чтобы допустим вода льется, прерывания идут, тогда реле открыто все время(не щелкая), а когда например прерываний нет, то есть сигнал с датчика это 0, то реле закрыто. Как это реализовать ? Понятия не имею
-
Можно ли запрещать и разрешать глобальные прерывания (я так понимаю это команда еще является разрешением прерывания и для таймера) внутри функции, которая используется в главном цикле программы вайл ? Ну то есть, допустим на вход порта Б бита ноль 0 подавалась единица. Вдруг она пропала, флаг стал нулем, описана функция, когда вызывается, если флаг становиться нулем, и в этой функции идет запрет на прерывания, отключения клапана, и крутиться бесконечный цикл, до тех пор, пока уровень на пине б.0 не станет снова высоким ? После того как стал высоким, прерывания разрешаются, флаг становиться единицей и программа выходит из этой функции в основной бесконечный цикл вайл. Или же есть какие-то нюансы по поводу запретов и разрешений внешнего прерывания, и прерывания по переполнению таймера ?
-
еще 2 итерации сделаны для того, чтобы можно было удалить последний символ через клавишу звездочка, и "ввести", то есть подтвердить ввод клавишей решетка. Не могу понять, как сделать, чтобы функция вызывалась единожды. Ну то есть я поместил код опроса клавы в функцию. Аргумент у него некий флаг, внутри функции происходит опрос если флаг==0, а после опроса становиться единицей. флаг занесен в епром. При выключении питания и включении заново происходит снова опрос. Как сделать, чтобы функция ввода значений клавы вызывалась единожды при первом запуске ?
-
Блин, возникла та же проблема что и была, с переводом числа. Ну то есть я влезаю в диапазон лонг инт. В первую настройку ввожу 999999 во вторую настройку ввожу 9999 они вводятся в массив, после этого конвертируются в лонг инт, и снова конвертируются, но в другом массив с таким же типом, как и был до этого. этот же код у меня работал до этого, а потом перестал. Вторая настройка, в которой всего 4 разряда, конвертируется так, словно ей не хватает диапазона. (пробовал unsigned и signed) Вот код: #include <mega16.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <delay.h> #include <alcd.h> #include <keyboard.h> eeprom unsigned long int FZ=0; eeprom unsigned long int MR=0; char buf=0; char FZ_[6]; char MR_[4]; char kek[6]; char kek1[4]; int i; unsigned long int temp_FZ=0,TEMP_FZ1=0; unsigned long int temp_MR=0,TEMP_MR1=0; void main(void) { lcd_init(16); KEYB_Init(); while (1) { for( i = 0; i<8; i++) { if(i == 7) { do { KEYB_ScanKeyboard(); buf = KEYB_GetKey(); } while(buf != '#'); break; } do { KEYB_ScanKeyboard(); buf = KEYB_GetKey(); } while(buf == NULL); if(buf == '*') { FZ_[i-1] =' '; lcd_gotoxy(0,1); lcd_putsf("FZ"); lcd_gotoxy((i-1),0); lcd_putchar(FZ_[i-1]); i = i-2; } else { if(i<6) { FZ_[i] = buf; lcd_gotoxy(0,1); lcd_putsf("FZ"); lcd_gotoxy(i,0); lcd_putchar(FZ_[i]); } } } temp_FZ=atol(FZ_); FZ=temp_FZ; TEMP_FZ1=FZ; ltoa(TEMP_FZ1, kek); delay_ms(5000); lcd_clear(); for(i=0;i<6;i++) { if(i == 5) { do { KEYB_ScanKeyboard(); buf = KEYB_GetKey(); } while(buf != '#'); break; } do { KEYB_ScanKeyboard(); buf = KEYB_GetKey(); } while(buf == NULL); if(buf == '*') { MR_[i-1] =' '; lcd_gotoxy(0,1); lcd_putsf("MR"); lcd_gotoxy((i-1),0); lcd_putchar(MR_[i-1]); i = i-2; } else { if(i<4) { MR_[i] = buf; lcd_gotoxy(0,1); lcd_putsf("MR"); lcd_gotoxy(i,0); lcd_putchar(MR_[i]); } } } temp_MR=atol(MR_); MR=temp_MR; TEMP_MR1=MR; ltoa(TEMP_MR1, kek1); delay_ms(5000); lcd_clear(); // lcd_gotoxy(0,0); // lcd_puts(kek); lcd_gotoxy(0,0); lcd_putchar(kek[0]); lcd_gotoxy(1,0); lcd_putchar(kek[1]); lcd_gotoxy(2,0); lcd_putchar(kek[2]); lcd_gotoxy(3,0); lcd_putchar(kek[3]); lcd_gotoxy(4,0); lcd_putchar(kek[4]); lcd_gotoxy(5,0); lcd_putchar(kek[5]); lcd_gotoxy(0,1); lcd_putchar(kek1[0]); lcd_gotoxy(1,1); lcd_putchar(kek1[1]); lcd_gotoxy(2,1); lcd_putchar(kek1[2]); lcd_gotoxy(3,1); lcd_putchar(kek1[3]); } }
-
Таймер сделал на 1 сек. Обычный. Т.е. прерывания происходят каждую 1 сек. Пытаюсь разобраться как же удалять символы. Ну допустим идет опрос клавиатуры нужно ввести пятизначное число, и ты на 3тьем символе просто ошибся, не будешь же ты вырубать питание и заново писать. Нужно придумать, как удалять символы. Я тут подумал в цикл опроса вставить условие, не нажата ли, например, звездочка. Если нажата, то счетчик цикла декрементируется, а последний записанный символ в массиве (counter-1) становится NULL. Только вот не знаю, как это повлияет на дисплей, если допустим этот алгоритм сработает, удалится число из массива, пропадет ли число на экране дисплея ? Или возможно станет каракулей ?