![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 10.05.2011
Сообщений: 10
|
![]()
Добрый день всем. Ситуация у меня такая: получил задание реализовать программу, которая будет гонять бегущий огонь по семисегментному индикатору (то есть зажигаться будут по очереди с 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 я менял много раз - не помогает. В чём проблема? |
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 29.12.2008
Сообщений: 1,598
|
![]()
А как подключен индикатор, т.е. к какому порту?
|
![]() |
![]() |
![]() |
#3 |
Новичок
Джуниор
Регистрация: 10.05.2011
Сообщений: 10
|
![]()
Со всех битов порта C - на вход индикатора (порт А разрешает вывод). Я проверил на симуляторе - сегменты загораются по порядку, направление меняется, всё работает. В лаборатории горит 0.
|
![]() |
![]() |
![]() |
#4 |
Участник клуба
Регистрация: 29.12.2008
Сообщений: 1,598
|
![]()
Сколько частота тактирования?
|
![]() |
![]() |
![]() |
#5 |
Новичок
Джуниор
Регистрация: 10.05.2011
Сообщений: 10
|
![]()
Ну в последней редакции - 1500000. До этого ставил - 300000 с тем же успехом.
|
![]() |
![]() |
![]() |
#6 |
Новичок
Джуниор
Регистрация: 10.05.2011
Сообщений: 10
|
![]()
Сам контроллер - 8 МГц
|
![]() |
![]() |
![]() |
#7 |
Участник клуба
Регистрация: 29.12.2008
Сообщений: 1,598
|
![]()
Тактирование у вас от кварца? в лаборатории сколько? программа работает вроде как. Если вы берёте частоту тактирования контроллера 8МГц, то частота смены изображения на индикаторе 74,4 Гц, ну или около того, естественно глаз это не воспринимает.
Последний раз редактировалось С.М.С; 10.05.2011 в 20:08. |
![]() |
![]() |
![]() |
#8 | |
Новичок
Джуниор
Регистрация: 10.05.2011
Сообщений: 10
|
![]() Цитата:
![]() Суть в том, что ровно та же процедура задержки с частотой 320000 сработала в программе бегущего огня по 8 диодам - там было около 0,2 с между загоранием следующего диода. Я думал, что чем больше число (LDI C1,$60; LDI C2,$E3; Ldi C3,$16 ![]() |
|
![]() |
![]() |
![]() |
#9 |
Участник клуба
Регистрация: 29.12.2008
Сообщений: 1,598
|
![]()
кварц-кварцевый резонатор - внешнее тактирующее устройство контроллера.
извеняюсь общитался, если не принимаь во внимание число тактов на каждую из коман получится 8000000\256\3\2 = 5208Гц, что ещё хуже. вы написали: Код:
sbci C3,2; т.к С3 достигает 0, через 255 вычитаний и устанавливается флаг переноса. Поэтому глаз не успевает зафиксировать горящий сегмент. В общем переделайте задержку, ну или на удалите хотябы строчку sbci C3,2; Последний раз редактировалось С.М.С; 10.05.2011 в 20:43. |
![]() |
![]() |
![]() |
#10 |
Новичок
Джуниор
Регистрация: 10.05.2011
Сообщений: 10
|
![]()
А! Не-не-не, там опечатка: из С3 вычитается 2, чтобы на симуляторе быстрее смотреть.
Должно быть subi C1,1; sbci C2,0; sbci C3,0; В нашей методички написали: "Итак, чтобы получить 8000000 тактов нужно записать в регистры С1-С3 число 8000000/5, то есть 1600000 или $186A00. Это даст интервал в 1 секунду." Что не так? |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |