Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
PIC контроллеры. Программаторы и первый проект на PIC |
Программирование микроконтролеров,ремонт аудио/видео/бытовой техники,полезные устройства для дома,телефония, обсуждение статей журнала Радио |
|
Опции темы |
11.12.2010, 13:24 | #721 | |
Форумец
|
Цитата:
2. Можно определить в коде пары кнопок, например, кн. 1 - включает светодиод 1, кн. 2 - выключает светодиод 1, и т.д, при этом за toggle следить нет необходимости. Пульт-то ПДУ стандартный и кнопок на нем много. Исходники-то есть, как же без них, но они не причесанные и не отформатированные. |
|
11.12.2010, 16:31 | #722 |
Форумец
Сообщений: 82
Регистрация: 13.09.2010
Не в сети |
petrd, Я так и делаю если изменилось тогле на 1 и код кнопки 1 то вкл если ноль то выкл.Смысл в том что если нажать на другую кнопку один раз а затем на кнопку 1 надо нажать два раза(чтобы включить к примеру).Попробуйте сами(как я понимаю если у меня светодиод горит от нажатие кнопки один неважно нажимал ли я кнопку два или три, при следующем нажатие на один он должен погасить светодиод( а ни при двух нажатиях)).
|
11.12.2010, 20:10 | #723 |
Форумец
|
|
12.12.2010, 09:12 | #724 |
Форумец
Сообщений: 82
Регистрация: 13.09.2010
Не в сети |
Здраствуйте petrd, Простите за не внимательность сейчас попробую.Обновил MikroC Pro и все проблемы с зависанием исчезли.
if(IR.received == 1) { switch(IR.command) { case 1: RA4_bit = ~RA4_bit; break; // на ПДУ нажата кнопка "1", переключить RA4 } IR.received = 0; } Если рассматривать данный пример он же никак не должен включаться и выключаться от кнопки 2. Нажал один включился.нажал два.нажал один.нажал два выключился. Последний раз редактировалось Азат; 12.12.2010 в 11:26. |
14.12.2010, 14:35 | #725 | |
Форумец
Сообщений: 82
Регистрация: 13.09.2010
Не в сети |
Вот так правильно?
Цитата:
Последний раз редактировалось Азат; 14.12.2010 в 15:41. |
|
14.12.2010, 15:08 | #726 |
Форумец
|
Азат, это код как раз и есть код по AN744 (даже имена переменных теже самые), только переписанный под mega8, hex-ы в посте 718, только у меня там вместо сообщений кейлока передаются два байта - номер комбинации кнопок и вычисляемая CRC8.
|
14.12.2010, 21:08 | #728 |
Форумец
|
Это надо в компиляторе смотреть, в одних глазах правды нет. Во вложении мой проект "как есть".
P.S. Регистр ACSR в AVR наподобие CMCON в PIC. |
17.12.2010, 07:14 | #731 |
Форумец
|
Вариантов можно придумать несколько. Например, сделать счетчик по таймеру и в подпрограмме обработки принятой команды его сбрасывать. А в главном цикле следить за ним, если счетчик досчитал до нужного значения, т.е. какое-то время не было принято ни одной команды, то сбросить в исходное что не надо.
|
17.12.2010, 12:01 | #732 |
Форумец
|
Именно это в железе не проверял, только в протеусе. Я этот код в железе давно делал. Работало. Попробуйте сначала соединить два контроллера напрямую без модулей.
|
18.12.2010, 08:26 | #733 |
Форумец
Сообщений: 82
Регистрация: 13.09.2010
Не в сети |
petrd, Нашел все работает.обработка кнопок понравилась так граммотно написана т.е тикаем по 10 мс нажимаем проверяем состояние(при чем разные состояние кнопки).
Появилось пару вопросов: 1.Как сделать режим сна(sleep) для проекта tx чтоб его потом можно было разбудить любой кнопой(сколько времени занимает разбудить). 2.Как расчитать с каким номиналом поставить резистор если питание будет 3 вольта к примеру. 3.Сколько времени занимает посылка сигнала(т.е при нажатие кнопки стоит задержка 100 мс это довольно долго). Последний раз редактировалось Азат; 18.12.2010 в 16:52. |
19.12.2010, 09:49 | #734 | |
Форумец
|
Цитата:
1. Для сна надо использовать кнопки подключенные к RB7-RB4 и прерывание RBIE. 2. Какой резистор? Для чего? 3. Так уберите задержку. |
|
19.12.2010, 12:40 | #735 | |
Форумец
Сообщений: 82
Регистрация: 13.09.2010
Не в сети |
petrd, Виктор Тимофеев вам спасибо.
1.Не обижайтесь я еще только учусь Усыпляю командой asm{sleep}; да и MCLR должен быть включен? Цитата:
void main() RBIE=1; т.е говорю ему от ног RB что еще нужно? |
|
19.12.2010, 19:27 | #736 | |
Форумец
|
Цитата:
Куда включен? Если он в битах конфигурации - как вход, то можно как вход использовать, иначе подтянуть к питанию. Конечно, нужно. Почитать про то как работает прерывание RBIE и правильно написать код обработчика. И читать, читать, читать. |
|
20.12.2010, 12:47 | #737 | |
Форумец
Сообщений: 82
Регистрация: 13.09.2010
Не в сети |
Здраствуйте petrd, все приходит с пониманием поверьте я читаю.Сделал так но что то не работает.
Цитата:
|
|
20.12.2010, 13:42 | #738 | |
Форумец
|
Цитата:
И вот еще что. Чтобы переменная m_Buttons.ucPressed приняла правильное значение обработчик кнопок Task_Button() должен отработать несколько проходов. А по Вашему коду программа после первого же прохода Task_Button() уйдет в Sleep. Программе после выхода из Sleep (т.е. нажатия кнопки) надо дать время, чтобы Task_Button() отработала сколько надо и только потом разрешать Sleep. |
|
20.12.2010, 15:30 | #739 | |
Форумец
Сообщений: 82
Регистрация: 13.09.2010
Не в сети |
А так делаем два прохода?
Цитата:
|
|
21.12.2010, 08:17 | #741 | |
Форумец
Сообщений: 82
Регистрация: 13.09.2010
Не в сети |
Делаю десять проходов не просыпается
Цитата:
|
|
21.12.2010, 10:47 | #742 |
Форумец
|
Да просыпается он, но из прерывания выйти не может. Я же уже говорил - виснет в прерывании 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; // и сразу в сон // по выходу из сна (по нажатию) окажемся в прерывании } Последний раз редактировалось petrd; 21.12.2010 в 11:36. |
21.12.2010, 12:17 | #744 | |
Форумец
Сообщений: 82
Регистрация: 13.09.2010
Не в сети |
Не просыпаеться не в протезе ни в железе.Попробывал и в порт записать.
Ошибка где в прерывание RBIE_bit = 1; как только я его разрешил все тишина. Цитата:
Последний раз редактировалось Азат; 21.12.2010 в 13:05. |
|
21.12.2010, 13:33 | #745 | |
Форумец
|
Цитата:
Код:
if(tick1 >=20); { tick1=0; тут прочитать PORTB RBIF = 0; RBIE_bit = 1; // здесь разрешить прерывание asm sleep; // и сразу в сон } |
|
21.12.2010, 14:17 | #748 |
Форумец
Сообщений: 82
Регистрация: 13.09.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] Последний раз редактировалось Азат; 14.01.2011 в 09:43. |
24.12.2010, 22:24 | #749 | |
Форумец
Сообщений: 36
Регистрация: 19.10.2010
Возраст: 58
Не в сети |
Цитата:
А вот немного не понятно... какая разница- просто импульсы 50герц для синхронизации или сеть... - 10 миллисекунд заряд конденсатора - а потом следующие 10- порт на вход перестраивается- включается компаратор и ожидается разряд конденсатора до уровня ниже опорного напряжения |
|