Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVRStudio
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
viael
Пишу прогу в яре,отлаживаюсь в студии.Вот кусок кода на С
Код
    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 то очищается весь регистр целиком.Это как понимать?Глюк симулятора?
singlskv
Цитата(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
Да и кода бы побольше ...
viael
Цитата(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
SasaVitebsk
Цитата(viael @ Sep 17 2006, 18:32) *
Контроллер Мега48. Больше кода?А зачем? Весь вопрос в том почему очищается весь регистр.Мне всего лишь нужно програмно сбросить флаг захвата таймера1 и флаг перепонения таймера1 не торгая другие биты.И по идее все правильно SBI,CBI битовые команды которые работают с одним битом, но в СИМУЛЯТОРЕ очищается весь регистр вот я спрашиваю может эток глюк AVRStudio?

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


Несмотря на некоторые высказывания практически ни разу не видел глюков в AVR Studio 4. Скорее всего так ведёт себя котроллер и в жизни. С другой стороны вроде бы проблем быть не должно, так как это флаги которые обычно взаимно не используются. (один таймер в нескольких режимах)
singlskv
Цитата(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.
junoSynthesizer
что то мне тут не понятно - тоже как новичку, работающему с иаром.


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


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

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


следовательно, мне не понятно почему:
если вам надо очитстить бит, вы делаете СЭТБИТ а не ЦЛРБИТ
singlskv
Цитата(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.
Harvester
Цитата(viael @ Sep 17 2006, 17:05) *
Вопрос такой кманда SBI 0x16,5 должна сбросить 5-й бит в регистре TIFR1, а если верить симулятору AVRStudio то очищается весь регистр целиком.Это как понимать?Глюк симулятора?


Для установки/сброса отдельного флага прерывания нельзя использовать команды sbi/cbi, т.к. они относятся к командам типа "чтение/модификация/запись". Т.е. они сначала считывают регистр, затем меняют в нем бит, после чего записывают весь регистр обратно. Ну а поскольку сброс флагов выполняется записью единицы... - результат Вы видите. И AVRStudio здесь ни причем.
singlskv
Цитата(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.
Harvester
Цитата(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 хотя бы из соображений совместимости.
singlskv
Посмотрел еще несколько Datasheet и выяснил следующее.
В самых последних чипах ATtiny2313, ATmega48/88/168, AT90USBxxx, и т.д.
был изменен порядок работы с этими флагами.
В старых чипах было "чтение/модификация/запись", а
в более новых работа с отдельным битом.
Видимо они забыли отразить эти изменения в AVR Studio. sad.gif
viael
Цитата(singlskv @ Sep 18 2006, 13:28) *
Посмотрел еще несколько Datasheet и выяснил следующее.
В самых последних чипах ATtiny2313, ATmega48/88/168, AT90USBxxx, и т.д.
был изменен порядок работы с этими флагами.
В старых чипах было "чтение/модификация/запись", а
в более новых работа с отдельным битом.
Видимо они забыли отразить эти изменения в AVR Studio. sad.gif

Да похоже в студии остался косячок т.к. в реале девайс работает без проблем cheers.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.