Модераторы: PILOT, ManiaK, Mazzi

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программирование микроконтроллеров SiLabs 
V
    Опции темы
goodking
Дата 15.10.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Привет! smile  Я только начинаю изучать контроллеры, возник вот такой вопрос: 
хочу связать кнопку со светодиодом (то есть при первом нажатии кнопки диод мигает, при повторном- гаснет) подскажите пожалуйста, как это лучше сделать! Вот как у меня получилось (LED-диод; P3-кнопка)    
Код
#include "c8051F120.h"

sbit LED=P1^6;
sfr16 RCAP3=202;
sfr16 TMR3=204;

#define SYSCLK 3062500 
void Timer3_init (int counts);
void Port_IO_Init(void);
void Timer3_ISR (void);
int FLAG;

void main (void)
{ 
FLAG=1;
EA=0;
Port_IO_Init();
Timer3_init (SYSCLK); 
EA=1;
while(1){}
}

void Timer3_init (int counts)

{ SFRPAGE = TMR3_PAGE; 

TMR3CN = 0x00; 

RCAP3 = -counts; 
TMR3 = 0xffff; 
EIE2 |= 0x01; 
TR3 = 1; 

}


void Port_IO_Init()
{


SFRPAGE = CONFIG_PAGE;
P1MDOUT = 0x40;
XBR2 = 0x40;
}


void Timer3_ISR (void) interrupt 14
{
TF3 = 0;
if (P3==0x7f){
if(FLAG==1) { 
FLAG = 0; LED = 1; } 
else {FLAG = 1;LED = 0;} 
}
}




почему-то при запуске программы LED всегда =1 , при нажатии кнопки- начинает мигать, и сразу же перестает мигать, когда отпускаю (просто продолжает гореть) smile 
PM MAIL   Вверх
xvr
Дата 15.10.2009, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Что написали, то и получили  smile 
Во первых надо сделать нормальный опрос кнопки (с подавлением дребезга и определением момента именно нажатия)
Во вторых надо сделать bool переменную, которая меняла бы свое состояние по каждому НАЖАТИЮ кнопки
В третьих поставить ее (переменную) вместо if (P3==0x7f) в таймерное прерывание
В четвертых сделать в нем (прерывании) ветку else для условия из п3, в которой прописать LED=0

PM MAIL   Вверх
goodking
Дата 15.10.2009, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Цитата(xvr @ 15.10.2009,  16:56)
Что написали, то и получили  smile 
Во первых надо сделать нормальный опрос кнопки (с подавлением дребезга и определением момента именно нажатия)
Во вторых надо сделать bool переменную, которая меняла бы свое состояние по каждому НАЖАТИЮ кнопки
В третьих поставить ее (переменную) вместо if (P3==0x7f) в таймерное прерывание
В четвертых сделать в нем (прерывании) ветку else для условия из п3, в которой прописать LED=0

А как произвести НОРМАЛЬНЫЙ опрос кнопки? smile И булевский тип почему-то не поддерживается (вместо него переменная FLAG) smile 
PM MAIL   Вверх
Mazzi
Дата 15.10.2009, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Код

void Timer3_ISR (void) interrupt 14
{
TF3 = 0;
if (P3==0x7f){
if(FLAG==1) { 
FLAG = 0; LED = 1; } 
else {FLAG = 1;LED = 0;} 
}
else {
  FLAG = 0; LED = 0;
}

}

Попробуй так.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
goodking
Дата 15.10.2009, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Цитата(Mazzi @ 15.10.2009,  17:04)
Код

void Timer3_ISR (void) interrupt 14
{
TF3 = 0;
if (P3==0x7f){
if(FLAG==1) { 
FLAG = 0; LED = 1; } 
else {FLAG = 1;LED = 0;} 
}
else {
  FLAG = 0; LED = 0;
}

}

Попробуй так.

Мигает, только пока удерживаю кнопку, отпускаю-сразу гаснет  smile 
PM MAIL   Вверх
Den64
Дата 15.10.2009, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 6.4.2006
Где: Курск

Репутация: 1
Всего: 2



