|
|
  |
AVRStudio, косяк какойто |
|
|
|
Sep 17 2006, 13:05
|
Местный
  
Группа: Свой
Сообщений: 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 то очищается весь регистр целиком.Это как понимать?Глюк симулятора?
|
|
|
|
|
Sep 17 2006, 14:59
|
дятел
    
Группа: Свой
Сообщений: 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 то очищается весь регистр целиком.Это как понимать?Глюк симулятора? Ну Вы хотя бы намекните какой у Вас контроллер. Да и кода бы побольше ...
|
|
|
|
|
Sep 17 2006, 15:32
|
Местный
  
Группа: Свой
Сообщений: 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 то очищается весь регистр целиком.Это как понимать?Глюк симулятора? Ну Вы хотя бы намекните какой у Вас контроллер. Да и кода бы побольше ... Контроллер Мега48. Больше кода?А зачем? Весь вопрос в том почему очищается весь регистр.Мне всего лишь нужно програмно сбросить флаг захвата таймера1 и флаг перепонения таймера1 не торгая другие биты.И по идее все правильно SBI,CBI битовые команды которые работают с одним битом, но в СИМУЛЯТОРЕ очищается весь регистр вот я спрашиваю может эток глюк AVRStudio? Добалю... AVR Studio 4.12.490 Service Pack 3
|
|
|
|
|
Sep 17 2006, 19:04
|
дятел
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Sep 17 2006, 20:27
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 25-11-05
Из: odessa
Пользователь №: 11 397

|
что то мне тут не понятно - тоже как новичку, работающему с иаром.
функция SETBIT(TIFR1,ICF1)
у меня это расписано в хэдэре так:
#define setbit(p,n) (p|=bit(n)) #define clrbit(p,n) (p&=~bit(n)) а у вас?
следовательно, мне не понятно почему: если вам надо очитстить бит, вы делаете СЭТБИТ а не ЦЛРБИТ
--------------------
Вся жизнь - ништяк, все бабы - леди, а солнце - шар дающий свет
|
|
|
|
|
Sep 17 2006, 20:42
|
дятел
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Sep 18 2006, 05:59
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(viael @ Sep 17 2006, 17:05)  Вопрос такой кманда SBI 0x16,5 должна сбросить 5-й бит в регистре TIFR1, а если верить симулятору AVRStudio то очищается весь регистр целиком.Это как понимать?Глюк симулятора? Для установки/сброса отдельного флага прерывания нельзя использовать команды sbi/cbi, т.к. они относятся к командам типа "чтение/модификация/запись". Т.е. они сначала считывают регистр, затем меняют в нем бит, после чего записывают весь регистр обратно. Ну а поскольку сброс флагов выполняется записью единицы... - результат Вы видите. И AVRStudio здесь ни причем.
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Sep 18 2006, 08:18
|
дятел
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Sep 18 2006, 09:02
|
Местный
  
Группа: Участник
Сообщений: 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. Извините, погорячился. В таком случае у меня есть два объяснения - 1. Недоработка кристалла (все-таки preliminary) 2. Действительно, не изменили модель в симуляторе. Проверить можно только на реальном железе. И все равно, я бы не советовал полагаться на такое поведение sbi/cbi хотя бы из соображений совместимости.
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Sep 18 2006, 09:28
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Посмотрел еще несколько Datasheet и выяснил следующее. В самых последних чипах ATtiny2313, ATmega48/88/168, AT90USBxxx, и т.д. был изменен порядок работы с этими флагами. В старых чипах было "чтение/модификация/запись", а в более новых работа с отдельным битом. Видимо они забыли отразить эти изменения в AVR Studio.
|
|
|
|
|
Sep 18 2006, 16:34
|
Местный
  
Группа: Свой
Сообщений: 200
Регистрация: 10-04-06
Из: Украина,Запорожье
Пользователь №: 15 979

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