Обсуждаем контроллеры компании Atmel.
Ответить

Контроль уровня воды в баке на Атмега8

Пн мар 06, 2017 15:54:35

Два поплавка в баке, первый - бак пуст, второй - полон и два в колодце, первый - колодец пуст, второй колодец полон. Если в колодце кончается вода, то насос прекращает качать, как набирается, опять включается и качает пока не отработает датчик - бак полон или пока не опустошится колодец.
В протеус все работает, а когда выставляю во фьюзах внешний генератор на 8 МГЦ, то выдает ошибку и после не шьется, когда ставлю внутренний, то насос постоянно качает. Подскажите пожалуйста, что ему не хватает :) ?

Изображение

.equ XTAL = 8000000
.nolist
.include "m8def.inc"
.list
.cseg ;данная директива означает, что дальше идет код программы
.org 0x00 ;данная директива означает, что код программы будет располагаться с 0 ого адреса в FLASH

rjmp initial ;прерывание от RESET, ссылаемся на обработчик прерывания - initial
.org 0x20
initial: ldi R16,low(RAMEND) ;скопируем в R16 младщий байт из константы RAMEND, которая определена в m8def.inc и хранит размер SRAM
out SPL,R16 ;скопируем значение из R16 в SPL
ldi R17,high(RAMEND) ;скопируем в R16 старший байт из константы RAMEND, которая определена в m8def.inc
out SPH,R17 ;скопируем значение из R17 в SPH

;КОД КОНФИРУГИРУЮЩИЙ ПЕРЕФЕРИЮ МИКРОКОНТРОЛЛЕРА
sbi DDRD,0

ldi R16,0b00001111
out PORTB,R16

ldi R16,0b00000000
out DDRB,r16

;КОД ОСНОВНОЙ ПРОГРАММЫ

sbic PINB,1
sbi PORTD,0
rjmp main
s: sbis PINB,0
rcall s1
ret
s1: sbic PINB,1
rcall s2
ret
s2: dec R18
inc R18
breq s3

ret
s3: sbis PINB,2
rcall s4
ret
s4: sbic PINB,3
rjmp s4
sbis PINB,3
sbi PORTD,0
ret
start: sbis PINB,2
rcall start1
ret
start1: sbic PINB,1
rcall start2
ret
start2: sbis PINB,3
sbi PORTD,0
sbic PINB,3
ret
star: sbic PINB,2
rcall star1
ret
star1: cbi PORTD,0
ldi R18,0
ret
stop: sbis PINB,0
cbi PORTD,0
ret
main: ldi R18,1
sbic PINB,0
rcall start
sbis PINB,1
rcall stop
rcall star
rcall s
rjmp main

Re: Контроль уровня воды в баке на Атмега8

Пн мар 06, 2017 16:42:04

У Вас устройство "в железе" есть?
Полную схему можно увидеть?
По представленному протеусному уродству я для начала не вижу, где тот самый "внешний генератор", тактирование от которого Вы выставляете фьюзами.

Re: Контроль уровня воды в баке на Атмега8

Пн мар 06, 2017 16:49:12

igor741986 писал(а):Подскажите пожалуйста, что ему не хватает?
Мне кажется что наоборот - МК здесь лишний, тем более Mega8. :roll: :oops: :facepalm:

Re: Контроль уровня воды в баке на Атмега8

Пн мар 06, 2017 16:59:09

korob писал(а):Мне кажется что наоборот - МК здесь лишний

В принципе да. Схему с такой логикой можно на нескольких релюшках сделать.
А хочется на МК - на ATtiny2313 можно две такие (работающие независимо друг от друга) схемы сделать плюс управление RGB-светодиодной лентой и еще половина памяти программ останется свободной.

Re: Контроль уровня воды в баке на Атмега8

Пн мар 06, 2017 17:21:56

процессор тут не нужен.

нарисуйте таблицу истинности и используйте реле. Реле у вас будут в любом случае.

Re: Контроль уровня воды в баке на Атмега8

Пн мар 06, 2017 18:12:23

