Сообщение от Азат:
petrd, А тогда как отследить если я хочу включить и выключить светодиод т.е при поступление команды 1 вкл еще раз выключить. Если просто без toggle то при удерживание кнопки он будет моргать.А если условие что toggle 1 вкл и 0 выкл(то проблема при нажатие других кнопок приходиться несколь раз нажимать на кнопку 1).
2. А от этого Ан744 проекта исходников под MikroC 16а628а нет.
Сообщение от Азат:
Я так и делаю если изменилось тогле на 1 и код кнопки 1 то вкл если ноль то выкл.
Сообщение от :
если toggle изменилось на противоположное и ....
Сообщение от :
typedef unsigned char byte;
byte i;
byte Buf[8]={0xE3,0xD4,0x4A,0xF1,0x85,0xFF,0x65,0x20};
void Transmit(byte*b,byte u)
{
byte g=0,j=0,counts;
{
for(;u>0;u--)
counts = b[9];
for (i = 0; i < 12; i ++) //преамбула
{
RFOut = 1;
delay_us(TE);
RFOut = 0;
delay_us(TE);
}
delay_ms(4); // хедер
for (i=0;i<8;i++) // цыкл вывода байтов
{
g = b[i]; // считаем буфер
for (j=0;j<8;j++) // цикл вывода битов в байте
{
RFOut = 1; // вывод бита
delay_us(TE);
if (g&1)
RFOut = 0;
delay_us(TE);
RFOut = 0;
delay_us(TE);
g >>= 1;
}
}
delay_ms(10); // гуард тайм
} //end for u
} //end Transmi
void main(void)
{
CMCON = 7;
PORTB=0;
TRISB=1;
PORTA=0x7F;
TRISA=0;
//ACSR=0x80; Вот это что?
//-------------------
while (1)
{
if(Button(&PORTA, 0,1,0)) Transmit(Buf,1);
} //end while
} //end main
Сообщение от Азат:
petrd, Пост исправил 726.Посмотрите все ли верно?
Сообщение от Азат:
petrd, Подскажите пожалуйста как реализовать правильно нажатие кнопки т.е нажал "что то делает", отпустил "перестало".
Сообщение от Азат:
Здраствуйте petrd, собрал в железе,почему то не работает.Единственное что поменял это убрал внешний вкарц в проекте т.е HS переключил Intosk i/o.Что может быть?
RT5 передатчик и RR10 приемник.
Сообщение от Азат:
petrd, Нашел все работает.обработка кнопок понравилась так граммотно написана т.е тикаем по 10 мс нажимаем проверяем состояние(при чем разные состояние кнопки).
Появилось пару вопросов:
1.Как сделать режим сна(sleep) для проекта tx чтоб его потом можно было разбудить любой кнопой(сколько времени занимает разбудить).
2.Как расчитать с каким номиналом поставить резистор если питание будет 3 вольта к примеру.
3.Сколько времени занимает посылка сигнала(т.е при нажатие кнопки стоит задержка 100 мс это довольно долго).
Сообщение от :
while (1)
{
if(tick >= 10 ms)
{
Task_Buttons ();
tick = 0;
}
if(m_Buttons.ucPressed)
{
kp = m_Buttons.ucPressed;
ks = CRC8(m_Buttons.ucPressed); // расчет КС
GIE_bit = 0;
TX_data(kp,ks); // передача посылки
GIE_bit = 1;
delay_ms(15);
}
asm{sleep};
}
}
Сообщение от Азат:
Усыпляю командой asm{sleep}; да и MCLR должен быть включен?
Теперь на счет прерывания
void main()
RBIE=1; т.е говорю ему от ног RB что еще нужно?
Сообщение от :
void interrupt (void)
{
if (TMR2IE_bit && TMR2IF_bit)
{
TMR2IF_bit = 0;
tick++;
}
if ( RBIF_bit )
{ RBIE_bit = 0 ;
RBIF_bit = 0 ;}
}
void main() {
kp=0;
ks=0;
m_Buttons.ucPressed = 0;
CMCON = 0x07;
PORTB = 0;
TRISB = 0xF7;
PR2 = PR2_CONST; // Настройка TMR2
T2CON = T2CON_CONST | 0x04;
TMR2IE_bit = 1;
PEIE_bit = 1;
GIE_bit = 1;
RBIE_bit = 1 ;
while (1)
{
if(tick >= 10 ms)
{
Task_Buttons ();
tick = 0;
}
if(m_Buttons.ucPressed)
{
kp = m_Buttons.ucPressed;
ks = CRC8(m_Buttons.ucPressed); // расчет КС
GIE_bit = 0;
TX_data(kp,ks); // передача посылки
GIE_bit = 1;
delay_ms(15);
}
asm { sleep } ;
}
}
Сообщение от Азат:
Здраствуйте petrd, все приходит с пониманием поверьте я читаю.Сделал так но что то не работает.
Сообщение от :
void interrupt (void)
{
if (TMR2IE_bit && TMR2IF_bit)
{
TMR2IF_bit = 0;
tick++;
tick1++;
}
if ( RBIF_bit )
{
RBIE_bit = 0 ;
RBIF_bit = 0 ;}
}
void main() {
kp=0;
ks=0;
m_Buttons.ucPressed = 0;
CMCON = 0x07;
PORTB = 0;
TRISB = 0xF7;
PR2 = PR2_CONST; // Настройка TMR2
T2CON = T2CON_CONST | 0x04;
TMR2IE_bit = 1;
PEIE_bit = 1;
GIE_bit = 1;
RBIF_bit = 0;
RBIE_bit = 1 ;
while (1)
{
if(tick >= 10 ms)
{
Task_Buttons ();
tick = 0;
}
if(m_Buttons.ucPressed)
{
kp = m_Buttons.ucPressed;
ks = CRC8(m_Buttons.ucPressed); // расчет КС
GIE_bit = 0;
TX_data(kp,ks); // передача посылки
GIE_bit = 1;
delay_ms(15);
}
if(tick1 >= 20 ms);
{asm{sleep};
tick1=0;}
}
}
Сообщение от Азат:
А так делаем два прохода?
Сообщение от :
void interrupt (void)
{
if (TMR2IE_bit && TMR2IF_bit)
{
TMR2IF_bit = 0;
tick++;
}
if (RBIF_bit==1)
RBIF_bit = 0;
}
}
void main() {
kp=0;
ks=0;
m_Buttons.ucPressed = 0;
CMCON = 0x07;
PORTB = 0;
TRISB = 0xF7;
PR2 = PR2_CONST; // Настройка TMR2
T2CON = T2CON_CONST | 0x04;
TMR2IE_bit = 1;
PEIE_bit = 1;
GIE_bit = 1;
RBIF_bit = 0;
RBIE_bit = 1 ;
while (1)
{
if(tick >= 10 ms)
{
Task_Buttons ();
tick = 0;
tick1++;
}
if(m_Buttons.ucPressed)
{
kp = m_Buttons.ucPressed;
ks = CRC8(m_Buttons.ucPressed); // расчет КС
GIE_bit = 0;
TX_data(kp,ks); // передача посылки
GIE_bit = 1;
delay_ms(15);
}
if(tick1 >=10);
{asm sleep;
tick1=0;}
}
}
Сообщение от Азат:
Делаю десять проходов не просыпается
void interrupt (void) { unsigned short tmp; ......... if (RBIF_bit && RBIE_bit) { tmp = PORTB; // убрали неоднозначность RBIE_bit = 0; // запретить прерывания по RBIE пока не спим RBIF_bit = 0; } } ..... RBIE_bit = 1 ; // отсюда убрать нахрен .......... if(tick1 >=10); { tick1=0; RBIE_bit = 1; // здесь разрешить прерывание asm sleep; // и сразу в сон // по выходу из сна (по нажатию) окажемся в прерывании }
Сообщение от :
void interrupt (void)
{unsigned short tmp;
if (TMR2IE_bit && TMR2IF_bit)
{
TMR2IF_bit = 0;
tick++;
}
if (RBIF_bit && RBIE_bit)
{
tmp = PORTB; // убрали неоднозначность
RBIE_bit = 0; // запретить прерывания по RBIE пока не спим
RBIF_bit = 0;
}
}
void main() {
kp=0;
ks=0;
m_Buttons.ucPressed = 0;
CMCON = 0x07;
PORTB = 0;
TRISB = 0xF7;
PR2 = PR2_CONST; // Настройка TMR2
T2CON = T2CON_CONST | 0x04;
TMR2IE_bit = 1;
PEIE_bit = 1;
GIE_bit = 1;
RBIF_bit = 0;
while (1)
{
if(tick >= 10 ms)
{
Task_Buttons ();
tick = 0;
tick1++;
}
if(m_Buttons.ucPressed)
{
kp = m_Buttons.ucPressed;
ks = CRC8(m_Buttons.ucPressed); // расчет КС
GIE_bit = 0;
TX_data(kp,ks); // передача посылки
GIE_bit = 1;
delay_ms(15);
}
if(tick1 >=20);
{tick1=0;
RBIE_bit = 1; // здесь разрешить прерывание
asm sleep; // и сразу в сон
}
}
}
Сообщение от Азат:
Не просыпаеться не в протезе ни в железе.Попробывал и в порт записать.
Ошибка где в прерывание RBIE_bit = 1; как только я его разрешил все тишина.
if(tick1 >=20); { tick1=0; тут прочитать PORTB RBIF = 0; RBIE_bit = 1; // здесь разрешить прерывание asm sleep; // и сразу в сон }
Сообщение от petrd:
Когда написано:
....
CMCON = 0x04;
......
while(CMCON.F6 == 1)
{
old_GPIO.F4 =1;
GPIO = old_GPIO;
}
А когда используется if, то никакого вечного цикла быть не может.
Как-то так.