Большой Воронежский Форум
Страница 25 из 43
« Первая < 1519202122232425 26272829303135 > Последняя »
»Радиолюбитель>PIC контроллеры. Программаторы и первый проект на PIC
petrd 13:24 11.12.2010

Сообщение от Азат:
petrd, А тогда как отследить если я хочу включить и выключить светодиод т.е при поступление команды 1 вкл еще раз выключить. Если просто без toggle то при удерживание кнопки он будет моргать.А если условие что toggle 1 вкл и 0 выкл(то проблема при нажатие других кнопок приходиться несколь раз нажимать на кнопку 1).
2. А от этого Ан744 проекта исходников под MikroC 16а628а нет.

1. Проверять условие: если toggle изменилось на противоположное и пришел код кн. 1 - то изменить состояние светодиода на противоположное.
2. Можно определить в коде пары кнопок, например, кн. 1 - включает светодиод 1, кн. 2 - выключает светодиод 1, и т.д, при этом за toggle следить нет необходимости. Пульт-то ПДУ стандартный и кнопок на нем много.

Исходники-то есть, как же без них, но они не причесанные и не отформатированные. [Ответ]
Азат 16:31 11.12.2010
petrd, Я так и делаю если изменилось тогле на 1 и код кнопки 1 то вкл если ноль то выкл.Смысл в том что если нажать на другую кнопку один раз а затем на кнопку 1 надо нажать два раза(чтобы включить к примеру).Попробуйте сами(как я понимаю если у меня светодиод горит от нажатие кнопки один неважно нажимал ли я кнопку два или три, при следующем нажатие на один он должен погасить светодиод( а ни при двух нажатиях)). [Ответ]
petrd 20:10 11.12.2010

Сообщение от Азат:
Я так и делаю если изменилось тогле на 1 и код кнопки 1 то вкл если ноль то выкл.

Заметьте, не я сказал про проверку toggle на 0 или 1.
Я сказал

Сообщение от :
если toggle изменилось на противоположное и ....

а это совсем не одно и тоже. [Ответ]
Азат 09:12 12.12.2010
Здраствуйте petrd, Простите за не внимательность сейчас попробую.Обновил MikroC Pro и все проблемы с зависанием исчезли.

if(IR.received == 1) {
switch(IR.command)
{
case 1: RA4_bit = ~RA4_bit; break; // на ПДУ нажата кнопка "1", переключить RA4
}
IR.received = 0;
}
Если рассматривать данный пример он же никак не должен включаться и выключаться от кнопки 2. Нажал один включился.нажал два.нажал один.нажал два выключился. [Ответ]
Азат 14:35 14.12.2010
Вот так правильно?

Сообщение от :
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 15:08 14.12.2010
Азат, это код как раз и есть код по AN744 (даже имена переменных теже самые), только переписанный под mega8, hex-ы в посте 718, только у меня там вместо сообщений кейлока передаются два байта - номер комбинации кнопок и вычисляемая CRC8. [Ответ]
Азат 15:26 14.12.2010
petrd, Пост исправил 726.Посмотрите все ли верно? [Ответ]
petrd 21:08 14.12.2010

Сообщение от Азат:
petrd, Пост исправил 726.Посмотрите все ли верно?

Это надо в компиляторе смотреть, в одних глазах правды нет. Во вложении мой проект "как есть".
P.S. Регистр ACSR в AVR наподобие CMCON в PIC.
Изображения
[Ответ]
Азат 07:21 15.12.2010
petrd, Спасибо огромное. [Ответ]
Азат 12:51 15.12.2010
petrd, Подскажите пожалуйста как реализовать правильно нажатие кнопки т.е нажал "что то делает", отпустил "перестало". [Ответ]
petrd 07:14 17.12.2010

Сообщение от Азат:
petrd, Подскажите пожалуйста как реализовать правильно нажатие кнопки т.е нажал "что то делает", отпустил "перестало".

Вариантов можно придумать несколько. Например, сделать счетчик по таймеру и в подпрограмме обработки принятой команды его сбрасывать. А в главном цикле следить за ним, если счетчик досчитал до нужного значения, т.е. какое-то время не было принято ни одной команды, то сбросить в исходное что не надо. [Ответ]
petrd 12:01 17.12.2010

