Перейти к содержанию

Перевод строки в число и наоборот


Рекомендуемые сообщения

9 часов назад, Alex сказал:

Я вот не понимаю, к чему эти все извращения ?

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

Ссылка на комментарий
Поделиться на другие сайты

Таймер сделал на 1 сек. Обычный. Т.е. прерывания происходят каждую 1 сек.

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

Ссылка на комментарий
Поделиться на другие сайты

Нет такого понятия для МК как NULL. Что именно записывается туда, то и отобразится. В даташите на индикатор есть знакогенератор, просто пальчиком тыц-тыц и вы точно узнаете какой символ он отобразит. Но чтобы не гадать, не проще ли туда сразу занести ПРОБЕЛ?

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Блин, возникла та же проблема что и была, с переводом числа. Ну то есть я влезаю в диапазон лонг инт.

В первую настройку ввожу 999999
во вторую настройку ввожу 9999

они вводятся в массив, после этого конвертируются в лонг инт, и снова конвертируются, но в другом массив с таким же типом, как и был до этого.
этот же код у меня работал до этого, а потом перестал. Вторая настройка, в которой всего 4 разряда, конвертируется так, словно ей не хватает диапазона. (пробовал unsigned и signed)

photo_2019-01-16_23-05-35.thumb.jpg.3be3a4922b41927eae15a6c1b1d00b65.jpg

photo_2019-01-16_23-05-37.thumb.jpg.ff060d21f11ddc2eec1828fc8e2e4aa7.jpg

 

photo_2019-01-16_23-05-35.thumb.jpg.3be3a4922b41927eae15a6c1b1d00b65.jpg


Вот код:

 

#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]);
     
         
         
        
     
 }     
        
}

 

photo_2019-01-16_23-05-38.jpg

Изменено пользователем Владислав Бобриков
Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 минуту назад, Alex сказал:

Копайте в сторону размера буферов

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

Ссылка на комментарий
Поделиться на другие сайты

Интересно ещё вот что.
В цикле

for(i=0;i<6;i++)

у Вас имеется конструкция

MR_[i-1] =

Вы уверены, что тут всё верно ?

Ну и, конечно же, размер массива MR_ = всего 4-ём. А цикл до 6-ти. О чём я уже выше говорил.

PS: К чему такая жадность, при выделении памяти под массивы ? :)

Ссылка на комментарий
Поделиться на другие сайты

еще 2 итерации сделаны для того, чтобы можно было удалить последний символ через клавишу звездочка, и "ввести", то есть подтвердить ввод клавишей решетка.

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

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, Владислав Бобриков сказал:

Как сделать, чтобы функция ввода значений клавы вызывалась единожды при первом запуске ?

Сделать её вызов 1 раз при запуске. Что логично :)

int main(){
  func();    // Вызываем 1 раз при запуске.
  
  while(1){
    ...
    ...  
  }
  
}

 

Ссылка на комментарий
Поделиться на другие сайты

Все уже сделал, заработало, немного стресс, из-за того что сроки скоро подойдут.

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

Ссылка на комментарий
Поделиться на другие сайты

Можно ли запрещать и разрешать глобальные прерывания (я так понимаю это команда еще является разрешением прерывания и для таймера) внутри функции, которая используется в главном цикле программы вайл ?


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

Или же есть какие-то нюансы по поводу запретов и разрешений внешнего прерывания, и прерывания по переполнению таймера ?

Ссылка на комментарий
Поделиться на другие сайты

Запрещать и разрешать можно, лишь бы это соответствовало вашим целям.

Если прерывания запрещены глобально, то не только таймер перестанет их генерировать, но и все другие источники.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Только что, ARV сказал:

Запрещать и разрешать можно

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

Ссылка на комментарий
Поделиться на другие сайты

Всем привет !
Программу доделал, устройство на макетной плате собрал, скоро буду в диптрейсе делать разводку реальной платы.

Всем спасибо за помощь, скоро выложу все исходники !

Есть последняя проблема, оказывается нужно еще подключить реле, с этим проблем нет, но на катушку реле напряжение с порта(естественно через транзистор) должно подаваться при определенном условии: когда идет вода через датчик воды(в нем датчик холла на каретке). В программе счет проливаемой через датчик воды идет по внешнему прерыванию, но если я втулю открытие порта по прерыванию то реле будет тупо щелкать(потому что прерывания по нарастаящему фронту), но мне нужно сделать так, чтобы допустим вода льется, прерывания идут, тогда реле открыто все время(не щелкая), а когда например прерываний нет, то есть сигнал с датчика это 0, то реле закрыто. Как это реализовать ? Понятия не имею

Ссылка на комментарий
Поделиться на другие сайты

12 минуты назад, Владислав Бобриков сказал:

Как это реализовать ? Понятия не имею

Для начала, ответьте себе на вопрос : Что для Вас значит "прерывания идут" или "прерывания не идут" ? С технической точки зрения.
Тогда решение само придёт в голову.

Ссылка на комментарий
Поделиться на другие сайты

ну, прерывание вызывается по нарастающему фронту с датчика холла, если же сигнал на пине, который ответственный за внешнее прерывание, другой, то внешнее прерывание не вызывается

Ссылка на комментарий
Поделиться на другие сайты

Я имел ввиду, что функция, обрабатывающая прерывания "идет".

Кажется до меня немного доходит, то есть если я впишу в прерывание открытие реле, то оно в одном прерывании откроется и будет открытым, независимо от сигнала, а потом в основном цикле программы(по таймеру, без delay), проверить, допустим, через 3 секунды на пине высокий уровень ? тогда оставить реле включенным, если низкий - оффнуть. Или не очень правильно мыслю ?)

Ссылка на комментарий
Поделиться на другие сайты

Очень правильно мыслите.
"Идут прерывания", в Вашем случае, - за определённый период появилось хоть одно прерывание. Что я и хотел от Вас услышать.
Ну а как Вы это уже реализуете - Вам видней.

Ссылка на комментарий
Поделиться на другие сайты

Я бы перефразировал это определение - Вода течёт пока прерывания происходят чаще чем одно в N секунд т.е. при расстоянии между прерываниями в N секунд и более. Это уже похоже на перезапускаемый одновибратор.

Реализация проста - в прерывании устанавливаем счетчик в N а в основном цикле проверяем если счетчик НЕ НОЛЬ - включить реле, уменьшить значение счетчика. Если НОЛЬ - выключить реле и не считать.
Счетчик не обязательно в секундах, это могут быть десятые доли секунды, и тогда надо выставлять 50 для задержки в 5 сек.

Но и тут есть ньюанс. Если расход будет такой что будет выдавать импульсы с периодом примерно около выставленного значения... то реле будет постоянно щелкать. Надо добавить ещё вторую выдержку - после отключения отсчитать ещё минимум секунду в течении которой будет действовать запрет на включение реле.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...