Технический Портал Левши Четверг, 25.04.2024, 10:23
| RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 3 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
ТЕХНИЧЕСКИЙ ФОРУМ » ЭЛЕКТРОНИКА » АВТОМАТИКА » Последвтельный таймер (Помогите начинающему)
Последвтельный таймер
VasylYEДата: Понедельник, 28.07.2008, 17:50 | Сообщение # 31
Рядовой
Группа: Проверенные
Сообщений: 263
Награды: 1
Статус: Offline
Доработанная программа и новый файл для протеуса. Запоминается последнее значение настроек и после отработки таймера вновь загружается. Так у Мега16 заводская настройка на внутренний генератор 1МГц то кварц не нужен (может я уже это писал, не помню). В файле протеуса поменял переключатели на кнопки, но симуляция идет не очень быстро, поэтому кнопку нужно немного придержать мышью.

А нам своє робить!
 
barbusДата: Понедельник, 28.07.2008, 20:07 | Сообщение # 32
Лейтенант
Группа: Пользователи
Сообщений: 53
Награды: 0
Статус: Offline
По маленьку испраляя ошибки мы доведем схему до оканчательного варината, спосиба за помощ.
При сравнении схеми в протеусе и в дип трасе я увидел различия соединений, какой мне взят за основу для постраения схемы.
Еше как я понял нет сигнала оканчния работы цикла, сигнал спикер.

Еще вопросик диапазон таймера начинается от 0-30 секунд или отличается?
Я не понимаю какие показания показивает симаулятор.

 
VasylYEДата: Среда, 30.07.2008, 16:10 | Сообщение # 33
Рядовой
Группа: Проверенные
Сообщений: 263
Награды: 1
Статус: Offline
схема для протеуса отличается от схемы в диптрейсе потому что для меня важно было проэмулировать работу программы, собирать, конечно, нужно то, что в диптрейсе. но там схема для индикатора с общим анодом, поэтому в нее нужно тоже внести поправки. я сейчас не могу все это сделать, нехватает времени, немного позже выложу все поправки
значения индикатора - левая цифра - номер таймера, две следующие - секунды, крайняя правая - десятые доли секунды.
диапазон работы 0-30 или 0-40 секунд, можно без значительных переделок расширить до 0-99 секунд, если дальше расширять, то или убрать отсчет десятых доль, или существенно изменять программу.


А нам своє робить!
 
barbusДата: Среда, 30.07.2008, 19:08 | Сообщение # 34
Лейтенант
Группа: Пользователи
Сообщений: 53
Награды: 0
Статус: Offline
Quote (VasylYE)
диапазон работы 0-30 или 0-40 секунд, можно без значительных переделок расширить до 0-99 секунд,

Для расширения 0-99 что надо изменить в программе? (Для дальнейшей модернизации)
И как реализовать бипер сигнал?

 
VasylYEДата: Среда, 30.07.2008, 20:49 | Сообщение # 35
Рядовой
Группа: Проверенные
Сообщений: 263
Награды: 1
Статус: Offline
Quote (barbus)
Для расширения 0-99 что надо изменить в программе?

в самом верху программы есть запись
.equ up =0x03
здесь указываем
.equ up =0x09
(здесь задан предел отсчета десятков секунд) а тогда нужно перекомпилировать все


А нам своє робить!
 
barbusДата: Четверг, 31.07.2008, 17:08 | Сообщение # 36
Лейтенант
Группа: Пользователи
Сообщений: 53
Награды: 0
Статус: Offline
Спосибо

Сигнал beep как можно реализовать.
После оканчания должен быть сигнал Beep скажем на 3 секунды и потом конец цикла таймеров

Сообщение отредактировал barbus - Четверг, 31.07.2008, 18:45
 
VasylYEДата: Среда, 20.08.2008, 12:43 | Сообщение # 37
Рядовой
Группа: Проверенные
Сообщений: 263
Награды: 1
Статус: Offline
Доработан сигнал. После цикла таймера, на выходе МК PORTC0 генерируются прямоугольные импульсы частотой примерно 500 Гц. длительность сигнала в секундах определяется в начале программы
Code
.equ Tbeep = 0x03    ;продолжительность звукового сигнала в конце работы таймеров

