реклама на сайте
подробности

 
 
> AVRStudio, косяк какойто
viael
сообщение Sep 17 2006, 13:05
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 200
Регистрация: 10-04-06
Из: Украина,Запорожье
Пользователь №: 15 979



Пишу прогу в яре,отлаживаюсь в студии.Вот кусок кода на С
Код
    SETBIT(TIFR1,ICF1);//clear icf1 interrupt flag  
    TCNT1=0;            //clear timer1
    SETBIT(TIFR1,TOV1); //clear overflow interrpt flag for timer1

и дизасемблерный
Код
99:           SETBIT(TIFR1,ICF1);//clear icf1 interrupt flag  
+0000015A:   9AB5        SBI     0x16,5           Set bit in I/O register
100:          TCNT1=0;            //clear timer1
+0000015B:   D011        RCALL   PC+0x0012        Relative call subroutine
101:          SETBIT(TIFR1,TOV1); //clear overflow interrpt flag for timer1
+0000015C:   9AB0        SBI     0x16,0           Set bit in I/O register


Вопрос такой кманда SBI 0x16,5 должна сбросить 5-й бит в регистре TIFR1, а если верить симулятору AVRStudio то очищается весь регистр целиком.Это как понимать?Глюк симулятора?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Harvester
сообщение Sep 18 2006, 05:59
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(viael @ Sep 17 2006, 17:05) *
Вопрос такой кманда SBI 0x16,5 должна сбросить 5-й бит в регистре TIFR1, а если верить симулятору AVRStudio то очищается весь регистр целиком.Это как понимать?Глюк симулятора?


Для установки/сброса отдельного флага прерывания нельзя использовать команды sbi/cbi, т.к. они относятся к командам типа "чтение/модификация/запись". Т.е. они сначала считывают регистр, затем меняют в нем бит, после чего записывают весь регистр обратно. Ну а поскольку сброс флагов выполняется записью единицы... - результат Вы видите. И AVRStudio здесь ни причем.


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 18 2006, 08:18
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Harvester @ Sep 18 2006, 09:59) *
Для установки/сброса отдельного флага прерывания нельзя использовать команды sbi/cbi, т.к. они относятся к командам типа "чтение/модификация/запись". Т.е. они сначала считывают регистр, затем меняют в нем бит, после чего записывают весь регистр обратно. Ну а поскольку сброс флагов выполняется записью единицы... - результат Вы видите. И AVRStudio здесь ни причем.

Ну незнаю, читаем DataSheet на ATmega48/88/168 страница 23:

I/O Memory
.................................
.................................
Some of the Status Flags are cleared by writing a logical one to them. Note that, unlike
most other AVRs, the CBI and SBI instructions will only operate on the specified bit, and
can therefore be used on registers containing such Status Flags. The CBI and SBI
instructions work with registers 0x00 to 0x1F only.
Go to the top of the page
 
+Quote Post
Harvester
сообщение Sep 18 2006, 09:02
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(singlskv @ Sep 18 2006, 12:18) *
Цитата(Harvester @ Sep 18 2006, 09:59) *

Для установки/сброса отдельного флага прерывания нельзя использовать команды sbi/cbi, т.к. они относятся к командам типа "чтение/модификация/запись". Т.е. они сначала считывают регистр, затем меняют в нем бит, после чего записывают весь регистр обратно. Ну а поскольку сброс флагов выполняется записью единицы... - результат Вы видите. И AVRStudio здесь ни причем.

Ну незнаю, читаем DataSheet на ATmega48/88/168 страница 23:

I/O Memory
.................................
.................................
Some of the Status Flags are cleared by writing a logical one to them. Note that, unlike
most other AVRs, the CBI and SBI instructions will only operate on the specified bit, and
can therefore be used on registers containing such Status Flags. The CBI and SBI
instructions work with registers 0x00 to 0x1F only.

Извините, погорячился. sad.gif
В таком случае у меня есть два объяснения -
1. Недоработка кристалла (все-таки preliminary)
2. Действительно, не изменили модель в симуляторе.
Проверить можно только на реальном железе.

И все равно, я бы не советовал полагаться на такое поведение sbi/cbi хотя бы из соображений совместимости.


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 18 2006, 09:28
Сообщение #5


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Посмотрел еще несколько Datasheet и выяснил следующее.
В самых последних чипах ATtiny2313, ATmega48/88/168, AT90USBxxx, и т.д.
был изменен порядок работы с этими флагами.
В старых чипах было "чтение/модификация/запись", а
в более новых работа с отдельным битом.
Видимо они забыли отразить эти изменения в AVR Studio. sad.gif
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 06:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01414 секунд с 7
ELECTRONIX ©2004-2016