Сообщение от Азат:
Здраствуйте petrd, собрал в железе,почему то не работает.Единственное что поменял это убрал внешний вкарц в проекте т.е HS переключил Intosk i/o.Что может быть?
RT5 передатчик и RR10 приемник.

Именно это в железе не проверял, только в протеусе. Я этот код в железе давно делал. Работало. Попробуйте сначала соединить два контроллера напрямую без модулей. [Ответ]
Азат 08:26 18.12.2010
petrd, Нашел все работает.обработка кнопок понравилась так граммотно написана т.е тикаем по 10 мс нажимаем проверяем состояние(при чем разные состояние кнопки).
Появилось пару вопросов:
1.Как сделать режим сна(sleep) для проекта tx чтоб его потом можно было разбудить любой кнопой(сколько времени занимает разбудить).
2.Как расчитать с каким номиналом поставить резистор если питание будет 3 вольта к примеру.
3.Сколько времени занимает посылка сигнала(т.е при нажатие кнопки стоит задержка 100 мс это довольно долго). [Ответ]
petrd 09:49 19.12.2010

Сообщение от Азат:
petrd, Нашел все работает.обработка кнопок понравилась так граммотно написана т.е тикаем по 10 мс нажимаем проверяем состояние(при чем разные состояние кнопки).
Появилось пару вопросов:
1.Как сделать режим сна(sleep) для проекта tx чтоб его потом можно было разбудить любой кнопой(сколько времени занимает разбудить).
2.Как расчитать с каким номиналом поставить резистор если питание будет 3 вольта к примеру.
3.Сколько времени занимает посылка сигнала(т.е при нажатие кнопки стоит задержка 100 мс это довольно долго).

Автор обработчика кнопок Виктор Тимофеев (tester), за что ему большое спасибо.
1. Для сна надо использовать кнопки подключенные к RB7-RB4 и прерывание RBIE.
2. Какой резистор? Для чего?
3. Так уберите задержку. [Ответ]
Азат 12:40 19.12.2010
petrd, Виктор Тимофеев вам спасибо.
1.Не обижайтесь я еще только учусь
Усыпляю командой asm{sleep}; да и MCLR должен быть включен?

Сообщение от :
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};
}
}

Теперь на счет прерывания
void main()
RBIE=1; т.е говорю ему от ног RB что еще нужно? [Ответ]
petrd 19:27 19.12.2010

Сообщение от Азат:
Усыпляю командой asm{sleep}; да и MCLR должен быть включен?
Теперь на счет прерывания
void main()
RBIE=1; т.е говорю ему от ног RB что еще нужно?

Усыпляйте.
Куда включен? Если он в битах конфигурации - как вход, то можно как вход использовать, иначе подтянуть к питанию.
Конечно, нужно. Почитать про то как работает прерывание RBIE и правильно написать код обработчика. И читать, читать, читать. [Ответ]
Азат 12:47 20.12.2010
Здраствуйте petrd, все приходит с пониманием поверьте я читаю.Сделал так но что то не работает.

Сообщение от :
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 13:42 20.12.2010

Сообщение от Азат:
Здраствуйте petrd, все приходит с пониманием поверьте я читаю.Сделал так но что то не работает.

И не будет работать. Программа виснет в прерывании, т.к. не убирается неоднозначность. Почитайте посты #598 и #603 и в том районе.
И вот еще что. Чтобы переменная m_Buttons.ucPressed приняла правильное значение обработчик кнопок Task_Button() должен отработать несколько проходов. А по Вашему коду программа после первого же прохода Task_Button() уйдет в Sleep. Программе после выхода из Sleep (т.е. нажатия кнопки) надо дать время, чтобы Task_Button() отработала сколько надо и только потом разрешать Sleep. [Ответ]
Азат 15:30 20.12.2010
А так делаем два прохода?

Сообщение от :
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;}
}
}

[Ответ]
petrd 21:46 20.12.2010

Сообщение от Азат:
А так делаем два прохода?

Мало. Подавление дребезга в лучшем случае происходит за четыре прохода, в худшем - неизвестно. [Ответ]
Азат 08:17 21.12.2010
Делаю десять проходов не просыпается

Сообщение от :
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;}
}
}

[Ответ]
petrd 10:47 21.12.2010

