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

Members
  • Публикации

    20
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Новенький
  • День рождения 10.01.1998

Контакты

  • Skype
    vladonka1

Информация

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

Электроника

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

Посетители профиля

70 просмотров профиля
  1. Перевод строки в число и наоборот

    asm("sei") и asm("cli") , как я понимаю первое это глобальное разрешение, а второе - глобальный запрет ?
  2. Перевод строки в число и наоборот

    Можно ли запрещать и разрешать глобальные прерывания (я так понимаю это команда еще является разрешением прерывания и для таймера) внутри функции, которая используется в главном цикле программы вайл ? Ну то есть, допустим на вход порта Б бита ноль 0 подавалась единица. Вдруг она пропала, флаг стал нулем, описана функция, когда вызывается, если флаг становиться нулем, и в этой функции идет запрет на прерывания, отключения клапана, и крутиться бесконечный цикл, до тех пор, пока уровень на пине б.0 не станет снова высоким ? После того как стал высоким, прерывания разрешаются, флаг становиться единицей и программа выходит из этой функции в основной бесконечный цикл вайл. Или же есть какие-то нюансы по поводу запретов и разрешений внешнего прерывания, и прерывания по переполнению таймера ?
  3. Перевод строки в число и наоборот

    Все уже сделал, заработало, немного стресс, из-за того что сроки скоро подойдут. Сейчас работаю над тем, чтобы глобальное прерывания работало по нарастаящему фронту, когда 450 импульсов проходит, то из двух настроек минусуется единица(что символизирует литр).
  4. Перевод строки в число и наоборот

    Сделал, функция не вызвалась, сразу показало это: eeprom int flagz=0; ... void main{ ScanKeyBoard(flagz); while (1) { ...
  5. Перевод строки в число и наоборот

    еще 2 итерации сделаны для того, чтобы можно было удалить последний символ через клавишу звездочка, и "ввести", то есть подтвердить ввод клавишей решетка. Не могу понять, как сделать, чтобы функция вызывалась единожды. Ну то есть я поместил код опроса клавы в функцию. Аргумент у него некий флаг, внутри функции происходит опрос если флаг==0, а после опроса становиться единицей. флаг занесен в епром. При выключении питания и включении заново происходит снова опрос. Как сделать, чтобы функция ввода значений клавы вызывалась единожды при первом запуске ?
  6. Перевод строки в число и наоборот

    Только что вторую настройку МР сделал флоатом, а следовательно использовал atof и ftoa - все работает.
  7. Перевод строки в число и наоборот

    Блин, возникла та же проблема что и была, с переводом числа. Ну то есть я влезаю в диапазон лонг инт. В первую настройку ввожу 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]); } }
  8. Перевод строки в число и наоборот

    Таймер сделал на 1 сек. Обычный. Т.е. прерывания происходят каждую 1 сек. Пытаюсь разобраться как же удалять символы. Ну допустим идет опрос клавиатуры нужно ввести пятизначное число, и ты на 3тьем символе просто ошибся, не будешь же ты вырубать питание и заново писать. Нужно придумать, как удалять символы. Я тут подумал в цикл опроса вставить условие, не нажата ли, например, звездочка. Если нажата, то счетчик цикла декрементируется, а последний записанный символ в массиве (counter-1) становится NULL. Только вот не знаю, как это повлияет на дисплей, если допустим этот алгоритм сработает, удалится число из массива, пропадет ли число на экране дисплея ? Или возможно станет каракулей ?
  9. Перевод строки в число и наоборот

    Ну, это же учебный проект, чем больше извращений, тем больше интересно) А так, скорее всего буду юзать простой таймер
  10. Перевод строки в число и наоборот

    То есть, если установить только один бит WDIE, то собака будет работать в режиме прерывания по истечению, допустим, секунды ?
  11. Перевод строки в число и наоборот

    Теперь вот интересно, меня троллят сейчас, или нет))
  12. Перевод строки в число и наоборот

    .epp зашивать так же, как и .hex ? то есть сначала .hex, а потом .epp, или последовательность не важна ? Лол Это как же на вочдоге сделать по переполнению, если он потом просто будет перезагружать контроллер ?)
  13. Перевод строки в число и наоборот

    Всем привет ! Извиняюсь, что давно не было, приехал только с каникул. Так вот, подумал, что лучше будет просто записывать значения раз в два часа. На atmega16a 100к циклов перезаписи в eeprom'e, посчитав понял что хватит на 22 года с лишним. Еще посмотрел тесты памяти епром в Интернете, и если верить этим тестам, то AVR`ки делают с запасом, ну грубо говоря, при записи значений раз в 2 часа получим +-4 года. Возникло пару вопросов: 1) Можно ли сделать таймер, использовав внутренний RC-генератор ? Ну то есть я хочу, чтобы он тикал раз в секунду, или раз в час (хотя это наверное не реально, поэтому просто играясь с переменными можно получить желаемый результат), и будет ли он точным ? Или лучше использовать внешний кварц для бОльшей точности ? 2) Снова еепром. Почитав пару статей, узнал, что помимо .hex файла в контроллер нужно зашивать еще и .epp, который отвечает непосредственно за еепром. Но это говорили больше про программу Poteus, а не про реальные контроллеры (хотя чтобы загрузить этот .epp в Proteus нужно его преобразовать в .bin) . Так вот, нужно ли зашивать .epp в контроллер, и как это сделать ? (Использую AVRFlash от MicroElectrinica, шью через плату EasyAVR v7).
  14. Перевод строки в число и наоборот

    Спасибо) Убрал точку с запятой, получилось вывести на дисплей две настройки, но только посимвольно, потому что функция lcd_puts() выводит чушь на экран, хотя в нее кидаешь эти два массива с записанными значениями. Не могли бы ли вы подсказать пожалуйста, как правильно работать с епром ? То есть перед переменной нужно указать eeprom, или __eeprom, тут вроде бы разницы нет. Попробовал с ней поработать, но почему-то после выключения питания программа снова запрашивает ввод данных, хотя по сути должна показывать то, что записано в еепром на экран сразу, ввел условия if(FZ&&MR==NULL) тогда производить настройку; FZ и MR - переменные епром, в которые записаны значения настроек, после ввода пользователем. Но это почему-то не работает.
  15. Перевод строки в число и наоборот

    В общем, каким-то чудом у меня получило конвернтнуть, вывелось так, как и вводилось. Решил сразу вторую настройку написать, в которой уже не 5 разрядов, а 4. Ок, после первой настройки флаг стал равны единице, переходит во вторую настройку, пишу значение с клавы, ждет, и снова входит во вторую настройку , чтобы ввести значение с клавы. Странно, не могу понять почему происходит это зацикливание, хотя код такой же.. #include <mega16.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <delay.h> #include <alcd.h> #include <keyboard.h> #include <math.h> __eeprom long int FZ, MR; int flag; char buf=0; char FZ_[5]; char MR_[4]; char kek[5]; char kek1[4]; int t; int i; long int temp_FZ,TEMP_FZ1,temp_MR,TEMP_MR1; void main(void) { flag = 0; lcd_init(16); KEYB_Init(); while (1) { if(flag == 0) { for( i = 0; i<5; i++) { check_again: KEYB_ScanKeyboard(); buf = KEYB_GetKey(); if(buf == NULL) goto check_again; FZ_[i] = buf; lcd_gotoxy(0,1); lcd_putsf("FZ"); lcd_gotoxy(i,0); lcd_putchar(FZ_[i]); } flag=1; temp_FZ=atol(FZ_); FZ=temp_FZ; TEMP_FZ1=FZ; ltoa(TEMP_FZ1, kek); delay_ms(5000); lcd_clear(); } if(flag == 1); { flag=2; for(i=0;i<4;i++) { check_again1: KEYB_ScanKeyboard(); buf = KEYB_GetKey(); if(buf == NULL) goto check_again1; 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_clear(); lcd_gotoxy(0,0); lcd_puts(kek); lcd_gotoxy(0,1); lcd_puts(kek1); lcd_clear(); } }