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

 
 
> 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
Ответов (1 - 11)
singlskv
сообщение Sep 17 2006, 14:59
Сообщение #2


дятел
*****

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



Цитата(viael @ Sep 17 2006, 17:05) *
Пишу прогу в яре,отлаживаюсь в студии.Вот кусок кода на С
Код
    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 то очищается весь регистр целиком.Это как понимать?Глюк симулятора?

Ну Вы хотя бы намекните какой у Вас контроллер. smile.gif
Да и кода бы побольше ...
Go to the top of the page
 
+Quote Post
viael
сообщение Sep 17 2006, 15:32
Сообщение #3


Местный
***

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



Цитата(singlskv @ Sep 17 2006, 18:59) *
Цитата(viael @ Sep 17 2006, 17:05) *

Пишу прогу в яре,отлаживаюсь в студии.Вот кусок кода на С
Код
    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 то очищается весь регистр целиком.Это как понимать?Глюк симулятора?

Ну Вы хотя бы намекните какой у Вас контроллер. smile.gif
Да и кода бы побольше ...


Контроллер Мега48. Больше кода?А зачем? Весь вопрос в том почему очищается весь регистр.Мне всего лишь нужно програмно сбросить флаг захвата таймера1 и флаг перепонения таймера1 не торгая другие биты.И по идее все правильно SBI,CBI битовые команды которые работают с одним битом, но в СИМУЛЯТОРЕ очищается весь регистр вот я спрашиваю может эток глюк AVRStudio?

Добалю...
AVR Studio 4.12.490 Service Pack 3
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 17 2006, 16:42
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(viael @ Sep 17 2006, 18:32) *
Контроллер Мега48. Больше кода?А зачем? Весь вопрос в том почему очищается весь регистр.Мне всего лишь нужно програмно сбросить флаг захвата таймера1 и флаг перепонения таймера1 не торгая другие биты.И по идее все правильно SBI,CBI битовые команды которые работают с одним битом, но в СИМУЛЯТОРЕ очищается весь регистр вот я спрашиваю может эток глюк AVRStudio?

Добалю...
AVR Studio 4.12.490 Service Pack 3


Несмотря на некоторые высказывания практически ни разу не видел глюков в AVR Studio 4. Скорее всего так ведёт себя котроллер и в жизни. С другой стороны вроде бы проблем быть не должно, так как это флаги которые обычно взаимно не используются. (один таймер в нескольких режимах)
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 17 2006, 19:04
Сообщение #5


дятел
*****

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



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

Напишите вот так:
Код
    TIFR1=(1<<ICF1);
    TCNT1=0;
    TIFR1=(1<<TOV1);

И все будет OK. (Сбрасываются только биты установленные в 1 (согласно DataSheet))

Цитата(viael @ Sep 17 2006, 19:32) *
и дизасемблерный
Код
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 то очищается весь регистр целиком.Это как понимать?Глюк симулятора?

Контроллер Мега48. Весь вопрос в том почему очищается весь регистр.Мне всего лишь нужно програмно сбросить флаг захвата таймера1 и флаг перепонения таймера1 не торгая другие биты.И по идее все правильно SBI,CBI битовые команды которые работают с одним битом, но в СИМУЛЯТОРЕ очищается весь регистр вот я спрашиваю может эток глюк AVRStudio?

Добалю...
AVR Studio 4.12.490 Service Pack 3

А косяк явно есть, нужно глубоко копать файл ATmega48.xml в AVR Studio.
Go to the top of the page
 
+Quote Post
junoSynthesizer
сообщение Sep 17 2006, 20:27
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 83
Регистрация: 25-11-05
Из: odessa
Пользователь №: 11 397



что то мне тут не понятно - тоже как новичку, работающему с иаром.


функция SETBIT(TIFR1,ICF1)


у меня это расписано в хэдэре так:

#define setbit(p,n) (p|=bit(n))
#define clrbit(p,n) (p&=~bit(n))
а у вас?


следовательно, мне не понятно почему:
если вам надо очитстить бит, вы делаете СЭТБИТ а не ЦЛРБИТ


--------------------
Вся жизнь - ништяк, все бабы - леди, а солнце - шар дающий свет
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 17 2006, 20:42
Сообщение #7


дятел
*****

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



Цитата(junoSynthesizer @ Sep 18 2006, 00:27) *
что то мне тут не понятно - тоже как новичку, работающему с иаром.


функция SETBIT(TIFR1,ICF1)


у меня это расписано в хэдэре так:

#define setbit(p,n) (p|=bit(n))
#define clrbit(p,n) (p&=~bit(n))
а у вас?


следовательно, мне не понятно почему:
если вам надо очитстить бит, вы делаете СЭТБИТ а не ЦЛРБИТ

ну просто внимательно читаем Datasheet:

• Bit 1 – OCF1A: Timer/Counter1, Output Compare A Match Flag

и т.д. ...

..........................
Alternatively, OCF1A can be cleared by writing a logic one to its bit location.
• Bit 0 – TOV1: Timer/Counter1, Overflow Flag
..........................
Alternatively, TOV1 can be cleared by writing a logic one to its bit location.
Go to the top of the page
 
+Quote Post
Harvester
сообщение Sep 18 2006, 05:59
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 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
Сообщение #9


дятел
*****

Группа: Свой
Сообщений: 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
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 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
Сообщение #11


дятел
*****

Группа: Свой
Сообщений: 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
viael
сообщение Sep 18 2006, 16:34
Сообщение #12


Местный
***

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



Цитата(singlskv @ Sep 18 2006, 13:28) *
Посмотрел еще несколько Datasheet и выяснил следующее.
В самых последних чипах ATtiny2313, ATmega48/88/168, AT90USBxxx, и т.д.
был изменен порядок работы с этими флагами.
В старых чипах было "чтение/модификация/запись", а
в более новых работа с отдельным битом.
Видимо они забыли отразить эти изменения в AVR Studio. sad.gif

Да похоже в студии остался косячок т.к. в реале девайс работает без проблем cheers.gif
Go to the top of the page
 
+Quote Post

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

 


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


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