в файле для протеуса вместо звукового индикатора прикреплен светодиод (почему то если я ставил пищалку, вылетала ошибка)
на момент звукового сигнала цифровой индикатор отключается, потом включается снова.
также в архиве переработанный (и наверно, окончательный) вариант схемы для диптрейса
вроде бы все...
Прикрепления: Timer.rar (50.7 Kb)


А нам своє робить!
 
barbusДата: Среда, 27.08.2008, 19:33 | Сообщение # 38
Лейтенант
Группа: Пользователи
Сообщений: 53
Награды: 0
Статус: Offline
В прикрепленном файле симуляция не идет?
В коде может есть ошибки?
 
VasylYEДата: Среда, 27.08.2008, 20:42 | Сообщение # 39
Рядовой
Группа: Проверенные
Сообщений: 263
Награды: 1
Статус: Offline
Quote (barbus)
В прикрепленном файле симуляция не идет? В коде может есть ошибки?

нет, перепроверял несколько раз, все работает. что выдает, какие ошибки?
исходники c архива нужно поместить в каталог c:\VMLAB\work\timer\*.*
файл протеуса в каталог c:\Program Files\Labcenter Electronics\Proteus 7 Professional\
симуляция идет медленно (примерно в 10 раз медленнее нежели в реальном времени)


А нам своє робить!
 
barbusДата: Суббота, 30.08.2008, 22:12 | Сообщение # 40
Лейтенант
Группа: Пользователи
Сообщений: 53
Награды: 0
Статус: Offline
Как я понял симуляция идет очень-очень медленно.

Не реагирует на кнопки, табло показывает 1000 и все,
Но в VMLAB-е все работает.

Почему симуляция медленно идет, для упрашения?

Добавлено (30.08.2008, 22:12)
---------------------------------------------
Прошу прокоментируй в прошивке Beep сигнал как получен?

-------------------------------------------------------
.equ Tbeep = 0x03 ;продолжительность звукового сигнала в конце работы таймеров

-------------------------------------------------------
;Функция задержки
delay:
push temp
ldi temp, 0xFF
del_1:
dec temp
cpi temp, 0x00
brne del_1
pop temp
ret

----------------------------------------------------------

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Функция генерации прямоугольных колебаний
;на выводе РС0 с частотой 500 Гц
;продолжительностью Tbeep секунд
Beep:
;
ldi temp, 0x00
out TCCR0, temp

out PORTA, temp
;

ldi temp, (Tbeep*4)
B_cycle:
push temp

ldi temp, 0xFF
B_c_1:
push temp
call Delay
in temp, PORTC
sbrc temp, 0
cbi PORTC, 0
sbrs temp, 0
sbi PORTC, 0
pop temp
dec temp
brne B_c_1

pop temp
dec temp
brne B_cycle
;

ldi temp, (1<<CS01)
out TCCR0, temp ;Запускаем таймер 0
;
ret
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 
VasylYEДата: Понедельник, 01.09.2008, 17:23 | Сообщение # 41
Рядовой
Группа: Проверенные
Сообщений: 263
Награды: 1
Статус: Offline
для получения прямоугольных импульсов данная подпрограмма просто переключает состояние вывода РС0 каждую миллисекунду. Тогда период будет равен двом переключениям (+5В и 0В на выводе), а значит, частота будет 500 Гц.

подпрограмма Delay обеспечивает задержку примерно 1 мс. значит, между двумя переключениями вызываем эту подпрограмму.
всего для получения серии импульсов длительностью 1с нужно 1000 циклов переключений.
применяя один 8-битный регистр мы можем сделать отсчет от 0 до 255, поэтому организуем два цикла - внешний - с повтором 4х(длительность звукового импульса), и внутренний с повтором 255 раз.
вот комменты к этому учаску кода

Beep:
;
ldi temp, 0x00      ; обнуляем временный регистр
out TCCR0, temp  ; отключаем работу таймера ТС0

