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

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


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

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

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

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

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

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

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

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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

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

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 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

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

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 пользователей онлайн

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

    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
    • А что нить из ассортимента активных щупов производства СССР..))
    • Типа такого: https://aliexpress.ru/item/2044864227.html?sku_id=58855020183
×
×
  • Создать...