Alkul писал(а):У Вас устройство "в железе" есть?
Полную схему можно увидеть?
По представленному протеусному уродству я для начала не вижу, где тот самый "внешний генератор", тактирование от которого Вы выставляете фьюзами.


Схема тактируется внутренним генератором на 8 мгц, с ноги PD0 сигнал идет на релюху через оптопару, с релюхи на насос, все. Если все ноги с PB0 до PB3 свободны, то насос не должен работать, но он работает. Вообще реакции ноль, хоть что с ногами делай, насос качает. Походу с кодом что то не то. Видимо какую то мелочь я упускаю. Может с PD0 не постоянный ток идет, а с частотой из за кода, может в протеусе гасится этот дребезг, а здесь он приводит к тому что питание на релюху идет. Тяжело без осциллографа и опыта в програмировании).

Re: Контроль уровня воды в баке на Атмега8

Пн мар 06, 2017 18:29:26

Подтяжка входов на "+" включена?

Re: Контроль уровня воды в баке на Атмега8

Пн мар 06, 2017 18:34:56

AndTer писал(а):Подтяжка входов на "+" включена?

Да. Умеете пугать).

Re: Контроль уровня воды в баке на Атмега8

Пн мар 06, 2017 18:35:56

igor741986 писал(а):Схема тактируется внутренним генератором на 8 мгц, с ноги PD0 сигнал идет на релюху через оптопару, с релюхи на насос, все.

Вы схему можете нарисовать? Что за оптопара, как включена. Это что - тайна какая-то?

Дальше
igor741986 писал(а):Если все ноги с PB0 до PB3 свободны, то насос не должен работать, но он работает.

Что значит "свободны"? Концевики разомкнуты?

Если концевик "верхний уровень бак" разомкнут, то вывод PINB1 через внутренний pullup, который вы включили
ранее командами
Код:
ldi R16,0b00001111
out PORTB,R16
ldi R16,0b00000000
out DDRB,r16

притянут к питанию, и с него будет читаться лог.1

но Вы же пишете:
Код:
;КОД ОСНОВНОЙ ПРОГРАММЫ

sbic PINB,1
sbi PORTD,0

первая команда означает - пропустить следующую команду, если на выводе PINB1 лог.0, но у Вас-то на этом выводе лог.1 при разомкнутом концевике! Поэтому МК не пропускает следующую команду и законно выполняет
Код:
sbi PORTD,0

подавая тем самым питание на светодиод оптрона и запуская насос.
Дальше даже смотреть не стал, времени жалко. Разбирайтесь с ассемблером, вернее, изучите его получше.
Последний раз редактировалось Alkul Пн мар 06, 2017 18:37:01, всего редактировалось 1 раз.

Re: Контроль уровня воды в баке на Атмега8

Пн мар 06, 2017 19:06:00

Alkul писал(а):
igor741986 писал(а):Схема тактируется внутренним генератором на 8 мгц, с ноги PD0 сигнал идет на релюху через оптопару, с релюхи на насос, все.

Вы схему можете нарисовать? Что за оптопара, как включена. Это что - тайна какая-то?

Дальше
igor741986 писал(а):Если все ноги с PB0 до PB3 свободны, то насос не должен работать, но он работает.

Что значит "свободны"? Концевики разомкнуты?

Если концевик "верхний уровень бак" разомкнут, то вывод PINB1 через внутренний pullup, который вы включили
ранее командами
Код:
ldi R16,0b00001111
out PORTB,R16
ldi R16,0b00000000
out DDRB,r16

притянут к питанию, и с него будет читаться лог.1

но Вы же пишете:
Код:
;КОД ОСНОВНОЙ ПРОГРАММЫ

sbic PINB,1
sbi PORTD,0

первая команда означает - пропустить следующую команду, если на выводе PINB1 лог.0, но у Вас-то на этом выводе лог.1 при разомкнутом концевике! Поэтому МК не пропускает следующую команду и законно выполняет
Код:
sbi PORTD,0

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


