MicroCHIP.RU
Главная Документация Отладочные средства Справочник Поиск Ссылки
 Новости   Конференция   Контакты 
 

Проблемка с динамической индикацией

 Нoвaя темa  |  Наверх  |  Перейти к теме  |  Поиск  |  Правила  |  Вход 

ВНИМАНИЕ!
Вы просматриваете архив форума.

Этот форум работает только в режиме просмотра и поиска.

Действующий форум переведен на новый движок и
находится по адресу www.microchip.su

 Проблемка с динамической индикацией
Автор: LexProg ()
Дата:   10/03/2005 09:37

Проблемка такая - контроллер выводит инфу на трехразрядный светодиодный индикатор - динамически
переглючая разряды по переполнению таймерсчетчика T0 (8 разрядный), не запрещая работу Т0
начинаю работать с таймером Т1 (использую его для длительных задержек), а необходимых задержек
не получается. Кристал (да простят меня поклонники PICoв) - AT90S2313 (да и Mega8 так-же
работает), че не так?


 
 А в симуляторе задержки какие, правильные или нет?
Автор: bzx ()
Дата:   10/03/2005 09:54

.


 
 Re: А в симуляторе задержки какие, правильные или нет?
Автор: LexProg ()
Дата:   10/03/2005 09:57

А в симуляторе (AVR Studio 4) все работает!


 
 Re: А в симуляторе задержки какие, правильные или нет?
Автор: bzx ()
Дата:   10/03/2005 10:06

Проверьте с помощью частотомера CLKOUT - частоту осциллятора. Она должна совпадать
с той, что стоит у Вас в симуляторе.


 
 Re: А в симуляторе задержки какие, правильные или нет?
Автор: LexProg ()
Дата:   10/03/2005 10:50

Дело не в том,что задержки не правильные, а в том, что T1 не желает работать вместе с T0
вообще - он сбрасывается, оба работают по прерыванию на переполнение, если T0 отключаем все
ок. На словах алгоритм такой:
1. Запуск Т0 (8-разрядный).
2.Т0 - переполняется, заходим в обработчик прерывания.
3.Выполняется подпрограмма отображения на дисплей.
4.Выход из прерывания T0.
5.Повторение на пункт 1.

Запускаем таймер Т1 допустим на 5с:
1.Заходим в подпрограмму настройки T1 (16)
2.Запускаем Т1
3.Т1 переполняется, заходим в обработчик переполнения.
4.Останавливаем Т1.

И все это время работает скоростной (1КГЦ) таймер Т0.

В симуляторе Все Ок - считают вместе, держится очередь прерываний.
На практике при запуске задержки T1 - задержка не выдерживается - процесс слетает!


 
 без примера кода у нас будет беседа слепого с глухим...
Автор: bzx ()
Дата:   10/03/2005 11:07

.


 
 Re: без примера кода у нас будет беседа слепого с глухим...
Автор: LexProg ()
Дата:   10/03/2005 11:18

Вот пример, спрашивайте - поясню


; PB0-7 - выход индикаторов
; PD0 - разрешение индикитора сотни
; PD1 - разрешение индикитора десятки
; PD2 - разрешение индикитора единица
; PD3 - вход импульсной последовательности
; PD4 - вход
; PD5 - вход
; PD6 - вход кнопки К1
; didj1 - разряд единиц
;-------------------------------------------------
.include "2313def.inc"

.def temp=r16
.def flag=r17
.def ziro=r18
.def didj_on=r19
.def ra=r20
.def rb=r21
.def rc=r22
.def byte=r23

.equ cifra0 =0xc0
.equ cifra1 =0xf9
.equ cifra2 =0xa4
.equ cifra3 =0xb0
.equ cifra4 =0x99
.equ cifra5 =0x92
.equ cifra6 =0x82
.equ cifra7 =0xf8
.equ cifra8 =0x80
.equ cifra9 =0x90
.equ off =0xff;7F

.equ didj1 =0x60
.equ didj2 =0x61
.equ didj3 =0x62
.equ delitT1 =0x63
.equ T1H =0x64
.equ T1L =0x65

