Jump to content

Recommended Posts

как-то так:

volatile unsigned char temp_UART;
struct temp_tames {
unsigned char minutes ;
unsigned char hours ;
}
volatile union{						
struct temp_tames	 clock;	
unsigned int			  times;
}Tcurrent, Ton , Toff;


Ton.clock.hours = 15;
Ton.clock.minutes = 45;
Toff.clock.hours = 18;
Toff.clock.minutes = 30;


if ( (Ton.times <= Tcurrent.times)&&(Tcurrent.times <= Toff.times) )
{
 // что-то работает
}

Share this post


Link to post
Share on other sites

Вот лобовое решение по сравнению времени в таком формате

signed char compare_time(unsigned int hour1, unsigned char min1, unsigned int hour2, unsigned char min2){
if(hour1 < hour2)return -1; //если "часы" различаются - сравнивать "минуты" нет смысла
 else if(hour1 > hour2)return 1;
if(min1 < min2) return -1; //если "часы" одинаковы, придется сравнивать "минуты"
 else if(min1 > min2) return 1;
return 0; //если и "минуты" не отличаются, либо сравниваем секунды (и так далее), либо говорим, что времена совпали точно.
}

Но проще хранить его как одно число, unsigned long хотя бы.

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

Системы телеметрии находят все более широкое применение во многих отраслях на промышленных и коммунальных объектах. Требования, предъявляемые к условиям эксплуатации приборов телеметрии и, как следствие, источников питания для них, могут быть довольно жесткими. Fanso предоставляет широкую линейку продукции, рассчитанной на различные условия эксплуатации, что позволяет подобрать батарейку для каждого конкретного применения, в том числе и для устройств телеметрии.

Подробнее

Вот лобовое решение по сравнению времени в таком формате

.........

Но проще хранить его как одно число, unsigned long хотя бы.

жуть.... :shok:

представляю что начнется, когда ТС дойдет до условия к примеру:

Твкл=22:30

Твыкл=04:30

:spiteful:

unsigned long для хранения часов и минут занабто , достаточно unsigned int .....

Share this post


Link to post
Share on other sites
                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

Подробнее...

представляю что начнется, когда ТС дойдет до условия к примеру:

Твкл=22:30

Твыкл=04:30

Вот так, шаг за шагом, ТС придет к использованию системы исчисления времени, применяемой в современных компьютерах: просто считаются секунды, начиная с 1970г. До 2034го доживем, а там видно будет... Обошли ведь однажды проблему миллениума :)

ПС. Не пойму, откуда у меня в башке эти пределы? Сейчас посмотрел календарь в компе - 1980....2099гг. :unknw:

Edited by КЭС

Share this post


Link to post
Share on other sites

Твкл=22:30

Твыкл=04:30

Заведомо знал, что реализовать переход через 00:00, будет сложновато, и скорее всего ни к чему

Share this post


Link to post
Share on other sites

unsigned long для хранения часов и минут занабто , достаточно unsigned int .....

Все нормально, с запасом на 8000 лет :-)

Share this post


Link to post
Share on other sites

Эх... Я знал, что найдутся люди, которые не выдержат и напишут решение :)

Совсем не дают людям поработать мозгом :unsure:

Кстати, si4karuk, послушайте что говорит КЭС. В его посте реальная подсказка :)

Share this post


Link to post
Share on other sites

Может сразу создать свой компьютер??

Я Вас не понимаю, вы разговариваете о высших материях, не учитывая что я чайник

Edited by si4karuk

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

То есть в сутках 1440 минут, или 86400 секунд их сравнивать?

#include <avr/io.h>
#define F_CPU 1000000UL
unsigned int sutci_min;
unsigned long sutki_sec;
unsigned char hour;
unsigned char min;
unsigned char second;
int main(void)
{
   while(1)
   {
 hour =  2;
 min = 6;
 second = 24;
 sutci_min = (hour*60)+min;
 sutki_sec = (((hour*60)+min)*60)+second;
   }
}

Я на верном пути??

Edited by si4karuk

Share this post


Link to post
Share on other sites

Это один из вариантов, но проще и отсчет вести в секундах, а в часы, дни и минуты переводить только для отображения. Причем, учитывая размеры типов данных и то, что точность нужна вроде до минут, можно сделать примерно так:

unsigned int min=0;
unsigned char flags=0;
unsigned int time1,time2;

#define CYCLES_IN_MINUTE=12345 //сколько прерываний таймера происходит за 1 минуту. Не всегда можно подобрать, чтобы было ровно одно прерывание а секунду.
#define FLAG_MIN=(1<<0)

ISR(TIMER0_CMPA){
static unsigned int cycles=0; //тип данных зависит от CYCLES_IN_MINUTE
if(++cycles>CYCLES_IN_MINUTE){
 cycles=0;
 min++; //отсчет минут
 flag |= FLAG_MIN; //флаг того, что началась новая минута
}
}
void displey_time(){
// преобразование min в дни+часы+минуты и отображение на индикаторе. 
}
int main(){
...
while(1){
...
 if(flag && FLAG_MIN){
  displey_time();
  if((min-time1>0) && (min-time2>0)){ //если не ошибаюсь это поможет при переполнении, хотя 45,5 дней - приличный запас
   /*код при попадании в диапазон*/
   flag &= FLAG_MIN;
  }
 }
}
}

В коде я намеряно допустил 7 ошибок, так что простор для работы мозга остается.

Share this post


Link to post
Share on other sites
В коде я намеряно допустил 7 ошибок, так что простор для работы мозга остается.

Особенно вы, поражаете меня своими подсказками :blink:

Share this post


Link to post
Share on other sites

То есть в сутках 1440 минут, или 86400 секунд их сравнивать?

#include <avr/io.h>
#define F_CPU 1000000UL
unsigned int sutci_min;
unsigned long sutki_sec;
unsigned char hour;
unsigned char min;
unsigned char second;
int main(void)
{
while(1)
{
hour = 2;
min = 6;
second = 24;
sutci_min = (hour*60)+min;
sutki_sec = (((hour*60)+min)*60)+second;
}
}

Я на верном пути??

в микроконтроллере наверно память резиновая? ты представляешь во что развернет компилятор твои умножения? не говоря уже о том сколько статических переменных тебе потребуется для хранения этой байды , ты уже 9 байт занял... , а тебе еще время включения и выключения хранить где-то надо....

дал же код... 6 байт для всех переменных , всего одна проверка, что еще нужно?

Share this post


Link to post
Share on other sites

В пару операторов mul, это не так уж много. Статических переменных тоже не слишком много, под это даже регистров хватит, не говоря об ОЗУ. То есть неоптимально, конечно, но вполне терпимо. Другое дело, что есть более простые способы. Кстати, перевод из одной переменной в строку/массив займет гораздо больше времени и памяти, но выполняться он будет раз в минуту или раз в секунду, то есть крайне редко, и эта задержка будет незаметна.

Особенно вы, поражаете меня своими подсказками :blink:

Могут быть еще незамеченные ошибки. А поиск ошибок в чужом коде тоже обучение в некотором роде.

Share this post


Link to post
Share on other sites

Начнём с Вашего кода :

if ((hour >= hour_on_1) & (hour <= hour_off_1))
{
if ((minute >= minute_on_1) && (minute <= minute_off_1))
{
OUTPUT_ON;
}
}

Вот Вы сравнили часы, попали они в диапазон. Зачем сравнивать потом минуты, если часы уже попали ? Минуты нужно сравнивать, если часы не попали в диапазон, а точнее - стали равны !

Как то, примерно, так :

if ((hour > hour_on_1) && (hour < hour_off_1)) return 1;
if (hour == hour_on_1){
 if (minute > minute_on_1) return 1;
}
if (hour == hour_off_1){
 if (minute < minute_off_1) return 1;
}
return 0;

Что касается всех вышесказанных "тайн о высших материях".

Создайте функцию, которая будет переводить Ваши сравниваемые точки в количество минут, прошедших от определённого момента (Если с датой, то например от 01-01-2010, 00:00. Если без даты, то от 00:00 текущего дня). Дальше тупо сравнение этих преобразованных чисел. Всё.

Share this post


Link to post
Share on other sites

И ещё, небольшой совет на будущее.

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

typedef struct{
 unsigned char hour;
 unsigned char min;
}t_time;
t_time time_cur, time_on, time_off;

C ними проще будет работать. Особенно, если таких "точек" будет множество.

Share this post


Link to post
Share on other sites

Здравствуйте!

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

:100000000C942A001895000018950000189500001F
:10001000189500001895000018950000189500002C
:10002000189500001895000018950000189500001C
:10003000189500001895000018950000189500000C
:1000400018950000189500001895000018950000FC
:10005000189500008FE58DBFC8E3E0E24E2E84E0E6
:100060008EBFD4E0F4E05F2EA89584B7082E877F7A
:1000700084BF88E1992781BD91BDEEEFF3E0A0E652
:10008000B0E088278D933197E9F76624D79ADF9AF5
:1000900080ED97E00E945E00DF9880ED97E00E947F
:1000A0005E000C944700F894FFCF3197F1F7089564
:1000B000689462F80895E89462F80895EF93FF93C6
:1000C000EE27E82BE92B31F0E4E5F4E03197F1F786
:0A00D0000197D1F7FF91EF91089519
:00000001FF

а при считывании получаю

:200000000C942A00189500001895000018950000189500001895000018950000189500005B
:20002000189500001895000018950000189500001895000018950000189500001895000058
:2000400018950000189500001895000018950000189500008FE58DBFC8E3E0E24E2E84E032
:200060008EBFD4E0F4E05F2EA89584B7082E877F84BF88E1992781BD91BDEEEFF3E0A0E63C
:20008000B0E088278D933197E9F76624D79ADF9A80ED97E00E945E00DF9880ED97E00E9404
:2000A0005E000C944700F894FFCF3197F1F70895689462F80895E89462F80895EF93FF93DA
:1E00C000EE27E82BE92B31F0E4E5F4E03197F1F70197D1F7FF91EF910895FFFFFF91DD
:00000001FF

Это нормально?

Share this post


Link to post
Share on other sites

Содержимое сравнивай прошивок, а не промежуточный файл для её хранения. в HEX-е размер строки не фиксирован, а там еще масса служебных полей есть в отличие от самой прошивки поэтому и отличаются. Сливай прошивку в .BIN и сравнивай.

Share this post


Link to post
Share on other sites

А если т ак? Тут я типа перевожу часы в минуты, потом соавниваю уже именно минуты.

uint8_t clock(char th1,char th2,char tm1,char tm2)
{
if (((hour*60)+minute) >= ((th1*60)+tm1))
{
if (((hour*60)+minute) <= ((th2*60)+tm2))
{
return 0;
}
}
return 1;
}

Как вы смотрите на такой вариант??

Структуры, хорошая штука

Edited by si4karuk

Share this post


Link to post
Share on other sites

unsigned int time_to_minute(t_time time){
return (unsigned int)time.hour*60 + time.minute;
}

if( (time_to_minute(time_cur)>=time_to_minute(time_on)) && (time_to_minute(time_cur)<time_to_minute(time_off)) ){ // Попали в диапазон
....
}

Как то, приблизительно, так.

Share this post


Link to post
Share on other sites