Все правильно) эта часть кода в начале старта дает возможность наполнить бак(поэтому она не зациклена, а нужна только при первом включении), но потом когда мы посадим 1пин на землю, то насос должен отключится этого не происходит.
sbic PINB,1
sbi PORTD,0
По логике все очень просто и должно работать. Я могу конечно нарисовать схему, но на ней все можно отбросить, Останется один контроллер с ключами на входах и диодом(или вольтметром) на выходе, и это не поменяет картины, диод будет постоянно гореть, не реагируя на сигналы на входе.

Re: Контроль уровня воды в баке на Атмега8

Пн мар 06, 2017 19:36:40

igor741986 писал(а):Все правильно) эта часть кода в начале старта дает возможность наполнить бак(поэтому она не зациклена, а нужна только при первом включении), но потом когда мы посадим 1пин на землю, то насос должен отключится этого не происходит.

Вот честно - копаться в Вашем коде совершенно нет желания, разбираться, чем "start" отличается от "star" и т.д.
Напишите свою программу вот в таком стиле:
Спойлер
Код:
;Порт A (ЦАП)
.equ   CS   = 1      ;Линия CS ЦАП. Работа микросхемы разрешена при лог.0 на этой линии
.equ   CLK  = 4      ;Линия CLK ЦАП. Линия тактирования последовательного интерфейса ЦАП
.equ   SDI  = 5      ;Линия SDI ЦАП. Линия ввода данных в ЦАП.
.equ   CLRS = 6      ;Линия CLRS ЦАП. При лог.0 на линии ЦАП сбрасывается (на его выходе появляется сигнал, соответствующий коду 0h)
.equ   LOAD = 7      ;Линия LOAD ЦАП. Активный в нуле строб записи в регистр данных ЦАП

;Порт B (Кнопки, ЖКИ-индикатор)
.equ   SELECT=0      ;Кнопка "Выбор"
.equ   RIGHT=1      ;Кнопка "Вправо"
.equ   UP=2      ;Кнопка "Вверх"
.equ   RS=3      ;Линия выбора (0 - инструкции, 1 - данные) типа обмена с LCD          \   
.equ   Estr=4      ;Разрешение выполнения любого цикла обмена (0 - обмен запрещен, 1 - обмен разрешен) __\ Линии управления ЖКИ-индикатором
.equ   LEFT=5      ;Кнопка "Влево"
.equ   ESC=6      ;Кнопка "Отмена"
.equ   DOWN=7      ;Кнопка "Вниз"

;Порт С (АЦП)
.equ   SCLK = 0      ;Линия SCLK АЦП. Линия тактирования последовательного интерфейса АЦП (интерфейс аналогичен SPI)
.equ   RES  = 1      ;Линия RESET АЦП. При лог.0 на линии АЦП сбрасывается.
.equ   DRDY = 2      ;Линия DRDY АЦП. После завершения преобразования линия DRDY сбрасывается (на линии лог.0).
.equ   DOUT = 3      ;Линия DOUT АЦП. Линия вывода данных из АЦП.
.equ   DIN  = 4      ;Линия DIN АЦП. Линия ввода данных в АЦП.

.equ   RELE = 5      ;Линия управления выходом. При лог.1 на линии на выходных клеммах прибора появляется ток, при лог.0 на линии RELE
         ;выходная клемма "+" отключается от источника тока посредством размыкания контакта реле К1

;Порт D (Переключатели режимов работы, ЖКИ-индикатор)
.equ   S1=2      ;Переключатели
.equ   S2=1      ;режимов работы прибора
;Старший ниббл порта D - информационные биты D4-D7 при обмене с ЖКИ-индикатором.


.equ   MaxMode = 0x0B   ;Максимальное кол-во режимов в программе
.equ   MaxImpl = 0x10   ;Максимальное кол-во импульсов в режиме


