Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
03.12.2007, 20:51
|
|
Частый гость
Регистрация: 16.04.2007
Сообщений: 43
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Поправка времени в часах
пытаюсь изменять поправку для регулировки хода часов на pic16f84. Порпавка записывается в таймер1 при обработке прерывания от этого таймера. Та к вот часы работаю при изменении значения поправки от 24 до 32. при любых других значениях - останавливаются. Причем после того как они остановились возврат поправки в рабочий диапазон не помогает. На индикатор выводится время и значение поправки. Измеенить поправку можно кнопками HOUR/+ и MIN/-. проверял в протеусе и на реальной схеме - результат одинаковый. Подскажите где баг?!
Прикрепленный файл: 8251939.rar
|
|
|
|
03.12.2007, 23:14
|
|
Прописка
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 337
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Че-то у тебя тут так все наворочено. Как вообще схема и программа построена, объясни хоть в двух словах. А то я как схему глянул, так чуть глаз не выпал. Во первых зачем прерывания по входу INT ? Откуда тактируются и чем считаются часы? Асм знаю хорошо, но чужие программы с разбегу сложно разобрать.
|
|
|
|
04.12.2007, 04:46
|
|
Частый гость
Регистрация: 16.04.2007
Сообщений: 43
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Внешние прерывания пока никак не используются, датчики температуры тоже не опрашиваются. Я выкинул из программы все лишнее пока не разберусь с часами. Прерывания идут только от таймера 1. По прерыванию в таймер загружается поправка и увеличваются счетчики долей секуды. Когда набегает секунда, в обработчике прерывания устанавливается флаг. В основном цикле при установке флага увеличивается счетчик секунд. Тут же проверяется нажатие клавишь, и если показания изменились идет вывод на индикатор. Поправка для таймера хранится в EEPROM. Был еще кусок кода который переписывал значение в EEPROM, но покая его выкинул.
|
|
|
|
05.12.2007, 11:25
|
|
Прописка
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 337
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Все, победил я твою прогу. Первое что я заметил гоняя в отладчике, что при некоторых обстоятельствах, в регистре OPTION_REG устанавливается 5-й бит. Этим самым останавливается TMR0. Далее начал искать условия при котором это происходит. Скажу честно, потратил около 2-х часов. Но выяснил, что если при старте программы поправку установить в 40, то на 6-й секунде при 10-м вызове подрограммы CheckBusy из процедуры LCDData, регистр OPTION_REG из нуля превращаяется в 00101000. Вопрос: какая сволочь стреляла? Оказывается дело в следующем: Виновата не сама эта процедура, а прерывание, возникшее во время ее исполнения. При занесении нового значения в TMR0, оно занеслось не в таймер а в наш OPTION_REG. Почему? Потому что TMR0 имеет адрес 01, а OPTION_REG имеет адрес 81. Один и тот же регистр, но в разных банках. И так случилось, что прерывание возникло в том месте программы, когда она чего-то делала в 1 банке. Поэтому в процедуре ISR (обработчик прерывания) перед занесением свежего timecoef в TMR0 нужно для верности включить нулевой банк. У тебя даже макросик есть специальный. Короче вставь одну строчку, чтобы было вот так:
Код:
|
ISR
movwf W_Temp ; Скопировать содержимое регистра W в регистр W_Temp.
movf STATUS, W ; Скопировать содержимое регистра Status в регистр W.
movwf Stat_Temp ; Скопировать содержимое регистра W в регистр Stat_Temp.
movf timecoef, W
BANK0 ;Вот эта вставочка !!!!!!!!!!!!!!
movwf TMR0
decfsz msec1, f ;
goto nosec
movlw 0xfa
movwf msec1
decfsz msec2, f
goto nosec
movlw 0x10
movwf msec2
bsf ind, 0 |
После этого прога заработала .
P.S. Асм это конечно высший пилотаж, но уж если ты на нем пишешь, то будь предельно внимателен в таких вещах как адресация. На Си конечно же это сделал бы сам компилятор. Удачи!
|
|
|
|
05.12.2007, 20:52
|
|
Частый гость
Регистрация: 16.04.2007
Сообщений: 43
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Спасибо огромное!
Сам бы я еще долго искал косяк. Итак 2 вечера потратил, выкинул все что не касается часов...Вообще мой первый проект на PICах. Подключение индикатора и датчиков температуры подсмотрел в других проектах. Изначально собирался сделать тахометр, потом решил добаить часы и термометры. Теперь все кроме тахометра работает нормально
|
|
|
|
05.12.2007, 21:11
|
|
Частый гость
Регистрация: 16.04.2007
Сообщений: 43
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
О горе мне!
Когда готовил проект к отправке на форум, сделал копию исходника где был полный код для обработки датчиков и внешних прерываний, из рабочего исходника поудалял все лишнее. Оказалось не тот файл скопировал. Теперь полный код программы есть только в микроконтроллере.
Можно как-нибудь получить оттуда исходник?
|
|
|
|
05.12.2007, 21:26
|
|
Прописка
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 337
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Исходник никак, восстанавливай сначала. Максимум, что можно это *.hex который можно дизасемблировать, но в такой дизассемблятине копаться, врагу не пожелаешь. Проще заново написать. Сочувствую. Может отсюда с форума дерни то, что было на момент отправки постов. Я с твоим кодом поигрался и тоже все погрохал.
|
|
|
|
06.12.2007, 01:33
|
|
Временная регистрация
Регистрация: 18.10.2007
Сообщений: 81
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Ну, если это сам писал, да еще и на ассемблере, то в "дизассемблятине" много копаться не придется.
Цитата:
|
потратил около 2-х часов. Но выяснил, что если при старте программы поправку установить в 40, то на 6-й секунде при 10-м вызове подрограммы CheckBusy из процедуры LCDData, регистр OPTION_REG из нуля превращаяется в 00101000.
|
Это ж надо было такое найти
|
|
|
|
06.12.2007, 10:23
|
|
Прописка
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 337
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Сообщение от pfgx
|
Ну, если это сам писал, да еще и на ассемблере, то в "дизассемблятине" много копаться не придется.
Цитата:
|
потратил около 2-х часов. Но выяснил, что если при старте программы поправку установить в 40, то на 6-й секунде при 10-м вызове подрограммы CheckBusy из процедуры LCDData, регистр OPTION_REG из нуля превращаяется в 00101000.
|
Это ж надо было такое найти
|
Ну методом золотого сечения круг постепенно сужался Ну на самом деле, почувствовал себя крутым перцем
|
|
|
|
06.12.2007, 10:28
|
|
Прописка
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 337
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Сообщение от pfgx
|
Ну, если это сам писал, да еще и на ассемблере, то в "дизассемблятине" много копаться не придется.
|
Да не скажи, я пробовал так со своими проектами - тяжеловато. Ни тебе нормальных имен регистров, ни тебе меток с названиями. ТОлько голые адреса.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:39.
|
|