Keypad+power save

Обсуждаем контроллеры компании Atmel.
Ответить
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Keypad+power save

Сообщение kotriks »

Народ подскажите как можно реализовать клавиатуру в режиме сна ожидания (power save). Имеется код

Код: Выделить всё

#include 

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x12 ;PORTD
#endasm
#include 
#include
//#include

#define KB_PORT_OUT 			PORTB
#define KB_PORT_IN				PINB
 void main(void)
{
   unsigned char upperNibble, keyCode, keyPressed, i;
lcd_init(16);
PORTD=0x00;
DDRD=0xFF;
PORTB=0xff;
DDRB=0xF3;

while (1)
      {     
//lcd_int(); // display ON
  
   lcd_gotoxy(0,0);
   lcd_putsf("welcome");
   
   lcd_gotoxy(0,1); 
   delay_ms(100);
   _lcd_write_data(0x0f);
   	   //moving LCD cursor to second row
   
          upperNibble = 0xff;
		
		for(i=0; i<2; i++)
	 {    
	        //PORTB &= 0x0f ;
		 delay_ms(1);
		 KB_PORT_OUT = ~(0x01 << i);
		 delay_ms(1);  		  	 		  //delay for port o/p settling
		 upperNibble = KB_PORT_IN | 0x03;
		 
		 if (upperNibble != 0xff)                                
		 {
		   delay_ms(20); 		  		 //key debouncing delay
	       upperNibble = KB_PORT_IN | 0x03;
		   if(upperNibble == 0x0f) goto OUT;
		   
		   keyCode = (upperNibble & 0x0c) | (0x03 & ~(0x01 << i));
		   
		   while (upperNibble != 0xff)
		     upperNibble = KB_PORT_IN | 0x03;
		   // PORTB &= 0x0f;
		   delay_ms(20);   			   //key debouncing delay
		   
		   switch (keyCode)			   //generating key characetr to display on LCD
		   {
		   	case (0x09): keyPressed = '0'; 
				 		 break;
			case (0x05): keyPressed = '1';
				 		 break;
			case (0x0a): keyPressed = '2'; 
			   			 break;
			case (0x06): keyPressed = '3'; 
				 		 break;
			
			default	   : keyPressed = 'X';
			}//end of switch
			
			lcd_putchar(keyPressed);
			
			
		   OUT:;
		  }//end of if
		}//end of for*/
	}//end of while(1)	     
}//end of main()
Находится в постоянном опросе портов на нажатую кнопку, если усыпить то как пробудить? может кто знает другой способ энергосбережения?
Реклама
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: Keypad+power save

Сообщение B@R5uk »

Схему в студию.

А так способа два: просыпаться по таймеру и просыпаться по внешнему прерыванию.
Реклама
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: Keypad+power save

Сообщение Oxford »

третий способ это питание подавать. Массив кнопок питание подают.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Re: Keypad+power save

Сообщение kotriks »

Ещё проблемка из выхода режима Power Save в IDLE юарт не реагирует на отправленные комманды хотя из контроллера при просыпании printf Показывает в терминале то что оправляется им, а в него нельзя послать. Например есть меню

Код: Выделить всё

interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) {
if (data=='1') {afisha();}
}

void afisha(){
printf("UART START");
}
Так вот при выходе из сна не вызывается функция по нажатию 1, как можно победить это?
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «AVR»