;Определения имен регистров и адресов переменных
.equ   CurntL=0x98   ;Мл.байт значения тока (в единицах измерения АЦП), которое нужно поддерживать
.equ   CurntH=0x99   ;Ст.байт значения тока (в единицах измерения АЦП), которое нужно поддерживать
.equ   DACL=0x9A      ;Мл.байт уставки ЦАП для заданного значения тока
.equ   DACH=0x9B      ;Ст.байт уставки ЦАП для заданного значения тока
.equ   Level=0x9C   ;Уставка значения тока в расчетных единицах  Уставка= (Зад.знач - 38)/2 ;
         ; где Зад.знач - значение тока в миллиамперах (дискретами через 0,5 мА)
         ;Такми образом, при задании тока от -19 до +19 мА уставка изменяется от 0 до 76

.CSEG

.org 00
   jmp RESET    ; Reset Handler
   jmp EXT_INT0    ; IRQ0 Handler
   jmp EXT_INT1    ; IRQ1 Handler
   jmp TM2_COMP    ; Timer2 Compare Handler
   jmp TM2_OVF    ; Timer2 Overflow Handler
   jmp TM1_CAPT    ; Timer1 Capture Handler
   jmp TM1_COMPA    ; Timer1 CompareA Handler
   jmp TM1_COMPB    ; Timer1 CompareB Handler
   jmp TM1_OVF    ; Timer1 Overflow Handler
   jmp TM0_OVF    ; Timer0 Overflow Handler
   jmp SPI_STC    ; SPI Transfer Complete Handler
   jmp USRT_RXC    ; USART RX Complete Handler
   jmp USRT_UDR    ; UDR Empty Handler
   jmp USRT_TXC    ; USART TX Complete Handler
   jmp ADC_conv   ; ADC Conversion Complete Handler
   jmp EE_RDY    ; EEPROM Ready Handler
   jmp ANA_COMP    ; Analog Comparator Handler
   jmp TWSI       ; Two-wire Serial Interface Handler
   jmp EXT_INT2    ; IRQ2 Handler
   jmp TM0_COMP    ; Timer0 Compare Handler
   jmp SPM_RDY    ; Store Program Memory Ready Handler



EXT_INT0:    ; IRQ0 Handler
EXT_INT1:    ; IRQ1 Handler
TM2_COMP:    ; Timer2 Compare Handler
TM2_OVF:       ; Timer2 Overflow Handler
TM1_CAPT:    ; Timer1 Capture Handler
TM1_COMPA:    ; Timer1 CompareA Handler
TM1_COMPB:   ; Timer1 CompareB Handler
;TM1_OVF:       ; Timer1 Overflow Handler
TM0_OVF:       ; Timer0 Overflow Handler
SPI_STC:       ; SPI Transfer Complete Handler
USRT_RXC:    ; USART RX Complete Handler
USRT_UDR:    ; UDR Empty Handler
USRT_TXC:    ; USART TX Complete Handler
ADC_conv:      ; ADC Conversion Complete Handler
EE_RDY:       ; EEPROM Ready Handler
ANA_COMP:    ; Analog Comparator Handler
TWSI:       ; Two-wire Serial Interface Handler
EXT_INT2:    ; IRQ2 Handler
TM0_COMP:    ; Timer0 Compare Handler
SPM_RDY:       ; Store Program Memory Ready Handler
   reti

;Обработчик прерывания по переполнению таймера 1, вызывается каждую секунду
TM1_OVF:   push R16         ;
   push R17         ;
   push ZL         ;
   push ZH         ;
   push YL         ;
   push YH         ;
   push XL         ;
   push XH         ;
   push RL         ;
   push RH         ;
   push R19         ;
   push R1         ;
   push R0         ;
   push R18         ;
   in R16,SREG      ;
   push R16         ;


   ldi R17,$C2      ;1 сек
   ldi R16,$F7      ;
   out TCNT1H,R17      ;Переинициализировать таймер 1
   out TCNT1L,R16      ;на переполнение через 1 секунду

   lds XL,LongImpL      ;Занести в рег.пару Х кол-во секунд, оставшихся
   lds XH,LongImpH      ;до завершения текущего импульса
   sbiw XL,1         ;Декремент кол-ва оставшихся секунд
   breq TM1_2      ;Если кол-во оставшихся секунд равно нулю (импульс завершен), то переход на метку TM1_2
   sts LongImpL,XL      ;Иначе сохранить в ячейках  LongImpL и LongImpH
   sts LongImpH,XH      ;новое значение кол-ва оставшихся секунд
   jmp TM1_END      ;Переход на выход из программы