Ну вообще, как бы логично одинаковые действия выносить в функции.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Максим123456789
      делаю диплом, в схеме у меня микроконтроллер PIC16F688 и мне нужно его заменить на ATmega. Не могу найти похожий
    • By Anton Bondarenko
      Всем привет
      Прошу не ругать, впервые подобный вопрос задаю.
      Хочу сделать прибор, который будет посылать сигнал, когда возле прибора будет проходить металлический предмет. 
      — угол отслеживания до 30° а лучше прямая линия, траектория
      — время реакции очень высокое до 100 мс
      — ширина проема в котором нужно сканировать от 10 до 20метров,
      — передача сигнала через вифи
      Может есть готовые решения, или отдельные компоненты.
      Подскажите пжл в каком направлении искать.
      Смотрел датчики движения, но главная проблема — время реакции.
      Спасибо
       
    • By Sofia Vin
      Предлагаем проектную работу в Москве:
      Микроконтроллер STM32F103.
        
      Есть встроенный код с использованием функций библиотеки FreeRTOS, код имеет описанный протокол для связи с внешним миром.
        
      Необходимо проводить доработку кода под задачи программиста верхнего уровня и его тестирование в составе оборудования. 
      Работа в лаборатории (м.Университет) и удаленно. 
      Оплата по договоренности.
      Если Вы обладаете опытом схемотехнического проектирования и программирования микроконтроллеров, и Вас заинтересовала данная возможность, ждем Ваши отклики по контактным данным:
      8 (925) 023-60-02   Алексей
      E-mail: nassa@marathon.ru
       
    • By Антон Плюшкин
      В общем есть небольшая тривиальная задача - сделать свитюльку. Контроллер управляет светодиодиками, цвета меняются, людишки довольны.
      Схема проста: Attiny44a -> 2n3904 x3 -> RGB-светодиод.
      Собрал, протестил, всё норм, но!
      Как только в коде я использую функцию задержки - _delay_ms (util/delay.h) - контроллер повисает!
      #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { // Input/Output Ports initialization // Port A initialization // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit3=In Bit2=Out Bit1=In Bit0=In DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit3=T Bit2=0 Bit1=T Bit0=T PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Non-Inverted PWM // Timer Period: 0,031875 ms // Output Pulse(s): // OC0A Period: 0,031875 ms Width: 0 us // OC0B Period: 0,031875 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Ph. correct PWM top=0x00FF // OC1A output: Non-Inverted PWM // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 0,031875 ms // Output Pulse(s): // OC1A Period: 0,031875 ms Width: 0 us // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-11: Off MCUCR=(0<<ISC01) | (0<<ISC00); GIMSK=(0<<INT0) | (0<<PCIE1) | (0<<PCIE0); // USI initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<ADC1D) | (0<<ADC2D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); unsigned char VL_OCR0A = 0, VL_OCR0B = 0, VL_OCR1A = 0; OCR0A = 0; OCR0B = 0; OCR1A = 0; while(1) { _delay_ms( 100 ); VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } } Т.е. если указать задержку в начале цикла, то светодиод не светится вообще.
      Если задержку убрать - светодиод немного подсвечивает всеми цветами.
      while(1) { _delay_ms( 100 ); // <--- ЗАДЕРЖКА --- VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } Где я накосячил?
      З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает
    • Guest Денис
      By Guest Денис
      В общем, есть такое чудо китайской техники (фото)
      Что оно может:
      1. Заряжаться через microUSB порт
      2. Кнопка вкл/выкл, она же переключает режимы
      3. 3 режима свечения светодиода (он светит разными цветами)
      Что я хочу сделать:
      1. Пункты 1 и 2 выше
      2. Разнообразить количество режимов, переливание статичный цвет и тд...
      Вопрос: как это сделать? что купить?

      P.S. К сожалению, в гугле не нашел подробной инструкции, а я в электронике я дуб дубом


  • Сообщения

    • Лишний нагрев КРЕНок 
    • Сделал себе 300-вольтовый пробник для светодиодов, преобразователь из Радио №3/1988 г., потом стабилизатор тока, ссылку на который давал Краб. Получилось очень даже не плохо, качает любые линейки.  
    • Походу, "приделать полотно к смычку" (штангенциркуль использовать как гаечный ключ) - как раз и есть "окуенное желание что-то написать на форуме."   Чиста жизненная среднестатистическая  выборка: 8-ми квартирный  дом, 8 семей самого среднего класса (рабочие, служащие (не армия), строитель, воспитатель, педагог, пенсионер....) и возраста (от 0.5, до 85)... у всех есть либо набор ключей, либо пассатижи, либо разводной ключ....., штангенциркуль есть только у меня (и не один, помимо прочего нужного инструментария) . Это я к тому, если у человека нет подходящего ключа, то у него скорее всего (99% )  нет и штангенциркуля. И типа "совет": - Если нет подходящего ключа, то воспользуйтесь штангенциркулем!! выглядит как: -  Если у Вас  в нужный момент не оказалось туалетной бумаги, то воспользуйтесь стекловатой. С уважением, Сергей
    • Нашел в своих закромах, продаю. Вроде не сильно б/у, лет так несколько назад я его проверял, светили все "пиксели" фото с инета, свои прикреплю чуть позже. Октябрьск , Самарской обл. 2500р.  
    • Зря, муйню надо возвращать обратно.
    • Как каким боком? Да хотя бы "лампочками" поморгать...
  • Покупай!

×
×
  • Create New...