;********************************************************************
.cseg
.org $000
rjmp reset
.org $005
rjmp t1_irq
rjmp t0_irq
;******************** Обработка прерываний **************************
t1_irq:
ldi flag,0x22
reti
;-------------------
t0_irq:
;фильтр дисплея
lds temp,didj3
cpi temp,cifra0
breq off3
rjmp endfiltr
off3:
ldi ra,off
sts didj3,ra
lds temp,didj2
cpi temp,cifra0
breq off2
rjmp endfiltr
off2:
ldi ra,off
sts didj2,ra
rjmp endfiltr
endfiltr: ;выход фильтра дисплея
cpi didj_on,1
breq didj_1
cpi didj_on,2
breq didj_2
rjmp didj_3
didj_1:
lds temp,didj3
out PORTB,temp
cbi PORTD,0
sbi PORTD,1
sbi PORTD,2
ldi didj_on,2
reti
didj_2:
lds temp,didj2
out PORTB,temp
sbi PORTD,0
cbi PORTD,1
sbi PORTD,2
ldi didj_on,3
reti
didj_3:
lds temp,didj1
out PORTB,temp
sbi PORTD,0
sbi PORTD,1
cbi PORTD,2
ldi didj_on,1
reti

;******************** Сама программа ********************************
reset:
ldi temp,RAMEND
out SPL,temp ;установка стека
;/////////////////////////////////////
clr ziro
ldi byte,0
;//////////// загрузка RAM ///////////
;////////////////////////////////////
ser temp
out DDRB,temp ;порт B на выход

ldi temp,0b0000111
out DDRD,temp

;////////////////////////////////////
ldi temp,0b10000010
out TIMSK,temp
;+++++++++++++++++++++++++++++++++++
main:
rcall T0start
sei
rjmp demo
demo:
ldi byte,222
rcall displey
rcall deleyT1
ldi byte,111
rcall displey
rcall deleyT1
rjmp demo
;++++++++++++++++++++++++++++++++++++

;*****************************
deleyT1:
clr flag
ldi temp,0b00000101
out TCCR1B,temp;ra
cikl_big:
cpi flag,0x22
breq out_deley_big
rjmp cikl_big
out_deley_big:
out TCCR1B,ziro
ret
;--------------------------
;--------------------------
T0stop:
out TCCR0,ziro
sbi PORTD,0
sbi PORTD,1
sbi PORTD,2
ret
;--------------------------
T0start:
ldi temp,0b00000011
out TCCR0,temp
ret
;-------------------------

.exit


 
 Re: Проблемка с динамической индикацией
Автор: LexProg ()
Дата:   10/03/2005 11:23

Да, форматирование слетело ни че не поймешь


 
 Re: без примера кода у нас будет беседа слепого с глухим...
Автор: bzx ()
Дата:   10/03/2005 11:37

У Вас и в прерываниях t0_irq и в основной программе (в функции deleyT1)
используется одна и та же временная переменная temp. ТАК ДЕЛАТЬ НЕЛЬЗЯ!


 
 намекаю...
Автор: pal ()
Дата:   10/03/2005 11:52

есть такой регистр - SREG.


 
 Re: а вот так можно?
Автор: LexProg ()
Дата:   10/03/2005 14:03

deleyT1:

ldi flag,0b00000101
out TCCR1B,flag
clr flag
cikl_big:
cpi flag,0x22
breq out_deley_big
rjmp cikl_big
out_deley_big:
out TCCR1B,ziro

ret

Результат такой же!


 
 Re: намекаю...
Автор: LexProg ()
Дата:   10/03/2005 14:07

Знаю такой регистр, че дальше-то?


 
 нет
Автор: bzx ()
Дата:   10/03/2005 14:10

Вы flag используете в t1_irq. Это первое. Второе, Вам ещё подсказали
(http://www.microchip.ru/phorum/read.php?f=2&i=83704&t=83675), что надо сохранять
SREG, т.к. и в прерываниях, и в основном цикле Вы используете операции ветвления.

.def temp2=r24
.def tempSREG=r25


 
 Re: flag
Автор: LexProg ()
Дата:   10/03/2005 14:25

Если внимательно посмотрите Flag используется последовательно и с ним проблем не должно быть:
1.Загружаем через flag делитель
2.Чистим flag
3.Запускаем таймер Т1
4.Отслеживаеем flag
5.Выполняется прерывание по переполнению Т1, flag=0x22
6.Сравниваем flag, выходим из пп задержки.

Больше Flag ни где не используется!

А вот про сохранение SREGа - надо попробовать!


 
 Re: flag этот Ваш используется последовательно
Автор: patton ()
Дата:   10/03/2005 23:22

когда Вы запрещаете прерывания на всё время пока с ним работаете, причём
у Вас ситуация ещё хуже чем здесь
http://www.microchip.ru/phorum/read.php?f=2&i=83610&t=83610
обратите внимание на то что там по теме написано

и в Вашем случае, не умеете синхронизировать задачи - переносите проверки
в обработчик


 
 Re: flag
Автор: msp ()
Дата:   10/03/2005 23:52

Переменную temp сохраняйте, или сделайте две разные переменные для фона и прерываний.