;Текущий импульс завершен
TM1_2:   lds ZL,AdrModeL      ;Занести в рег.пару Z адрес первого байта информации о текущем режиме
   lds ZH,AdrModeH      ;
   ld R16,Z+         ;Занести в рег.R16 кол-во импульсов в текущем цикле, в рег.паре Z теперь адрес байта кол-ва повторов цикла в режиме

   lds R17,NumImpl      ;Занести в рег.R17 порядковый номер импульса, выполняющегося в данный момент
   inc R17         ;Инкремент номера импульса, выполняющегося в данный момент для проверки, последний ли это импульс в цикле
   cp R17,R16      ;Если после инкремента номер импульса меньше кол-ва импульсов в текущем цикле, то это не последний импульс цикла
   brlo TM1_4      ;Если R17 < R16, то завершенный импульс не последний в цикле, переход на метку TM1_4
   jmp TM1_6         ;Иначе завершенный импульс последний в цикле, переход на метку TM1_6

;Завершенный импульс не последний в цикле
TM1_4:   sts NumImpl,R17      ;Сохранить в ячейке NumImpl новое значение порядкового номера импульса, выполняющегося в данный момент
   adiw ZL,1         ;Прибавить к адресу кол-ва повторов циклов текущего режима для перехода к адресу информации о первом импульсе
   ldi R16,3         ;Занести в рег.R16 длину информации об одном импульсе
   mul R17,R16      ;Умножить длину информации об одном импульсе на порядковый номер текущего импульса для рассчета смещения адреса
   add ZL,R0         ;Прибавить к адресу первого байта информации о текущем режиме смещение адреса для расчета адреса первого
   adc ZH,R1         ;байта информации о текущем импульсе
   ld R16,Z+         ;Занести в рег.R16 значение тока текущего импульса в расчетных единицах (уставку тока для текущего импульса)
   sts Level,R16      ;Сохранить новое значение уставки тока в ячейке Level
   ld R16,Z+         ;Занести в рег.R16 значение мл.байта длины текущего импульса в секундах
   sts LongImpL,R16      ;
   ld R16,Z+         ;Занести в рег.R16 значение ст.байта длины текущего импульса в секундах
   sts LongImpH,R16      ;
   call SET_CUR      ;Переход на подпрограмму установки тока текущего импульса (выполняется за 17,5 мкс)
   jmp TM1_END      ;Переход на выход из программы

;Завершенный импульс последний в цикле, проверить кол-во повторов цикла в текущем режиме
TM1_6:   ld R16,Z         ;Занести в рег.R16 общее кол-во повторений циклов в текущем режиме
   lds R17,RepCycl      ;Занести в рег.R17 кол-во выполненных повторений циклов в текущем режиме
   inc R17         ;Инкремент кол-ва выполненных повторений циклов в текущем режиме
   cp R17,R16      ;Если после инкремента кол-во выполненных повторов меньше общего кол-ва повторов, то режим не завершен
   brlo TM1_8      ;Если R17 < R16, то текущий цикл не последний в режиме, переход на метку TM1_8
   jmp TM1_10      ;Иначе это последний повтор цикла в текущем режиме

;Кол-во повторов цикла текущего режима не исчерпано, начать повтор цикла заново
TM1_8:   sts RepCycl,R17      ;Сохранить в ячейке RepCycl новое кол-во выполненных повторов цикла в текущем режиме
   clr R17         ;Обнулить рег.R17 для обнуления порядкового номера выполняемого импульса после перехода на метку TM1_4
   jmp TM1_4         ;Перейти на метку TM1_4 для возврата на начало цикла и генерации первого импульса   

