Jump to content

Владислав Бобриков

Members
  • Content Count

    23
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Владислав Бобриков

  • Rank
    Новенький
  • Birthday 01/10/1998

Контакты

  • Skype
    vladonka1

Информация

  • Пол
    Мужчина
  • Город
    Кременчуг

Электроника

  • Стаж в электронике
    1-2 года
  • Сфера радиоэлектроники
    Радиосвязь, микрокотнроллеры, автоматика, робототехника

Recent Profile Visitors

183 profile views
  1. Я имел ввиду, что функция, обрабатывающая прерывания "идет". Кажется до меня немного доходит, то есть если я впишу в прерывание открытие реле, то оно в одном прерывании откроется и будет открытым, независимо от сигнала, а потом в основном цикле программы(по таймеру, без delay), проверить, допустим, через 3 секунды на пине высокий уровень ? тогда оставить реле включенным, если низкий - оффнуть. Или не очень правильно мыслю ?)
  2. ну, прерывание вызывается по нарастающему фронту с датчика холла, если же сигнал на пине, который ответственный за внешнее прерывание, другой, то внешнее прерывание не вызывается
  3. Всем привет ! Программу доделал, устройство на макетной плате собрал, скоро буду в диптрейсе делать разводку реальной платы. Всем спасибо за помощь, скоро выложу все исходники ! Есть последняя проблема, оказывается нужно еще подключить реле, с этим проблем нет, но на катушку реле напряжение с порта(естественно через транзистор) должно подаваться при определенном условии: когда идет вода через датчик воды(в нем датчик холла на каретке). В программе счет проливаемой через датчик воды идет по внешнему прерыванию, но если я втулю открытие порта по прерыванию то реле будет тупо щелкать(потому что прерывания по нарастаящему фронту), но мне нужно сделать так, чтобы допустим вода льется, прерывания идут, тогда реле открыто все время(не щелкая), а когда например прерываний нет, то есть сигнал с датчика это 0, то реле закрыто. Как это реализовать ? Понятия не имею
  4. asm("sei") и asm("cli") , как я понимаю первое это глобальное разрешение, а второе - глобальный запрет ?
  5. Можно ли запрещать и разрешать глобальные прерывания (я так понимаю это команда еще является разрешением прерывания и для таймера) внутри функции, которая используется в главном цикле программы вайл ? Ну то есть, допустим на вход порта Б бита ноль 0 подавалась единица. Вдруг она пропала, флаг стал нулем, описана функция, когда вызывается, если флаг становиться нулем, и в этой функции идет запрет на прерывания, отключения клапана, и крутиться бесконечный цикл, до тех пор, пока уровень на пине б.0 не станет снова высоким ? После того как стал высоким, прерывания разрешаются, флаг становиться единицей и программа выходит из этой функции в основной бесконечный цикл вайл. Или же есть какие-то нюансы по поводу запретов и разрешений внешнего прерывания, и прерывания по переполнению таймера ?
  6. Все уже сделал, заработало, немного стресс, из-за того что сроки скоро подойдут. Сейчас работаю над тем, чтобы глобальное прерывания работало по нарастаящему фронту, когда 450 импульсов проходит, то из двух настроек минусуется единица(что символизирует литр).
  7. Сделал, функция не вызвалась, сразу показало это: eeprom int flagz=0; ... void main{ ScanKeyBoard(flagz); while (1) { ...
  8. еще 2 итерации сделаны для того, чтобы можно было удалить последний символ через клавишу звездочка, и "ввести", то есть подтвердить ввод клавишей решетка. Не могу понять, как сделать, чтобы функция вызывалась единожды. Ну то есть я поместил код опроса клавы в функцию. Аргумент у него некий флаг, внутри функции происходит опрос если флаг==0, а после опроса становиться единицей. флаг занесен в епром. При выключении питания и включении заново происходит снова опрос. Как сделать, чтобы функция ввода значений клавы вызывалась единожды при первом запуске ?
  9. Только что вторую настройку МР сделал флоатом, а следовательно использовал atof и ftoa - все работает.
  10. Блин, возникла та же проблема что и была, с переводом числа. Ну то есть я влезаю в диапазон лонг инт. В первую настройку ввожу 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]); } }
  11. Таймер сделал на 1 сек. Обычный. Т.е. прерывания происходят каждую 1 сек. Пытаюсь разобраться как же удалять символы. Ну допустим идет опрос клавиатуры нужно ввести пятизначное число, и ты на 3тьем символе просто ошибся, не будешь же ты вырубать питание и заново писать. Нужно придумать, как удалять символы. Я тут подумал в цикл опроса вставить условие, не нажата ли, например, звездочка. Если нажата, то счетчик цикла декрементируется, а последний записанный символ в массиве (counter-1) становится NULL. Только вот не знаю, как это повлияет на дисплей, если допустим этот алгоритм сработает, удалится число из массива, пропадет ли число на экране дисплея ? Или возможно станет каракулей ?
  12. Ну, это же учебный проект, чем больше извращений, тем больше интересно) А так, скорее всего буду юзать простой таймер
  13. То есть, если установить только один бит WDIE, то собака будет работать в режиме прерывания по истечению, допустим, секунды ?
  14. .epp зашивать так же, как и .hex ? то есть сначала .hex, а потом .epp, или последовательность не важна ? Лол Это как же на вочдоге сделать по переполнению, если он потом просто будет перезагружать контроллер ?)
×
×
  • Create New...