Сообщение от Азат:
Делаю десять проходов не просыпается

Да просыпается он, но из прерывания выйти не может. Я же уже говорил - виснет в прерывании RBIE, потому что не убирается неоднозначность. В прерывании надо PORTB прочитать или записать, чтобы ее убрать. А пока работает обработчик кнопок, прерывание RBIE использовать нельзя.
Код:
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;    // и сразу в сон
// по выходу из сна (по нажатию) окажемся в прерывании 
}
Как-то так. [Ответ]
Азат 11:53 21.12.2010
petrd, tmp = PORTB; // убрали неоднозначность я увидел у других но не понимал для чего. Спасибо. [Ответ]
Азат 12:17 21.12.2010
Не просыпаеться не в протезе ни в железе.Попробывал и в порт записать.
Ошибка где в прерывание RBIE_bit = 1; как только я его разрешил все тишина.

Сообщение от :
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; // и сразу в сон
}
}
}

[Ответ]
petrd 13:33 21.12.2010

Сообщение от Азат:
Не просыпаеться не в протезе ни в железе.Попробывал и в порт записать.
Ошибка где в прерывание RBIE_bit = 1; как только я его разрешил все тишина.

Попробуйте еще так:
Код:
if(tick1 >=20);
 {
  tick1=0;
  тут прочитать PORTB
  RBIF = 0;
  RBIE_bit = 1; // здесь разрешить прерывание
  asm sleep; // и сразу в сон
}
[Ответ]
Азат 13:48 21.12.2010
petrd, Тоже самое.Ну уже если закомментировать asm sleep работает не виснет т.е прерывание отрабатывает,но не просыпаеться. [Ответ]
petrd 13:58 21.12.2010
Повесьте светодиод на какой-нибудь свободный вывод и зажигайте в разных местах программы, чтобы вычислить где проблема. [Ответ]
Азат 14:17 21.12.2010
petrd, Так и сделал т.е все работает нормально одна ошибка лишняя ";".

[QUOTE] void main() {
unsigned short tmpp;
kp=0;
ks=0;
m_Buttons.ucPressed = 0;
CMCON = 0x07;
PORTB = 0;
PORTA = 0;
TRISA = 1;
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++;
RA2_bit = ~RA2_bit;
}
if(m_Buttons.ucPressed)
{ RA3_bit = ~RA3_bit;
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;
RA1_bit = ~RA1_bit;
tmpp = PORTB;
RBIE_bit = 1; // здесь разрешить прерывание
asm sleep; // и сразу в сон
}
}
} QUOTE] [Ответ]
Butik 22:24 24.12.2010

Сообщение от petrd:
Когда написано:

Код:
....
  CMCON = 0x04;
......
 while(CMCON.F6 == 1)
                 {
                  old_GPIO.F4 =1;
                  GPIO = old_GPIO;
                 }
при включении проверяется состояние GP5, и если оно 0 (а такое легко может быть и вообще мы можем попасть в любой момент времени периода повторения импульсов синхронизации 50 Гц, что в итоге приведет к тому, что конденсатор либо вообще никогда не начнет заряжаться, либо не успеет зарядится до нужного уровня), то попадаем в проверку while, а так как у нас перед этим ни одного цикла зарядки конденсатора не было (или он был, но короткий, т.е. недозаряд), то и имеем COUT = 1 ( VIN+ > VIN-) и дальше незапланированный вечный цикл из которого можно выйти только когда конденсатор заряжен, а чтобы зарядить - надо выйти из цикла - замкнутый круг. И, вообще, мы же с сетью не синхронизированы, то рано или поздно такой момент возникает.
А когда используется if, то никакого вечного цикла быть не может.
Как-то так.

Прошу прощения господ форумчан за долгое отсутствие- был занят другой работой


А вот немного не понятно... какая разница- просто импульсы 50герц для синхронизации или сеть... - 10 миллисекунд заряд конденсатора - а потом следующие 10- порт на вход перестраивается- включается компаратор и ожидается разряд конденсатора до уровня ниже опорного напряжения [Ответ]
Азат 13:43 27.12.2010
С наступающим всех! [Ответ]
Страница 25 из 43
« Первая < 1519202122232425 26272829303135 > Последняя »
Вверх