Последвтельный таймер
|
|
VasylYE | Дата: Понедельник, 28.07.2008, 17:50 | Сообщение # 31 |
Рядовой
Группа: Проверенные
Сообщений: 263
Статус: Offline
| Доработанная программа и новый файл для протеуса. Запоминается последнее значение настроек и после отработки таймера вновь загружается. Так у Мега16 заводская настройка на внутренний генератор 1МГц то кварц не нужен (может я уже это писал, не помню). В файле протеуса поменял переключатели на кнопки, но симуляция идет не очень быстро, поэтому кнопку нужно немного придержать мышью.
А нам своє робить!
|
|
| |
barbus | Дата: Понедельник, 28.07.2008, 20:07 | Сообщение # 32 |
Лейтенант
Группа: Пользователи
Сообщений: 53
Статус: Offline
| По маленьку испраляя ошибки мы доведем схему до оканчательного варината, спосиба за помощ. При сравнении схеми в протеусе и в дип трасе я увидел различия соединений, какой мне взят за основу для постраения схемы. Еше как я понял нет сигнала оканчния работы цикла, сигнал спикер. Еще вопросик диапазон таймера начинается от 0-30 секунд или отличается? Я не понимаю какие показания показивает симаулятор.
|
|
| |
VasylYE | Дата: Среда, 30.07.2008, 16:10 | Сообщение # 33 |
Рядовой
Группа: Проверенные
Сообщений: 263
Статус: Offline
| схема для протеуса отличается от схемы в диптрейсе потому что для меня важно было проэмулировать работу программы, собирать, конечно, нужно то, что в диптрейсе. но там схема для индикатора с общим анодом, поэтому в нее нужно тоже внести поправки. я сейчас не могу все это сделать, нехватает времени, немного позже выложу все поправки значения индикатора - левая цифра - номер таймера, две следующие - секунды, крайняя правая - десятые доли секунды. диапазон работы 0-30 или 0-40 секунд, можно без значительных переделок расширить до 0-99 секунд, если дальше расширять, то или убрать отсчет десятых доль, или существенно изменять программу.
А нам своє робить!
|
|
| |
barbus | Дата: Среда, 30.07.2008, 19:08 | Сообщение # 34 |
Лейтенант
Группа: Пользователи
Сообщений: 53
Статус: Offline
| Quote (VasylYE) диапазон работы 0-30 или 0-40 секунд, можно без значительных переделок расширить до 0-99 секунд, Для расширения 0-99 что надо изменить в программе? (Для дальнейшей модернизации) И как реализовать бипер сигнал?
|
|
| |
VasylYE | Дата: Среда, 30.07.2008, 20:49 | Сообщение # 35 |
Рядовой
Группа: Проверенные
Сообщений: 263
Статус: Offline
| Quote (barbus) Для расширения 0-99 что надо изменить в программе? в самом верху программы есть запись .equ up =0x03 здесь указываем .equ up =0x09 (здесь задан предел отсчета десятков секунд) а тогда нужно перекомпилировать все
А нам своє робить!
|
|
| |
barbus | Дата: Четверг, 31.07.2008, 17:08 | Сообщение # 36 |
Лейтенант
Группа: Пользователи
Сообщений: 53
Статус: Offline
| Спосибо Сигнал beep как можно реализовать. После оканчания должен быть сигнал Beep скажем на 3 секунды и потом конец цикла таймеров
Сообщение отредактировал barbus - Четверг, 31.07.2008, 18:45 |
|
| |
VasylYE | Дата: Среда, 20.08.2008, 12:43 | Сообщение # 37 |
Рядовой
Группа: Проверенные
Сообщений: 263
Статус: Offline
| Доработан сигнал. После цикла таймера, на выходе МК PORTC0 генерируются прямоугольные импульсы частотой примерно 500 Гц. длительность сигнала в секундах определяется в начале программы Code .equ Tbeep = 0x03 ;продолжительность звукового сигнала в конце работы таймеров в файле для протеуса вместо звукового индикатора прикреплен светодиод (почему то если я ставил пищалку, вылетала ошибка) на момент звукового сигнала цифровой индикатор отключается, потом включается снова. также в архиве переработанный (и наверно, окончательный) вариант схемы для диптрейса вроде бы все...
А нам своє робить!
|
|
| |
barbus | Дата: Среда, 27.08.2008, 19:33 | Сообщение # 38 |
Лейтенант
Группа: Пользователи
Сообщений: 53
Статус: Offline
| В прикрепленном файле симуляция не идет? В коде может есть ошибки?
|
|
| |
VasylYE | Дата: Среда, 27.08.2008, 20:42 | Сообщение # 39 |
Рядовой
Группа: Проверенные
Сообщений: 263
Статус: 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
Статус: 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
Статус: 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
Статус: 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 с другими параметрами? Подскажи пожалуйста где я ошибся, может в неправильном напралении я, для организации данного цикла. Спосибо
Сообщение отредактировал barbus - Вторник, 02.09.2008, 21:35 |
|
| |
VasylYE | Дата: Вторник, 02.09.2008, 23:02 | Сообщение # 43 |
Рядовой
Группа: Проверенные
Сообщений: 263
Статус: 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
Статус: Offline
| Quote (VasylYE) два уточняющих вопроса 1. какое время должна быть включена нагрузка 3. это время фиксировано или должно изменяться? 2. какой индикатор используется - с общим анодом или с общим катодом? 1. нагрузка 3 включена на фиксировоне время, думаю 8 секунд 2.в симуляторе с общим анодом в реальном с общим катодом (потом буде думать над этим) Спосибо за разяснение я тоже думал использовать Delay подпрограмму но пока занания в этом деле падводят.
|
|
| |
barbus | Дата: Среда, 03.09.2008, 20:52 | Сообщение # 45 |
Лейтенант
Группа: Пользователи
Сообщений: 53
Статус: Offline
| Вот что получилось!!!
|
|
| |
|