| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Что бы это значило?
17.01.2010, 01:22
|
|
|
Вид на жительство
Регистрация: 14.06.2009
Адрес: Україна Київська обл. м.Буча
Сообщений: 328
Сказал спасибо: 104
Сказали Спасибо 106 раз(а) в 70 сообщении(ях)
|
Что бы это значило?
Здравствуйте, уважаемые. Может кто-то не поленится прочитать. Так вот. Функция должна возвращать значение при отпускании клавиши. Так и происходит. Но стоит только раскоментировать строку, в которой сбрасывается флаг, соответствующий этой клавише, тут же она (функция)отказывается возвращать ненулевое значение. Если сбросить любой другой флаг слева или справа, возвращается то, что нужно. Выношу требуемое действие за пределы данной функции - ОК. Не глюк ли это компилятора?
(AVR GCC)
|
Код:
|
u08 KeyRaised(u08 key)
{
u08 temp;
temp=0;
if(key‹64)
{
temp=~(OldKeyboard[key/8] | Keyboard[key/8 ] ) & ChangeKeyboard[key/8] & BV(key % 8);
// ChangeKeyboard[key/8]&=~BV(key % 8);
}
return temp;
} |
|
|
|
|
17.01.2010, 02:45
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: Что бы это значило?
Сообщение от Djakovskij
|
Но стоит только раскоментировать строку, в которой сбрасывается флаг, соответствующий этой клавише, тут же она (функция)отказывается возвращать ненулевое значение. Если сбросить любой другой флаг слева или справа, возвращается то, что нужно. Выношу требуемое действие за пределы данной функции - ОК. Не глюк ли это компилятора?
(AVR GCC)
|
Т.е. если key ›63 нулевое значение не возвращается?
Давайте листинги с закоментированной строчкой и с раскомментированной.
|
|
|
|
17.01.2010, 03:27
|
|
|
Вид на жительство
Регистрация: 14.06.2009
Адрес: Україна Київська обл. м.Буча
Сообщений: 328
Сказал спасибо: 104
Сказали Спасибо 106 раз(а) в 70 сообщении(ях)
|
Re: Что бы это значило?
Спасибо, что откликнулись. Вкратце: сканирование клавиатуры 8х8 в таймерном прерывании. Три группы флагов - OldKeyboard, Keyboard (debouncing) и ChangeKeyboard (память отпущенной кнопки).
ScanKeyboard соответственно сканирует клавиатуру:
|
Код:
|
void ScanKeyboard(void)
{
u08 a,temp;
for(a=0;a‹8;a++)
{
ColPort=~(1‹‹a);
asm volatile ("nop\n nop\n");
temp=~RowPin;
ColPort=0xff;
ChangeKeyboard[a] |=~temp & Keyboard[a] & OldKeyboard[a];
OldKeyboard[a]=Keyboard[a];
Keyboard[a] =temp;
}
} |
KeyRaised смотрит, была ли нажата и отпущена определенная кнопка. Так вот после того как я убеждаюсь, что кнопка таки была нажата и хочу очистить флаг, соответствующий этой кнопке, KeyRaised возвращает совсем не то, что я ожидаю (возвращает 0). Без очистки этого флага функция работает замечательно. 64 это проверка на вылет параметров за пределы (клава 8х8 ). Спорный кусок дальше закомментирован.
|
Код:
|
u08 KeyRaised(u08 key)
{
u08 temp;
temp=0;
if(key‹64) //проверка входного значения на границы
{
temp=~(OldKeyboard[key/8] | Keyboard[key/8 ] ) & ChangeKeyboard[key/8] & BV(key % 8);//проверяю: да таки кнопка нажималась!
// ChangeKeyboard[key/8]&=~BV(key % 8);//обнуляю флаг и все, не работает! А без этой строки все так прекрасно!
}
return temp;
} |
|
|
|
|
17.01.2010, 04:03
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,138
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
|
Re: Что бы это значило?
Для начало попробуте заменить конструкции типа temp =~ RowPin; на (unsigned char) temp =~ RowPin; По умолчанию GCC производит преобразование типа в int. Т.е. в 16 битный, у Вас же очищаются тока младший байт а в старшем может быть мусор.
|
|
|
|
17.01.2010, 04:11
|
|
|
Вид на жительство
Регистрация: 14.06.2009
Адрес: Україна Київська обл. м.Буча
Сообщений: 328
Сказал спасибо: 104
Сказали Спасибо 106 раз(а) в 70 сообщении(ях)
|
Re: Что бы это значило?
Я и обьявляю их как u08 (т.е. unsigned char). Макрос есть такой.
#define u08 unsigned char
|
|
|
|
17.01.2010, 04:34
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: Что бы это значило?
Сообщение от Djakovskij
|
|
Три группы флагов - OldKeyboard, Keyboard (debouncing) и ChangeKeyboard (память отпущенной кнопки).
|
А можно на их объявление посмотреть?
И Вы KeyRaised(u08 key) потом 64 раза в цикле перебираете?
Последний раз редактировалось kison; 17.01.2010 в 04:38.
|
|
|
|
17.01.2010, 12:03
|
|
|
Вид на жительство
Регистрация: 14.06.2009
Адрес: Україна Київська обл. м.Буча
Сообщений: 328
Сказал спасибо: 104
Сказали Спасибо 106 раз(а) в 70 сообщении(ях)
|
Re: Что бы это значило?
|
Код:
|
u08 OldKeyboard[8];
u08 Keyboard[8];
u08 ChangeKeyboard[8]; |
KeyRaised() смотрит была ли нажата и отпущена конкретная кнопка, которую мы задаем в параметрах. Сканирует клавиатуру ScanKeyBoard() циклом за 8 раз. И вот:
|
Код:
|
if(KeyRaised(Key5))//Key1..Key64 предварительно определены
{
LCD_WriteString("HELLO!");//Выполняется, если флаг ChangeKeyboard не трогать, и не выполняется, если его очистить.
} |
|
|
|
|
17.01.2010, 17:36
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: Что бы это значило?
Сообщение от Djakovskij
|
|
KeyRaised() смотрит была ли нажата и отпущена конкретная кнопка, которую мы задаем в параметрах.
|
Ну вот и получается, что ее 64 раза надо вызвать.
Как я понимаю KeyRaised уже не в прерывании работает?
Тогда массивы должны быть объявлены не так:
|
Код:
|
u08 volatile OldKeyboard[8];
u08 volatile Keyboard[8];
u08 volatile ChangeKeyboard[8]; |
Хотя в этом случае косяков в общем и так быть не должно, но все же.
А вот модификация массивов, используемых и в основном цикле и в прерываниях, в основном цикле должна выполняться в критических секциях - при запрещенных прерываниях.
И ве же листинг ассемблерный для KeyRaised можно посмотреть? С закоментированной строчкой и с расскоментированной.
|
|
|
|
17.01.2010, 17:49
|
|
|
Вид на жительство
Регистрация: 14.06.2009
Адрес: Україна Київська обл. м.Буча
Сообщений: 328
Сказал спасибо: 104
Сказали Спасибо 106 раз(а) в 70 сообщении(ях)
|
Re: Что бы это значило?
Это без комментов.
|
Код:
|
u08 KeyRaised(u08 key)
{
524: 28 2f mov r18, r24
u08 temp;
temp=0;
if(key‹64)
526: 80 34 cpi r24, 0x40 ; 64
528: 10 f0 brcs .+4 ; 0x52e ‹KeyRaised+0xa›
52a: 90 e0 ldi r25, 0x00 ; 0
52c: 21 c0 rjmp .+66 ; 0x570 ‹KeyRaised+0x4c›
{
temp=(~(OldKeyboard[key/8] | Keyboard[key/8 ] ) & ChangeKeyboard[key/8] )& BV(key % 8);
52e: e8 2f mov r30, r24
530: e6 95 lsr r30
532: e6 95 lsr r30
534: e6 95 lsr r30
536: f0 e0 ldi r31, 0x00 ; 0
538: af 01 movw r20, r30
53a: 48 5e subi r20, 0xE8 ; 232
53c: 5e 4f sbci r21, 0xFE ; 254
53e: da 01 movw r26, r20
540: 6c 91 ld r22, X
542: 27 70 andi r18, 0x07 ; 7
544: 81 e0 ldi r24, 0x01 ; 1
546: 90 e0 ldi r25, 0x00 ; 0
548: 01 c0 rjmp .+2 ; 0x54c ‹KeyRaised+0x28›
54a: 88 0f add r24, r24
54c: 2a 95 dec r18
54e: ea f7 brpl .-6 ; 0x54a ‹KeyRaised+0x26›
550: 98 2f mov r25, r24
552: 96 23 and r25, r22
554: df 01 movw r26, r30
556: a0 5f subi r26, 0xF0 ; 240
558: be 4f sbci r27, 0xFE ; 254
55a: e8 5f subi r30, 0xF8 ; 248
55c: fe 4f sbci r31, 0xFE ; 254
55e: 20 81 ld r18, Z
560: 3c 91 ld r19, X
562: 23 2b or r18, r19
564: 20 95 com r18
566: 92 23 and r25, r18
ChangeKeyboard[key/8]&=~BV(key % 8);
568: 80 95 com r24
56a: 86 23 and r24, r22
56c: fa 01 movw r30, r20
56e: 80 83 st Z, r24
}
return temp;
}
570: 89 2f mov r24, r25
572: 08 95 ret
00000574 ‹KeyStatRaised›: |
А здесь закомментировано
|
Код:
|
u08 KeyRaised(u08 key)
{
524: 28 2f mov r18, r24
u08 temp;
temp=0;
if(key‹64)
526: 80 34 cpi r24, 0x40 ; 64
528: 10 f0 brcs .+4 ; 0x52e ‹KeyRaised+0xa›
52a: 20 e0 ldi r18, 0x00 ; 0
52c: 1c c0 rjmp .+56 ; 0x566 ‹KeyRaised+0x42›
{
temp=(~(OldKeyboard[key/8] | Keyboard[key/8 ] ) & ChangeKeyboard[key/8] )& BV(key % 8);
52e: e8 2f mov r30, r24
530: e6 95 lsr r30
532: e6 95 lsr r30
534: e6 95 lsr r30
536: f0 e0 ldi r31, 0x00 ; 0
538: 27 70 andi r18, 0x07 ; 7
53a: 81 e0 ldi r24, 0x01 ; 1
53c: 90 e0 ldi r25, 0x00 ; 0
53e: 02 c0 rjmp .+4 ; 0x544 ‹KeyRaised+0x20›
540: 88 0f add r24, r24
542: 99 1f adc r25, r25
544: 2a 95 dec r18
546: e2 f7 brpl .-8 ; 0x540 ‹KeyRaised+0x1c›
548: df 01 movw r26, r30
54a: a8 5e subi r26, 0xE8 ; 232
54c: be 4f sbci r27, 0xFE ; 254
54e: 2c 91 ld r18, X
550: 28 23 and r18, r24
552: df 01 movw r26, r30
554: a0 5f subi r26, 0xF0 ; 240
556: be 4f sbci r27, 0xFE ; 254
558: e8 5f subi r30, 0xF8 ; 248
55a: fe 4f sbci r31, 0xFE ; 254
55c: 80 81 ld r24, Z
55e: 9c 91 ld r25, X
560: 89 2b or r24, r25
562: 80 95 com r24
564: 28 23 and r18, r24
// ChangeKeyboard[key/8]&=~BV(key % 8);
}
return temp;
}
566: 82 2f mov r24, r18
568: 08 95 ret
0000056a ‹KeyStatRaised›: |
|
|
|
|
17.01.2010, 18:06
|
|
|
Вид на жительство
Регистрация: 14.06.2009
Адрес: Україна Київська обл. м.Буча
Сообщений: 328
Сказал спасибо: 104
Сказали Спасибо 106 раз(а) в 70 сообщении(ях)
|
Re: Что бы это значило?
А volatile и запрещать прерывания я уже перепробовал. Не помогает. Стоит только вынести прцедуру стирания памяти за пределы этой функции - работает.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:17.
|
|