out PORTA, temp ; гасим индикатор
;
ldi temp, (Tbeep*4) ;в временной регистр записываем длительность звукового сигнала
B_cycle:                 ; начало внешнего цикла
push temp ; сохраняем значение количества проходов внешнего цикла

ldi temp, 0xFF  ; загружаем временный регистр количеством проходов для внутреннего цикла (255)
B_c_1:
push temp ; сохр. значение к-ва проходов внутр. цикла в стек

call Delay ; вызываем подпрограмму задержки на 1 мс.
in temp, PORTC ;читаем состояние порта С (читаем не с пина, а с порта вопреки правилам, но здесь нужно именно так!)
sbrc temp, 0 ; если на выводе РС0 было высокое состояние (+5)
cbi PORTC, 0 ; устанавливаем вывод в низкое состояние (0)
sbrs temp, 0 ; иначе если на выводе РС0 было низкое состояние
sbi PORTC, 0 ; устанавливаем на нем высокое (+5)

pop temp ; восстановляем из стека счетчик проходов внутр. цикла
dec temp ; уменьшаем его
brne B_c_1 ; если не равен нулю, переход к метке

; иначе
pop temp ; восстановляем счетчик проходов внешн. цикла
dec temp ; уменьшаем его
brne B_cycle ; аналогично если не нуль, переходим к метке

;