А если без таймера, попроще.. Правда будет дребезг..
--------------------
Инагда пишу звуками.
PM WWW ICQ   Вверх
xvr
Дата 15.10.2009, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(goodking @ 15.10.2009,  17:01)
А как произвести НОРМАЛЬНЫЙ опрос кнопки? smile 

Нормальный - это с подавлением дребезга. Т.е. состояние кнопки периодически опрашивается и при его изменении делается пауза в опросе, что бы дребезг завершился. Хотя, если взять цикл опроса длиннее, чем время дребезга (где то 100ms), то дребезг до следующего опроса завершится.

Код

int prev_button_hit;
int do_blinking; // Мигать, когда тут 1

void Timer?_isr (void) interrupt ?
{
 int now_button_hit = !(P3&0x80);
 TF? = 0;
 if (now_button_hit && !prev_button_hit)
  {
   do_blinking=!do_blinking;
   if (!do_blinking) LED=FLAG=0;
  }
 prev_button_hit=now_button_hit;
}

void Timer3_ISR (void) interrupt 14
{
 TF3 = 0;
 if (do_blinking) LED=FLAG=!FLAG;
}


Цитата

И булевский тип почему-то не поддерживается (вместо него переменная FLAG) smile
это только для C++. Используй обычный int

PM MAIL   Вверх
Mazzi
Дата 16.10.2009, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Код

void Timer3_ISR (void) interrupt 14
{
TF3 = 0;
if (P3==0x7f){
if(FLAG==1) FLAG = 0; 
else FLAG = 1;
}
if (FLAG == 1) LED= ~LED;
else  LED = 0;
}


извини, не прочитал задание, вот так нужно.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
goodking
Дата 16.10.2009, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Цитата(xvr @ 15.10.2009,  21:43)
Цитата(goodking @ 15.10.2009,  17:01)
А как произвести НОРМАЛЬНЫЙ опрос кнопки? smile 

Нормальный - это с подавлением дребезга. Т.е. состояние кнопки периодически опрашивается и при его изменении делается пауза в опросе, что бы дребезг завершился. Хотя, если взять цикл опроса длиннее, чем время дребезга (где то 100ms), то дребезг до следующего опроса завершится.

Код

int prev_button_hit;
int do_blinking; // Мигать, когда тут 1

void Timer?_isr (void) interrupt ?
{
 int now_button_hit = !(P3&0x80);
 TF? = 0;
 if (now_button_hit && !prev_button_hit)
  {
   do_blinking=!do_blinking;
   if (!do_blinking) LED=FLAG=0;
  }
 prev_button_hit=now_button_hit;
}

void Timer3_ISR (void) interrupt 14
{
 TF3 = 0;
 if (do_blinking) LED=FLAG=!FLAG;
}


Цитата

И булевский тип почему-то не поддерживается (вместо него переменная FLAG) smile
это только для C++. Используй обычный int

А от какого таймера ставить выше приоритет прерывания? И зачем выделять бит в P3 (P3&0x80)??

Добавлено @ 09:49
Цитата(Mazzi @ 16.10.2009,  09:04)
Код

void Timer3_ISR (void) interrupt 14
{
TF3 = 0;
if (P3==0x7f){
if(FLAG==1) FLAG = 0; 
else FLAG = 1;
}
if (FLAG == 1) LED= ~LED;
else  LED = 0;
}


извини, не прочитал задание, вот так нужно.

Теперь мигает все время, а когда нажимаю-перестает!

Это сообщение отредактировал(а) goodking - 16.10.2009, 10:06
PM MAIL   Вверх
goodking
Дата 16.10.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Цитата(Den64 @ 15.10.2009,  20:27)
А если без таймера, попроще.. Правда будет дребезг..

То-есть в while прописать?
PM MAIL   Вверх
Mazzi
Дата 16.10.2009, 11:33 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Код

void Timer3_ISR (void) interrupt 14
{
TF3 = 0;
if (P3==0x7f){
if(FLAG==1) FLAG = 0; 
else FLAG = 1;
}
if (FLAG == 1) LED=0;
else  LED = ~LED;
}


