Форум РадиоКот https://radiokot.ru/forum/ |
|
Программа тупо зацикливается. https://radiokot.ru/forum/viewtopic.php?f=57&t=109107 |
Страница 1 из 1 |
Автор: | Az4nt [ Вс окт 26, 2014 16:31:58 ] | ||
Заголовок сообщения: | Программа тупо зацикливается. | ||
Подскажите пожалуйста не так давно начал изучать МК, добрался до счетчиков/таймеров, взял на рассмотрение пример из учебника, так вот программа тупо зацикливается, на задержке где метка m1, если записать в константу count значение от 0 до 255 все работает, как нада, но мне нужно 300, пример взял из книги немного переделал для себя, вот кусок из программы: частота кристалла 1 МГц .include "m8def.inc" .def temp=r16 .def temp1=r17 .equ count=300 ;инициализация таймера Т1 ; предделитель 1024 ldi temp,0x05 out TCCR1B,temp ;---------- ; задержка с использованием счетчика delay: push temp ldi temp,0 out TCNT1H,temp out TCNT1L,temp m1: in temp,TCNT1L cpi temp,low(count) ; вот здесь проявляется проблема если count определить 0-255 все работает, нада 300 или больше brlo m1 m2: in temp,TCNT1H cpi temp,high(count) brlo m2 pop temp ret
|
Автор: | CyberVad [ Вс окт 26, 2014 20:23:59 ] |
Заголовок сообщения: | Re: Программа тупо зацикливается. |
Я не соображаю в АВРовском ассемблере, скажу идею. от 0 по 255 это же байт, а от 256 до 65535 - два байта. Та переменная должна быть двухбайтной. Видимо в асме нет таких переменных. Ну всё равно решается - просто будет не одна переменная а две - в одной младший байт числа (например того же 300) а в другом старший |
Автор: | Pink-Pank [ Вс окт 26, 2014 21:04:13 ] |
Заголовок сообщения: | Re: Программа тупо зацикливается. |
CyberVad, если не соображаете - зачем давать советы? ![]() И кого Вы там размножаете своей подписью? Az4nt, Вам: 1. Стек используется, но не инициализирован 2. Не правильно организована задержка с двухбайтным числом 3. Куда Вас выкидывает ретурн? По какому адресу? И зачем Вы его вообще туда пхнули? 4. Не плохо было бы отключить сторожевой таймер. 5. Программа у Вас скорее всего виснет на метке m2, а не m1, как Вы сказали. Поскольку вместо TCNT1H обращаетесь к промежуточному регистру TEMP (нет, не тот temp, что Вы объявили), который не обновляется (нет чтения младшего регистра) и всегда равен 0 в Вашем случае (условие второй метки всегда истинно). Читайте подробнее про обращение к 16-разрядным регистрам. |
Автор: | Kavka [ Вс окт 26, 2014 21:41:52 ] |
Заголовок сообщения: | Re: Программа тупо зацикливается. |
Az4nt, начните, как уже посоветовали, с этого. Pink-Pank писал(а): Читайте подробнее про обращение к 16-разрядным регистрам. А потом выясните как правильно сравнивать двухбайтовые числа.CyberVad, у автора темы ещё не сложилось понимание нужного ему алгоритма. Ваш совет может стать полезным, если автор темы правильно его осмыслит. Так что не горячитесь "минусы" раздавать. ![]() |
Автор: | Pink-Pank [ Пн окт 27, 2014 03:24:07 ] |
Заголовок сообщения: | Re: Программа тупо зацикливается. |
CyberVad - мужик! Нажал на кнопку "Да пошел ты!"))))) |
Автор: | Az4nt [ Пн окт 27, 2014 03:54:58 ] |
Заголовок сообщения: | Re: Программа тупо зацикливается. |
стек я про инициализировал. Просто я сюда написал тот кусок программы который не работает как нада вот полная программа: пример с задержкой с помощью счетчика взят из учебника, если count определить числом не больше байта, программа работает как нада, так как число больше байта я сравниваю сперва младшие разряды, а потом старшие: cpi temp,Low(count), cpi temp,Low(count): Вот подскажите пожалуйста где я ошибаюсь ; частота кристалла 1 МГц .include "m8def.inc" .def temp=r16 .def temp1=r17 .equ count=300 .cseg .org 0 ; инициализация стека ldi temp,low(ramend) out spl,temp ldi temp,high(ramend) out sph,temp ; ИНИЦИАЛИЗАЦИЯ ПОРТОВ ;---------- ldi temp,0b11111110 out ddrd,temp ldi temp,0b11111111 out portd,temp ldi temp,0b11111111 out ddrb,temp ldi temp,0b00000000 out portb,temp ;---------- ;инициализация таймера Т1 ; предделитель 1024 ldi temp,0x05 out TCCR1B,temp ;программа main: in temp,pind sbrs temp,0 ; пропускаем если кнопка отжата rjmp vlevo ;сдвиг вправо ldi temp, 0b00000001 out portb,temp flag1: rcall delay lsl temp out portb,temp brcc flag1 rjmp main ;сдвиг влево vlevo: ldi temp, 0b10000000 out portb,temp flag2: rcall delay lsr temp out portb,temp brcc flag2 rjmp main ;---------- ; задержка с использованием счетчика delay: push temp ldi temp,0x00 out TCNT1H,temp out TCNT1L,temp m1: in temp,TCNT1L cpi temp,Low(count) brlo m1 m2: in temp,TCNT1H cpi temp,High(count) brlo m2 pop temp ret Если число 300 задать двумя регистрами 0x01 и 0x2C и использовать эти два регистра при сравнений, все равно программа не работает и зацикливается а метке m1, в атмел студио прогонял и в протеусе эмулировал. Если я не правильно сравниваю, подскажите книжку или ресурс в интернете, я сам взял из учебника Белова. |
Автор: | Pink-Pank [ Пн окт 27, 2014 04:01:34 ] |
Заголовок сообщения: | Re: Программа тупо зацикливается. |
Так Вам уже сказали.) Не правильно работаете с 16-разрядными регистрами. Ссылку в гугл дать или сами сможете набрать? Да, и все-таки сторожа отключите. ![]() |
Автор: | Az4nt [ Пн окт 27, 2014 04:12:41 ] | ||
Заголовок сообщения: | Re: Программа тупо зацикливается. | ||
пока писал сообщение мне уже ответили. Если интересно могу прикрепить скриншот примера из учебника
|
Автор: | Az4nt [ Пн окт 27, 2014 04:34:31 ] |
Заголовок сообщения: | Re: Программа тупо зацикливается. |
Всем кто ответил спасибо. Программа заработала когда я одновременно считывал регистр TCNT1. Вот так у меня получилось задержка в итоге: ; задержка с использованием счетчика delay: push temp ldi temp,0x00 ldi temp1,0x00 out TCNT1H,temp out TCNT1L,temp1 m1: in temp,TCNT1L in temp1,TCNT1H cpi temp,Low(count) brlo m1 m2: in temp,TCNT1L in temp1,TCNT1H cpi temp1,High(count) brlo m2 pop temp ret Но все равно пример с учебника не дает мне покоя. Это косяк автора или мой косяк был(( |
Автор: | akl [ Пн окт 27, 2014 04:55:20 ] |
Заголовок сообщения: | Re: Программа тупо зацикливается. |
Это "косяк" автора учебника. Обращение к 16-разрядным регистрам периферии атомарная операция, т.е. записали весь регистр(старший-младший) и считали весь регистр(младший-старший). Код: DEL:
.def zero=R0 CLR ZERO OUT TCCR1B,ZERO OUT TCNT1H,ZERO OUT TCNT1L,ZERO LDI XH,HIGH(COUNT) LDI XL,LOW(COUNT) LDI R19,$05 OUT TCCR1B,R19 GO_DEL: IN YL,TCNT1L IN YH,TCNT1H CP YL,XL CPC YH,XH BRLO GO_DEL OUT TCCR1B,ZERO OUT TCNT1H,ZERO OUT TCNT1L,ZERO RET |
Автор: | Pink-Pank [ Пн окт 27, 2014 04:56:53 ] |
Заголовок сообщения: | Re: Программа тупо зацикливается. |
Ваш это косяк. Автор использует одну и ту же метку, а не две разных. В результате у автора будет работать, а у Вас -нет. |
Автор: | akl [ Пн окт 27, 2014 06:01:50 ] |
Заголовок сообщения: | Re: Программа тупо зацикливается. |
Только вместо ожидаемых 300...511 задержка будет 256, что, согласитесь, не совсем правильно. |
Автор: | Pink-Pank [ Пн окт 27, 2014 06:51:07 ] |
Заголовок сообщения: | Re: Программа тупо зацикливается. |
А вот здесь Вы ошиблись. ) Задержка будет ровно такой, сколько нужно (после переполнения счет в TCNT1L вновь начнется с 0 и проверка первого условия возобновится). Цитата: Если я не правильно сравниваю, подскажите книжку или ресурс в интернете, я сам взял из учебника Белова Скачайте Евстифеева "Микроконтроллеры AVR. Семейства Mega и Tiny." Будете ее листать в дополнение к Белову. ) Ответ на свой вопрос найдете в главе о 16-тиразярядных таймерах. Там подзаголовок "Операции с 16-разрядными регистрами". |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |