Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 03.12.2007, 20:51  
shalan
Частый гость
 
Регистрация: 16.04.2007
Сообщений: 43
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
shalan на пути к лучшему
По умолчанию Поправка времени в часах

пытаюсь изменять поправку для регулировки хода часов на pic16f84. Порпавка записывается в таймер1 при обработке прерывания от этого таймера. Та к вот часы работаю при изменении значения поправки от 24 до 32. при любых других значениях - останавливаются. Причем после того как они остановились возврат поправки в рабочий диапазон не помогает. На индикатор выводится время и значение поправки. Измеенить поправку можно кнопками HOUR/+ и MIN/-. проверял в протеусе и на реальной схеме - результат одинаковый. Подскажите где баг?!

Прикрепленный файл: 8251939.rar
Реклама:
shalan вне форума  
Непрочитано 03.12.2007, 23:14  
Drex
Прописка
 
Аватар для Drex
 
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 337
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
Drex на пути к лучшему
По умолчанию

Че-то у тебя тут так все наворочено. Как вообще схема и программа построена, объясни хоть в двух словах. А то я как схему глянул, так чуть глаз не выпал. Во первых зачем прерывания по входу INT ? Откуда тактируются и чем считаются часы? Асм знаю хорошо, но чужие программы с разбегу сложно разобрать.
Drex вне форума  
Непрочитано 04.12.2007, 04:46  
shalan
Частый гость
 
Регистрация: 16.04.2007
Сообщений: 43
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
shalan на пути к лучшему
По умолчанию

Внешние прерывания пока никак не используются, датчики температуры тоже не опрашиваются. Я выкинул из программы все лишнее пока не разберусь с часами. Прерывания идут только от таймера 1. По прерыванию в таймер загружается поправка и увеличваются счетчики долей секуды. Когда набегает секунда, в обработчике прерывания устанавливается флаг. В основном цикле при установке флага увеличивается счетчик секунд. Тут же проверяется нажатие клавишь, и если показания изменились идет вывод на индикатор. Поправка для таймера хранится в EEPROM. Был еще кусок кода который переписывал значение в EEPROM, но покая его выкинул.
shalan вне форума  
Непрочитано 05.12.2007, 11:25  
Drex
Прописка
 
Аватар для Drex
 
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 337
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
Drex на пути к лучшему
По умолчанию

Все, победил я твою прогу. Первое что я заметил гоняя в отладчике, что при некоторых обстоятельствах, в регистре 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. Асм это конечно высший пилотаж, но уж если ты на нем пишешь, то будь предельно внимателен в таких вещах как адресация. На Си конечно же это сделал бы сам компилятор. Удачи!
Drex вне форума  
Непрочитано 05.12.2007, 20:52  
shalan
Частый гость
 
Регистрация: 16.04.2007
Сообщений: 43
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
shalan на пути к лучшему
По умолчанию

Спасибо огромное!
Сам бы я еще долго искал косяк. Итак 2 вечера потратил, выкинул все что не касается часов...Вообще мой первый проект на PICах. Подключение индикатора и датчиков температуры подсмотрел в других проектах. Изначально собирался сделать тахометр, потом решил добаить часы и термометры. Теперь все кроме тахометра работает нормально
shalan вне форума  
Непрочитано 05.12.2007, 21:11  
shalan
Частый гость
 
Регистрация: 16.04.2007
Сообщений: 43
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
shalan на пути к лучшему
По умолчанию

О горе мне!
Когда готовил проект к отправке на форум, сделал копию исходника где был полный код для обработки датчиков и внешних прерываний, из рабочего исходника поудалял все лишнее. Оказалось не тот файл скопировал. Теперь полный код программы есть только в микроконтроллере.

Можно как-нибудь получить оттуда исходник?
shalan вне форума  
Непрочитано 05.12.2007, 21:26  
Drex
Прописка
 
Аватар для Drex
 
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 337
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
Drex на пути к лучшему
По умолчанию

Исходник никак, восстанавливай сначала. Максимум, что можно это *.hex который можно дизасемблировать, но в такой дизассемблятине копаться, врагу не пожелаешь. Проще заново написать. Сочувствую. Может отсюда с форума дерни то, что было на момент отправки постов. Я с твоим кодом поигрался и тоже все погрохал.
Drex вне форума  
Непрочитано 06.12.2007, 01:33  
pfgx
Временная регистрация
 
Регистрация: 18.10.2007
Сообщений: 81
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
pfgx на пути к лучшему
По умолчанию

Ну, если это сам писал, да еще и на ассемблере, то в "дизассемблятине" много копаться не придется.

Цитата:
потратил около 2-х часов. Но выяснил, что если при старте программы поправку установить в 40, то на 6-й секунде при 10-м вызове подрограммы CheckBusy из процедуры LCDData, регистр OPTION_REG из нуля превращаяется в 00101000.
Это ж надо было такое найти
pfgx вне форума  
Непрочитано 06.12.2007, 10:23  
Drex
Прописка
 
Аватар для Drex
 
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 337
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
Drex на пути к лучшему
По умолчанию

Сообщение от pfgx
Ну, если это сам писал, да еще и на ассемблере, то в "дизассемблятине" много копаться не придется.

Цитата:
потратил около 2-х часов. Но выяснил, что если при старте программы поправку установить в 40, то на 6-й секунде при 10-м вызове подрограммы CheckBusy из процедуры LCDData, регистр OPTION_REG из нуля превращаяется в 00101000.
Это ж надо было такое найти
Ну методом золотого сечения круг постепенно сужался Ну на самом деле, почувствовал себя крутым перцем
Drex вне форума  
Непрочитано 06.12.2007, 10:28  
Drex
Прописка
 
Аватар для Drex
 
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 337
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
Drex на пути к лучшему
По умолчанию

Сообщение от pfgx
Ну, если это сам писал, да еще и на ассемблере, то в "дизассемблятине" много копаться не придется.
Да не скажи, я пробовал так со своими проектами - тяжеловато. Ни тебе нормальных имен регистров, ни тебе меток с названиями. ТОлько голые адреса.
Drex вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многоканальное реле времени serb-radio Микроконтроллеры, АЦП, память и т.д 2 02.08.2009 14:32
Zeitgeist (Дух времени) andr1791 Отвлекитесь, эмбеддеры! 138 19.12.2008 23:24
[Решено] герой нашего времени... spilberg Отвлекитесь, эмбеддеры! 10 12.05.2008 10:47
как установить время на часах Электроника ndreich Делимся опытом 2 17.03.2008 00:43
Документация на реле времени FOLKSDOICH Поиск схем. Делимся схемами 0 05.11.2007 11:42


Часовой пояс GMT +4, время: 13:39.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot