Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Что бы это значило?

Непрочитано 17.01.2010, 01:22  
Djakovskij
Вид на жительство
 
Регистрация: 14.06.2009
Адрес: Україна Київська обл. м.Буча
Сообщений: 328
Сказал спасибо: 104
Сказали Спасибо 106 раз(а) в 70 сообщении(ях)
Djakovskij на пути к лучшему
По умолчанию Что бы это значило?

Здравствуйте, уважаемые. Может кто-то не поленится прочитать. Так вот. Функция должна возвращать значение при отпускании клавиши. Так и происходит. Но стоит только раскоментировать строку, в которой сбрасывается флаг, соответствующий этой клавише, тут же она (функция)отказывается возвращать ненулевое значение. Если сбросить любой другой флаг слева или справа, возвращается то, что нужно. Выношу требуемое действие за пределы данной функции - ОК. Не глюк ли это компилятора?
(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; 
}
Реклама:
Djakovskij вне форума  
Непрочитано 17.01.2010, 02:45  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Что бы это значило?

Сообщение от Djakovskij Посмотреть сообщение
Но стоит только раскоментировать строку, в которой сбрасывается флаг, соответствующий этой клавише, тут же она (функция)отказывается возвращать ненулевое значение. Если сбросить любой другой флаг слева или справа, возвращается то, что нужно. Выношу требуемое действие за пределы данной функции - ОК. Не глюк ли это компилятора?
(AVR GCC)
Т.е. если key ›63 нулевое значение не возвращается?
Давайте листинги с закоментированной строчкой и с раскомментированной.
kison вне форума  
Непрочитано 17.01.2010, 03:27  
Djakovskij
Вид на жительство
 
Регистрация: 14.06.2009
Адрес: Україна Київська обл. м.Буча
Сообщений: 328
Сказал спасибо: 104
Сказали Спасибо 106 раз(а) в 70 сообщении(ях)
Djakovskij на пути к лучшему
По умолчанию 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; 
}
Djakovskij вне форума  
Непрочитано 17.01.2010, 04:03  
_guardianangel
Почётный гражданин KAZUS.RUN
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,138
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
_guardianangel на пути к лучшему
По умолчанию Re: Что бы это значило?

Для начало попробуте заменить конструкции типа temp =~ RowPin; на (unsigned char) temp =~ RowPin; По умолчанию GCC производит преобразование типа в int. Т.е. в 16 битный, у Вас же очищаются тока младший байт а в старшем может быть мусор.
_guardianangel вне форума  
Непрочитано 17.01.2010, 04:11  
Djakovskij
Вид на жительство
 
Регистрация: 14.06.2009
Адрес: Україна Київська обл. м.Буча
Сообщений: 328
Сказал спасибо: 104
Сказали Спасибо 106 раз(а) в 70 сообщении(ях)
Djakovskij на пути к лучшему
По умолчанию Re: Что бы это значило?

Я и обьявляю их как u08 (т.е. unsigned char). Макрос есть такой.
#define u08 unsigned char
Djakovskij вне форума  
Непрочитано 17.01.2010, 04:34  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Что бы это значило?

Сообщение от Djakovskij Посмотреть сообщение
Три группы флагов - OldKeyboard, Keyboard (debouncing) и ChangeKeyboard (память отпущенной кнопки).
А можно на их объявление посмотреть?
И Вы KeyRaised(u08 key) потом 64 раза в цикле перебираете?

Последний раз редактировалось kison; 17.01.2010 в 04:38.
kison вне форума  
Непрочитано 17.01.2010, 12:03  
Djakovskij
Вид на жительство
 
Регистрация: 14.06.2009
Адрес: Україна Київська обл. м.Буча
Сообщений: 328
Сказал спасибо: 104
Сказали Спасибо 106 раз(а) в 70 сообщении(ях)
Djakovskij на пути к лучшему
По умолчанию Re: Что бы это значило?

Код:
u08 OldKeyboard[8];
u08 Keyboard[8];
u08 ChangeKeyboard[8];
KeyRaised() смотрит была ли нажата и отпущена конкретная кнопка, которую мы задаем в параметрах. Сканирует клавиатуру ScanKeyBoard() циклом за 8 раз. И вот:
Код:
 if(KeyRaised(Key5))//Key1..Key64 предварительно определены
  { 
   LCD_WriteString("HELLO!");//Выполняется, если флаг ChangeKeyboard не трогать, и не выполняется, если его очистить.
   }
Djakovskij вне форума  
Непрочитано 17.01.2010, 17:36  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Что бы это значило?

Сообщение от Djakovskij Посмотреть сообщение
KeyRaised() смотрит была ли нажата и отпущена конкретная кнопка, которую мы задаем в параметрах.
Ну вот и получается, что ее 64 раза надо вызвать.
Как я понимаю KeyRaised уже не в прерывании работает?
Тогда массивы должны быть объявлены не так:
Код:
u08 volatile OldKeyboard[8];
u08 volatile Keyboard[8];
u08 volatile ChangeKeyboard[8];
Хотя в этом случае косяков в общем и так быть не должно, но все же.
А вот модификация массивов, используемых и в основном цикле и в прерываниях, в основном цикле должна выполняться в критических секциях - при запрещенных прерываниях.
И ве же листинг ассемблерный для KeyRaised можно посмотреть? С закоментированной строчкой и с расскоментированной.
kison вне форума  
Непрочитано 17.01.2010, 17:49  
Djakovskij
Вид на жительство
 
Регистрация: 14.06.2009
Адрес: Україна Київська обл. м.Буча
Сообщений: 328
Сказал спасибо: 104
Сказали Спасибо 106 раз(а) в 70 сообщении(ях)
Djakovskij на пути к лучшему
По умолчанию 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›:
Djakovskij вне форума  
Непрочитано 17.01.2010, 18:06  
Djakovskij
Вид на жительство
 
Регистрация: 14.06.2009
Адрес: Україна Київська обл. м.Буча
Сообщений: 328
Сказал спасибо: 104
Сказали Спасибо 106 раз(а) в 70 сообщении(ях)
Djakovskij на пути к лучшему
По умолчанию Re: Что бы это значило?

А volatile и запрещать прерывания я уже перепробовал. Не помогает. Стоит только вынести прцедуру стирания памяти за пределы этой функции - работает.
Djakovskij вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Решено] Как внедрялась АСУ chermnv Отвлекитесь, эмбеддеры! 743 14.02.2010 23:11
[Решено] Третье Послание Человечеству lelkanet Отвлекитесь, эмбеддеры! 201 06.01.2010 00:33
Подключение пьезоизлучателя от телефона lightworld Электроника - это просто 4 24.12.2009 20:28
Помогите с ЦАП AD7708/AD7718 или их аналогами ST_Senya Микроконтроллеры, АЦП, память и т.д 9 30.11.2009 19:03


Часовой пояс GMT +4, время: 20:44.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.