Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2011, 17:54   #1
Mr_Gutsy
Новичок
Джуниор
 
Регистрация: 10.05.2011
Сообщений: 10
По умолчанию Динамическая индикация для Atmega 8535. Проблема.

Добрый день всем. Ситуация у меня такая: получил задание реализовать программу, которая будет гонять бегущий огонь по семисегментному индикатору (то есть зажигаться будут по очереди с a до g - сегменты), плюс нужно задействовать прерывание, которое по нажатию кнопки поменяет направление бега (т.е. с g до a).
Вот программа:

.include "m8535def.inc";
.cseg;
.org $0000;
.def C1=r20;
.def C2=r21;
.def C3=r22;
rjmp reset;
.org $001;
rjmp pr0;
.org $002;
rjmp pr1
reset:;
Ldi r16,low(RAMEND);
Ldi r17,high(RAMEND);
out spl,r16;
out sph,r17;
Ldi r16,0xFF;
Ldi r17,0x00;
out DDRC,r16;
out DDRA,r16;
out DDRD,r17;
out PortD,r16;
Ldi r16,0xFF;
Ldi r17,$c0;
out GICR,r17;
Ldi r18,$0f;
out MCUCR,r18;
sei;
main:
LDI C1,$60;
LDI C2,$E3;
Ldi C3,$16;
sbic PinD,1
rjmp pr0
sbic PinD,2
rjmp pr1
ldi r25,0x80
ldi r23,0x01
out PortA,r23
out PortC,r25;
rcall delay;
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0x40
out PortC,r25;
rcall delay;
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0x20
out PortC,r25;
rcall delay;
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0x10
out PortC,r25;
rcall delay;
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0x08
out PortC,r25;
rcall delay;
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0x04
out PortC,r25;
rcall delay;
rjmp main
pr0:
ldi r23,0x01
out PortA,r23
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0x80
out PortC,r25; a=1
rcall delay;
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0x40
out PortC,r25; b=1
rcall delay;
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0x20
out PortC,r25; c=1
rcall delay;
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0x10
out PortC,r25; d=1
rcall delay;
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0x08
out PortC,r25; e=1
rcall delay;
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0x04
out PortC,r25; f=1
rcall delay;
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0xFF
out GIFR,r25
reti;
pr1:
ldi r23,0x01
out PortA,r23
ldi r25,0x04
out PortC,r25; f=1
rcall delay;
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0x08
out PortC,r25; e=1
rcall delay;
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0x10
out PortC,r25; d=1
rcall delay;
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0x20
out PortC,r25; c=1
rcall delay;
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0x40;
out PortC,r25; b=1
rcall delay;
ldi r25,0x00
out PortC,r25
rcall delay
ldi r25,0x80;
out PortC,r25; a=1
rcall delay;
ldi r25,0xFF
out GIFR,r25
reti;
delay:
in r24,Sreg
subi C1,1;
sbci C2,0;
sbci C3,2;
brcc delay;
out SREG,r24;
ret;



В реальности высвечивается "0". То есть, может быть сегменты зажигаются слишком быстро. Но выдержку времени в процедуре delay я менял много раз - не помогает. В чём проблема?
Mr_Gutsy вне форума Ответить с цитированием
Старый 10.05.2011, 18:43   #2
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

А как подключен индикатор, т.е. к какому порту?
С.М.С вне форума Ответить с цитированием
Старый 10.05.2011, 19:07   #3
Mr_Gutsy
Новичок
Джуниор
 
Регистрация: 10.05.2011
Сообщений: 10
По умолчанию

Со всех битов порта C - на вход индикатора (порт А разрешает вывод). Я проверил на симуляторе - сегменты загораются по порядку, направление меняется, всё работает. В лаборатории горит 0.
Mr_Gutsy вне форума Ответить с цитированием
Старый 10.05.2011, 19:22   #4
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

Сколько частота тактирования?
С.М.С вне форума Ответить с цитированием
Старый 10.05.2011, 19:28   #5
Mr_Gutsy
Новичок
Джуниор
 
Регистрация: 10.05.2011
Сообщений: 10
По умолчанию

Ну в последней редакции - 1500000. До этого ставил - 300000 с тем же успехом.
Mr_Gutsy вне форума Ответить с цитированием
Старый 10.05.2011, 19:29   #6
Mr_Gutsy
Новичок
Джуниор
 
Регистрация: 10.05.2011
Сообщений: 10
По умолчанию

Сам контроллер - 8 МГц
Mr_Gutsy вне форума Ответить с цитированием
Старый 10.05.2011, 20:03   #7
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

Тактирование у вас от кварца? в лаборатории сколько? программа работает вроде как. Если вы берёте частоту тактирования контроллера 8МГц, то частота смены изображения на индикаторе 74,4 Гц, ну или около того, естественно глаз это не воспринимает.

Последний раз редактировалось С.М.С; 10.05.2011 в 20:08.
С.М.С вне форума Ответить с цитированием
Старый 10.05.2011, 20:14   #8
Mr_Gutsy
Новичок
Джуниор
 
Регистрация: 10.05.2011
Сообщений: 10
По умолчанию

Цитата:
Тактирование у вас от кварца?
Не понял про что, я не программист

Суть в том, что ровно та же процедура задержки с частотой 320000 сработала в программе бегущего огня по 8 диодам - там было около 0,2 с между загоранием следующего диода.
Я думал, что чем больше число
(LDI C1,$60;
LDI C2,$E3;
Ldi C3,$16, тем дольше программная задержка. Как получилось 75 Гц?
Mr_Gutsy вне форума Ответить с цитированием
Старый 10.05.2011, 20:33   #9
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

кварц-кварцевый резонатор - внешнее тактирующее устройство контроллера.

извеняюсь общитался, если не принимаь во внимание число тактов на каждую из коман получится 8000000\256\3\2 = 5208Гц, что ещё хуже.

вы написали:
Код:
delay:
in r24,Sreg
subi C1,1; 
sbci C2,0;
sbci C3,2;
brcc delay;
out SREG,r24;
ret;
ну а работает в действительности, только
sbci C3,2;
т.к С3 достигает 0, через 255 вычитаний и устанавливается флаг переноса. Поэтому глаз не успевает зафиксировать горящий сегмент.

В общем переделайте задержку, ну или на удалите хотябы строчку sbci C3,2;

Последний раз редактировалось С.М.С; 10.05.2011 в 20:43.
С.М.С вне форума Ответить с цитированием
Старый 10.05.2011, 20:43   #10
Mr_Gutsy
Новичок
Джуниор
 
Регистрация: 10.05.2011
Сообщений: 10
По умолчанию

А! Не-не-не, там опечатка: из С3 вычитается 2, чтобы на симуляторе быстрее смотреть.

Должно быть
subi C1,1;
sbci C2,0;
sbci C3,0;

В нашей методички написали:
"Итак, чтобы получить 8000000 тактов нужно записать в регистры С1-С3 число 8000000/5, то есть 1600000 или $186A00. Это даст интервал в 1 секунду."
Что не так?
Mr_Gutsy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AVR ATmega 128: почему не происходит переход? Blondy Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 06.05.2011 01:28
Индикация для плеера Сергей Михайлович Фриланс 2 09.02.2011 09:01
надо программу на Atmega sers88 Помощь студентам 6 26.09.2010 16:28
Atmega AT90CAN128 Требуется программист Simok Фриланс 3 31.03.2010 12:29
Нужна помощь знающих написания для Atmega lexaalt Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 28.05.2009 13:05