извини друг, исправляюсь.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
goodking
Дата 16.10.2009, 11:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Цитата(Mazzi @ 16.10.2009,  11:33)
Код

void Timer3_ISR (void) interrupt 14
{
TF3 = 0;
if (P3==0x7f){
if(FLAG==1) FLAG = 0; 
else FLAG = 1;
}
if (FLAG == 1) LED=0;
else  LED = ~LED;
}


извини друг, исправляюсь.

Та я так уже пробовал, мигнет только раз в сам момент нажатия и гаснет smile 
PM MAIL   Вверх
xvr
Дата 16.10.2009, 12:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(goodking @ 16.10.2009,  09:47)
А от какого таймера ставить выше приоритет прерывания?

По идее того, который тикает чаще. Практически все равно.

Цитата

И зачем выделять бит в P3 (P3&0x80)??
Я так понял у тебя там кнопка висит.

PM MAIL   Вверх
goodking
Дата 16.10.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Цитата(xvr @ 16.10.2009,  12:23)
Цитата

И зачем выделять бит в P3 (P3&0x80)??
Я так понял у тебя там кнопка висит.

Неа  smile  0x70

Добавлено через 3 минуты и 57 секунд
Цитата(xvr @ 16.10.2009,  12:23)
Цитата(goodking @ 16.10.2009,  09:47)
А от какого таймера ставить выше приоритет прерывания?

По идее того, который тикает чаще. Практически все равно.

Цитата

И зачем выделять бит в P3 (P3&0x80)??
Я так понял у тебя там кнопка висит.

Вообще как-то хаотически мигает...вот код:

Код
#include "c8051F120.h"

sbit LED=P1^6;
sfr16 RCAP3=202;
sfr16 TMR3=204;
sfr16 RCAP2=202;
sfr16 TMR2=204;
#define SYSCLK 3062500 

void Timer3_init (int counts);
void Port_IO_Init(void);
void Timer3_ISR (void);
void Timer2_isr (void);
void Timer2_Init (int counts);
int FLAG;
int prev_button_hit;
int do_blinking; 
void main (void)
{ 
  FLAG=1;
  EA=0;
  Port_IO_Init();
  Timer3_init (SYSCLK); 
  Timer2_Init (SYSCLK);
       
  EA=1;
    while(1){}
}

void Timer3_init (int counts)

{ SFRPAGE = TMR3_PAGE;  
 
   TMR3CN = 0x00;                      // Stop Timer3; Clear TF3;
                                       // use SYSCLK/12 as timebase
   RCAP3   = -counts;                  // Init reload values
   TMR3    = 0xffff;                   // set to reload immediately
   EIE2   |= 0x01;                     // enable Timer3 interrupts
   TR3 = 1;        

}
void Timer2_Init(int counts)
{
    SFRPAGE   = TMR2_PAGE;
    TMR2CN    = 0x04;
    TMR2CF    = 0x08;

    RCAP2     = -counts;
    IE        = 0x20;

}


void Port_IO_Init()
{
    

    SFRPAGE   = CONFIG_PAGE;
  P1MDOUT   = 0x40;
    XBR2      = 0x40;
}


void Timer2_isr (void) interrupt 14
{
 int now_button_hit = !(P3&0x70);
 TF2 = 0;
 if (now_button_hit && !prev_button_hit)
  {
   do_blinking=!do_blinking;
   if (!do_blinking) LED=FLAG=0;
  }
 prev_button_hit=now_button_hit;
}

void Timer3_ISR (void) interrupt 14
{
 TF3 = 0;
 if (do_blinking) LED=FLAG=!FLAG;
}





PM MAIL   Вверх
xvr
Дата 16.10.2009, 13:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(goodking @ 16.10.2009,  12:40)
Цитата(xvr @ 16.10.2009,  12:23)
Цитата

И зачем выделять бит в P3 (P3&0x80)??
Я так понял у тебя там кнопка висит.

Неа  smile  0x70

Что, на 3х битах сразу?

Цитата

Вообще как-то хаотически мигает...вот код:

Код

void Timer2_isr (void) interrupt 14
void Timer3_ISR (void) interrupt 14

А почему оба таймера на одном векторе оказались?

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.1065 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.