;Выполнены все повторы цикла в текущем режиме, проверить не последний ли это режим программы
TM1_10:   lds R17,NumMode      ;Занести в рег.R17 порядковый номер текущего режима
   inc R17         ;Инкремент порядкового номера текущего режима
   lds R16,TPC      ;Занести в рег.R17 кол-во режимов в программе
   cp R17,R16      ;Сравнить инкрементированный порядковый номер текущего режима с общим кол-вом режимов программы
   brlo TM1_12      ;Если номер текущего режима меньше общего кол-ва режимов, то это не последний режим программы, переход на TM1_12
   jmp TM1_14      ;Иначе завершенный режим последний в программе, переход на метку TM1_14

;Завершенный режим не последний в программе, перейти на запуск генерации по следующему режиму
TM1_12:   sts NumMode,R17      ;Сохранить в ячейке NumMode порядковый номер следующего режима
   lds ZL,AdrModeL      ;Занести в рег.пару Z адрес первого байта информации о текущем режиме
   lds ZH,AdrModeH      ;
   ld R17,Z         ;Занести в рег.R17 кол-во импульсов в цикле текущего режима
   adiw ZL,2         ;Переход к адресу начала информации о первом импульсе цикла текущего режима
   ldi R16,3         ;Занести в рег.R16 длину информации об одном импульсе (3 байта)
   mul R17,R16      ;Умножить длину информации об одном импульсе на кол-во импульсов в цикле для рассчета смещения адреса,
   add ZL,R0         ;Теперь в рег.паре Z адрес первого байта информации о следующем режиме,
   adc ZH,R1         ;который становится теперь текущим режимом
   sts AdrModeL,ZL      ;Занести в ячейки AdrModeL и AdrModeH начальный адрес нового
   sts AdrModeH,ZH      ;текущего режима
   clr R17         ;Обнулить рег.R17 для обнуления порядкового номера выполняемого импульса после перехода на метку TM1_4
   sts RepCycl,R17      ;Обнулить значение кол-ва выполненных повторов цикла в текущем режиме в ячейке RepCycl
   sts NumImpl,R17      ;Обнулить значение порядкового номера импульса, выполняющегося в данный момент в ячейке NumImpl
   adiw ZL,1         ;В рег.паре Z теперь адрес байта кол-ва повторов цикла в следующем режиме, ставшем теперь текущим
   jmp TM1_4         ;Переход на метку TM1_4 для генерации первого импульса нового текущего режима

и Вам самому станет понятно, что и как делается в Вашей программе.

Re: Контроль уровня воды в баке на Атмега8

Вт мар 07, 2017 20:22:00

Спасибо всем тем, кто еще остался человеком и помогает. А кто не хочет помогать, а хочет порисоваться или выдать свою оценку, то мне не понятна ваша мотивация. Не мешайте мне, отвлекая от дела.
Изображение Изображение
Изображение
Изображение
Изображение
Изображение
На входах герконы, еще не подцепил.

Re: Контроль уровня воды в баке на Атмега8

Ср мар 08, 2017 14:07:44

У меня тут родилась идея сделать это все на одном прерывании и кодовой маске. А то подумаете, что я все бросил и сдался).

Re: Контроль уровня воды в баке на Атмега8

Чт мар 09, 2017 08:38:14

Удивляет ситуация, когда автор пытается нагородить... там, где это совершенно не требуется и в то же время абсолютно пренебрегает требованиями схемотехники там, где это необходимо.
8)
Имея четыре линии входного сигнала и максимум две для управления насосами (ежли не лепить обратный контроль по работе тех насосов) требуется всего-то 8 - 14 выводный МК поставить. Поскольку у АВР основное корпусирование или 8 выводный тини13/13А или 20 лапый тини2313 логично выбор на них остановить.
А вот схемотехнику получения входного сигнала с датчиков надо будет доработать - перевести на "токовую петлю" с дополнением оптронным преобразователем ток-логический уровень на платке устройства. Таким же образом и управление силовыми ключами приводов делать. Ибо реальное расстояние между датчиками, нагрузкой и самим модулем должно бысть явно "за 5 метров".
:wink:
Относительно программы...
Там только прерываний и не хватало!
:)))
Неуж-то стандартный программный опрос раз в 0,01 секунду по быстродействию не устраивает? (и это тоже еще в какой степени заторможено программой делать надо).
:tea:

Re: Контроль уровня воды в баке на Атмега8

Чт мар 09, 2017 10:12:25

BOB51 писал(а):Относительно программы...
Там только прерываний и не хватало!
:)))
Неуж-то стандартный программный опрос раз в 0,01 секунду по быстродействию не устраивает? (и это тоже еще в какой степени заторможено программой делать надо).
:tea:

Меня бы все устраивало), но стандартный опрос не опрашивает или как то некорректно опрашивает, слишком быстро или ему еще какие то условия надо(поэтому я и никогда не понимал электронику, ты не видишь, что там внутри происходит, в данный момент), вот с прерыванием все четко работает. Сигнал1 пришел, на выходе четко сигнал, сигнал2 пришел, на выходе четко сигнала нет. Только надо 4 контакта на прерывания в идеале, это самое простое решение. Атмега2560 в этом плане лучше, да и в ней всего больше мне, как раз на все хватит. А то я хотел Атмеги 8 между собой согласовывать.

Re: Контроль уровня воды в баке на Атмега8

Чт мар 09, 2017 11:43:20

Сигнал с механического контакта НИКОГДА мгновенно не устанавливается.
Процедура фильтрации обязательна.
Прерывание в данном случае еще больше проблем вызывать будет.
8)
А для Вашей задачки, ежли 4 датчика и один силовой выход, и 13-й тиньки "с избытком" достаточно (не говоря уже о примитивных релейках и/или автомате "на рассыпухе").
:roll:

Re: Контроль уровня воды в баке на Атмега8

Чт мар 09, 2017 12:47:25

BOB51 писал(а):Процедура фильтрации обязательна.
Прерывание в данном случае еще больше проблем вызывать будет.

Не знаю, самое удобное опрос кнопок по прерыванию.(от таймера правда) и дребезг можно убрать и реагировать на любые комбинации, хоть на все сразу нажатые кнопки.

BOB51 писал(а):А для Вашей задачки

Ну чел делает на том что у него есть. Что тини что мега, сути не меняет и никак ни на код ни на устройство не влияет.
Только корпус и цена.

Разбираться в коде не стану. Я ассемблер учил давно) Ещё на КР580 компы были)
Успел забыть и вспоминать не хочу)
На си, такая программа пишется быстро и просто.

Re: Контроль уровня воды в баке на Атмега8

Чт мар 09, 2017 13:03:59

Да и на ассемблере весьма простой вариант - возможно и поменьше суммарным кодом будет.
Только алгоритм правильный нужен.
Насчет прерываний... Все равно затем антидребезг потребуется - смысл усложнять программу с учетом возможных повторных вызовов прерывания сразу по его исполнению?
:dont_know:

Re: Контроль уровня воды в баке на Атмега8

Чт мар 09, 2017 14:27:19

BOB51 писал(а):поменьше суммарным кодом будет.

Абсолютно неактуально! 8кб на программку управления насосом?
Да можно даже подрубить float, и все переменные дщтп дщтп сделать)
Зачем тратить время на уменьшение кода и более компактнынй алгоритм, если там места и производительности дял этой задачи стократно больше чем потребуется? А время оно как говорится деньги)

BOB51 писал(а):Насчет прерываний... Все равно затем антидребезг потребуется

Я не знаю как написал прошивку ТС, ассемблер не хочу ковырять, но я использую прерывания по таймеру именно для опроса кнопок(сколько угодно сразу и независимо) и для подавления дребезга, "всё в одном".

Re: Контроль уровня воды в баке на Атмега8

Чт мар 09, 2017 14:35:48

По таймеру, а не по входным линиям (как у топикстартера в замысле).
:wink:
Ну и зачем цеплять избыточный МК там, где оный экономически не обоснован.
Другое дело - для удовольствия "на вырост" - но ... тогда заранее надо позаботится о минимальном использовании ресурсов, чтоб попозже при изменениях/дополнениях в программе не пришлось все заново переделывать.
8)
Ответить