Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
RiSt0R
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 17
1

ATmega8 странно работает процедура задержки.

28.05.2016, 10:29. Просмотров 3538. Ответов 2
Метки нет (Все метки)

Здравствуйте, уважаемые. Подскажите, пожалуйста, начинающему. Вообщем, такая ситуация:
ATmega8 + AtmelStudyo + khazama AVR Prokrammer
Имеется следующая программа. Примитив, моргание светодиодиком:
Код
.def temp = r16
.def razr1 = r17
.def razr2 = r18
.def razr3 = r19

.dseg
.cseg
.org 0        ;Задание нулевого адреса старта программы
rjmp risit  ;Безусловный переход к метке risit

Riset:
ldi temp, high(ROMEND)
out sph, temp
ldi temp, low(ROMEND)
out spl, temp

ldi temp, 0b00000001
out DDRD, temp

main_loop:

ldi temp, 0b00000001
out PORTD, temp

rcall Delay // <- Такое ощущение, что тут программа повисает.

ldi temp, 0b00000000
out PORTD, temp

rjmp main_loop

Delay: // Задержка
ldi razr1, 255 // Пихаем в razr1 - 255
ldi razr2, 255 // Пихаем в razr2 - 255
ldi razr3, 10 // Пихаем в razr3 - 10
PDelay: // Метка PDelay
dec razr1 // "dec" команда понижает регистр на 1 (декремент) в данном случае razr1
brne PDelay // перейти на PDelay, если razr1 не = 0
dec razr2 // тут по аналогии
brne PDelay // тут по аналогии
dec razr3 // тут по аналогии
brne PDelay // тут по аналогии
ret // "ret" - команда выхода из подпрограммы
Динную программу я взял с одного обучающего видео. Проблема в том, что диод не моргает, а постоянно горит. Если закоментировать следующую строку: "rcall Delay // <- Такое ощущение, что тут программа повисает.", то светодиод горит в пол силы (очень часто загорается и гаснет), что понятно. На эмуляторе Proteus в режиме Run ситуация такая же - светодиод загорается и не гаснет. Но, в режиме отладки светодиод корректно загорается и гаснет (т.е. работает). В студии в режиме отладки так-же состояние порта корректно меняется. Самая мякотка в том, что данная процедура задержки прекрасно работает в следующем коде:
Код
.def temp = r16
.def razr1 = r17
.def razr2 = r18
.def razr3 = r19

.dseg
.cseg
.org 0
mass: .db 5,4,3,8,3,2,1,7,0
rjmp Riset

Riset:
ldi temp, high(ROMEND)
out sph, temp
ldi temp, low(ROMEND)
out spl, temp

ldi temp, 0b00000001
out DDRD, temp

ldi temp, 0b00000000

out DDRB, temp
out DDRC, temp

ldi temp, 0b11111111
out PORTB, temp
out PORTC, temp
ldi temp, 0b11111110
out PORTD, temp

begin:
ldi zl, low(mass<<1) ; загрузка в регистр ZL low адреса массива mass
ldi zh, high(mass<<1) ; загрузка в регистр ZH high адреса массива

main_loop:
//sbic PIND, 0 //Если кнопка не нажата
//rjmp main_loop //Прыгаем обратно в главный цикл

ldi r20, 0
lpm temp, z+ ; загрузка данных в регистр r0
cp temp, r20
brne blink
breq begin
rjmp main_loop

blink:
mov r21, temp
l:
ldi temp, 0b00000001
out PORTD, temp
rcall Delay
ldi temp, 0b00000000
out PORTD, temp
rcall Delay
dec r21
cp r21, r20
breq main_loop
rjmp l

Delay: // Задержка
ldi razr1, 255 // Пихаем в razr1 - 255
ldi razr2, 255 // Пихаем в razr2 - 255
ldi razr3, 10 // Пихаем в razr3 - 10
PDelay: // Метка PDelay
dec razr1 // "dec" команда понижает регистр на 1 (декремент) в данном случае razr1
brne PDelay // перейти на PDelay, если razr1 не = 0
dec razr2 // тут по аналогии
brne PDelay // тут по аналогии
dec razr3 // тут по аналогии
brne PDelay // тут по аналогии
ret // "ret" - команда выхода из подпрограммы
Динная программа прекрасно работает и на железе и на эмуляторе. Пробовал разные микропроцессоры, но результат неизменен. Собственно, вопрос, почему не работает первая программа, но работает вторая?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2016, 10:29
Ответы с готовыми решениями:

Не работает в железе (работает в Proteus, ATmega8, ASM)
Прошивка работает в протеусе (V 7.7 SP 2), но не работает в железе. На счет фьюзов не совсем уверен...

Как работает функция задержки на ассемблере?
Следующая программа зажигает светодиод на 1000 милисекунд и на такое же время тушит. Я хочу...

Не работает SPI на ATMEGA8
Имеется код: #define ClearBit(reg, bit) reg &amp;= (~(1&lt;&lt;(bit))) //пример: ClearBit(PORTB,...

Не работает ШИМ МК AtMega8
Делаю импульсный блок питания 30В, 5А. Пишу не сложную прошивку для МК AtMega 8, в протеусе все...

Atmega8 не работает Timer1
Не могу понять в чем проблема, Timer0 запустил и работает, а первый вообще не работает. Не могу...

2
domis
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 82
28.05.2016, 11:09 2
Сравни первую со второй.
Код
  ldi temp, 0b00000001
out PORTD, temp
rcall Delay
ldi temp, 0b00000000
out PORTD, temp
rcall Delay
0
RiSt0R
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 17
28.05.2016, 11:17 3
Посыпаю голову пеплом и ухожу в монастырь ) Спасибо!
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2016, 11:17

ATmega8 + DS18B20. Не работает
Мужики, помогите пожалуйста разобраться с термометром ничего в голову уже не лезет. Буду благодарен...

Не работает внешнее прерывание в ATMega8 (CodeVisionAVR 3.10)
Среда CodeVisionAVR 3.10, вот код #include &lt;mega8.h&gt; interrupt void ext_int0_isr(void) {...

Разница между ATMEGA8-16AI и ATMEGA8-16AU
Кто подскажет, в чем разница между ATMEGA8-16AI и ATMEGA8-16AU. Смотрю в Платане цены между ними...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.