ldi temp, (1< out TCCR0, temp ;Запускаем таймер 0
;
ret ; выход из подпрограммы

здесь выделено цветом - собственно где формируются импульсы, внутр. и внешний циклы.


А нам своє робить!
 
barbusДата: Вторник, 02.09.2008, 21:13 | Сообщение # 42
Лейтенант
Группа: Пользователи
Сообщений: 53
Награды: 0
Статус: Offline
Вот что я сдела.... я взял стабильно работающий файл асм и добавил там все последние изменения, появились ошибки, когда третьий таймер отсчитает время и дает сигнал бееп во время беепера на табло висвечивается случайный индикатор, хотя в коде есть строка о отклучении генератотра таймера 0.
Помаги разобратся.

В попследнем файле асм увидел какие то неурядици с анодным и катодным управлением табло

Еше помаги я хочу инвертировать третый таймер. Но это только модификация оснавной прошивки.

Вариант 1

.equ Tbeep = 0x03 ;продолжительность звукового сигнала и инвертора в конце
работы таймеров
;=========================================================
T3_start:
cbi PORTB, 6 ;(отключена Нагрузка 3)
;проверяем чему равен счетчик 3
ldi XH, HIGH(T3_wh_s)
ldi XL, LOW(T3_wh_s)
ld temp, X

ldi XH, HIGH(T3_fr_s)
ldi XL, LOW(T3_fr_s)
ld temp1, X

cpi temp, 0x00
brne T3_running ;Если целые секунды таймера 3 не равны нулю, переход
cpi temp1, 0x00
brne T3_running ;Если десятые секунды таймера 3 не равны нулю, переход
;Если Таймер 3 отсчитал, выключаем третью нагрузку, остановляем таймер

sbi PORTB, 6 ;Вкл. Нагрузка 3

ldi temp, 0x00
out TCCR1B, temp ;Остановка таймера

call Invertor_3 ;цикл задержки включенным третью нагрузку на
время Tbeep

call Beep

ldi XH, HIGH(Current_timer)
ldi XL, LOW(Current_timer)
ldi temp, 0x01
st X, temp ;Устанавливаем текущий таймер = 1

jmp TX_start__

T3_running:
;Проверяем, не нажата ли кнопка Аварийного стопа
sbis PIND, 7
jmp Emergency_stop
jmp T3_start

;===================================================

;Функция задержки включения нагрузки номер 3 продолжительностью Tbeep секунд

Invertor_3:

ldi temp, 0x00 ; обнуляем временный регистр
out TCCR0, temp ; отключаем работу таймера ТС0

out PORTA, temp ; гасим индикатор
ldi temp, (Tbeep*2) ;в временной регистр записываем
длительность звукового сигнала
B_taim: ; начало внешнего цикла
push temp ; сохраняем значение количества проходов внешнего
цикла
pop temp ; восстановляем счетчик проходов внешн. цикла
dec temp ; уменьшаем его
cpi temp, 0x00
brne B_taim ; аналогично если не нуль, переходим к метке
pop temp
ret ; выход из подпрограммы

;------------------------------------------------------------

Вариант 2

Может мне взять подпрограмму Delay с другими параметрами?

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

Спосибо

Прикрепления: timer.dsn (112.0 Kb) · timer.hex (4.0 Kb) · timer.asm (22.4 Kb)


Сообщение отредактировал barbus - Вторник, 02.09.2008, 21:35
 
VasylYEДата: Вторник, 02.09.2008, 23:02 | Сообщение # 43
Рядовой
Группа: Проверенные
Сообщений: 263
Награды: 1
Статус: Offline
два уточняющих вопроса
1. какое время должна быть включена нагрузка 3. это время фиксировано или должно изменяться?
2. какой индикатор используется - с общим анодом или с общим катодом?

рассчитать задержку Invertor_3 можно так (если она в работе устройства неизменна)
подпрограма Delay обеспечивает задержку 1 мс.
значит, если нужно сделать задержку Х секунд, то подпрогр. Delay будет вызываться Х*1000 раз.
для этого и делаем вложенные циклы - внутренний и внешний, потому что проще в одном цикле сделать вызов только до 255 раз

Invertor_3:
.equ Invertor_time = 0x01 ; здесь указываем, сколько секунд будет включена 3 нагрузка
ldi temp, 0x00 ; обнуляем временный регистр
out TCCR0, temp ; отключаем работу таймера ТС0
; а вот здесь, если индикатор с общим катодом, то будет так:
out PORTA, temp ; гасим индикатор
; а если с общим анодом, то на порт нужно подать логические единицы, т. е.
ldi temp, 0xFF
out PORTA, temp ;вот поэтому и нужно знать, какой индикатор используется
ldi temp, (4*Invertor_time) ;множим на 4, потому что можем считать только до 1/4 секунды, для достижения
;целой секунды внутренний цикл нужно крутить 4 раза
B_taim: ; начало внешнего цикла
push temp ; сохраняем значение количества проходов внешнего цикла
ldi temp, 0xFA ; загружаем временный регистр количеством проходов для внутреннего цикла (250)
B_taim_1:
push temp ; сохр. значение к-ва проходов внутр. цикла в стек
call Delay ; здесь задержка на 1мс
pop temp ;восстановляем из стека счетчик проходов внутр. цикла
dec temp ;
brne B_taim_1 ;
pop temp ; восстановляем счетчик проходов внешн. цикла
dec temp ; уменьшаем его
brne B_taim ; аналогично если не нуль, переходим к метке

ldi temp, (1< out TCCR0, temp
ret

=========
последний файл был рассчитан на использование индикатора с общим катодом.


А нам своє робить!
 
barbusДата: Среда, 03.09.2008, 17:29 | Сообщение # 44
Лейтенант
Группа: Пользователи
Сообщений: 53
Награды: 0
Статус: Offline
Quote (VasylYE)
два уточняющих вопроса
1. какое время должна быть включена нагрузка 3. это время фиксировано или должно изменяться?
2. какой индикатор используется - с общим анодом или с общим катодом?

1. нагрузка 3 включена на фиксировоне время, думаю 8 секунд

2.в симуляторе с общим анодом в реальном с общим катодом (потом буде думать над этим)

Спосибо за разяснение я тоже думал использовать Delay подпрограмму но пока занания в этом деле падводят.

 
barbusДата: Среда, 03.09.2008, 20:52 | Сообщение # 45
Лейтенант
Группа: Пользователи
Сообщений: 53
Награды: 0
Статус: Offline
Вот что получилось!!!
Прикрепления: 3624971.dsn (112.0 Kb) · 8394602.hex (4.0 Kb) · 7723054.asm (23.1 Kb) · 9508779.dch (102.1 Kb)
 
ТЕХНИЧЕСКИЙ ФОРУМ » ЭЛЕКТРОНИКА » АВТОМАТИКА » Последвтельный таймер (Помогите начинающему)
  • Страница 3 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Поиск:

Copyright MyCorp © 2024