Большой Воронежский Форум
Страница 28 из 43
« Первая < 1822232425262728 29303132333438 > Последняя »
»Радиолюбитель>PIC контроллеры. Программаторы и первый проект на PIC
petrd 15:56 07.04.2011
Попробуйте сделать процедуру с проверкой удержания кнопки.
Код:
void ir()
{
if (RC5.received) {
cmd = RC5.command;
RC5.received = 0 ; 
  if (last_toggle == IR.toggle)
       return;
   else
       last_toggle = IR.toggle;

 if (cmd==16) vol_up();
if (cmd==17) vol_down();
if (cmd==11) rez_stb();
if (cmd==12) rez_mute();
if (cmd==32) rez_mode_up();
if (cmd==33) rez_mode_down();
}
}
[Ответ]
Andrey T 18:37 07.04.2011

Сообщение от petrd:
Попробуйте сделать процедуру с проверкой удержания кнопки.

Код:
void ir()
{
if (RC5.received) {
cmd = RC5.command;
RC5.received = 0 ; 
  if (last_toggle == IR.toggle)
       return;
   else
       last_toggle = IR.toggle;

 if (cmd==16) vol_up();
if (cmd==17) vol_down();
if (cmd==11) rez_stb();
if (cmd==12) rez_mute();
if (cmd==32) rez_mode_up();
if (cmd==33) rez_mode_down();
}
}

После этого вообще команды не проходят. [Ответ]
petrd 07:20 08.04.2011

Сообщение от Andrey T:
После этого вообще команды не проходят.

На первый взгляд криминала вроде нет. А какую версию компилятора используете? [Ответ]
Andrey T 07:51 08.04.2011
Использую MikroC PRO for PIC 4.60.
Как быть с тем если происходит удержание кнопки, ведь тогда получается всегда будет last_toggle == IR.toggle и из процедуры программа будет вылетать. [Ответ]
petrd 08:26 08.04.2011

Сообщение от Andrey T:
Использую MikroC PRO for PIC 4.60.
Как быть с тем если происходит удержание кнопки, ведь тогда получается всегда будет last_toggle == IR.toggle и из процедуры программа будет вылетать.

Да, будет вылетать, но при этом первая пришедшая команда будет обработана, а последующие нет. А Вы о чем хотите сказать, что Вам надо длительное и короткое нажатие раздельно обрабатывать? [Ответ]
Andrey T 09:50 08.04.2011
Я хочу чтобы работа полностью соответствовала работе с обычной бытовой техникой, т.е. нажали кнопку параметр изменяется на 1, если удерживаем кнопку, требуемый параметр изменяется пока мы держим кнопку, нажали другую кнопку меняется другой параметр на 1 или тотже самый параметр только в другую сторону -1, если мы нажали и удерживаем параметр также начинает увеличиваться или уменьшаться в течении времени удержания. [Ответ]
petrd 10:23 08.04.2011

Сообщение от Andrey T:
Я хочу чтобы работа полностью соответствовала работе с обычной бытовой техникой,

Стойте. Это Вы так считаете, в стандарте такого нет.

Сообщение от Andrey T:
т.е. нажали кнопку параметр изменяется на 1, если удерживаем кнопку, требуемый параметр изменяется пока мы держим кнопку, нажали другую кнопку меняется другой параметр на 1 или тотже самый параметр только в другую сторону -1, если мы нажали и удерживаем параметр также начинает увеличиваться или уменьшаться в течении времени удержания.

В стандарте говорится, что управляющий бит может использоваться в программе приемника как интерпретация функции автоповтора. Т.е. это остается на совести того кто будет использовать данный протокол.

Ближе к проблеме. Хочется разобраться с причиной, поэтому в коде умышленно предложил убрать повторные нажатия. Сначала надо решить одно, а потом переходить к другому. [Ответ]
Andrey T 07:25 11.04.2011
Убрал последнее состояние стейт-машины, все работает как нужно. В итоге получился вот такой код:

Сообщение от :
void ir()
{
if (RC5_received) {
GIE_bit = 0;

if (cmd==12) rez_stb();
if (stb==0)
{
if (cmd==16) vol_up();
if (cmd==17) vol_down();
if (cmd==13) rez_mute();
if (cmd==32) rez_mode_up();
if (cmd==33) rez_mode_down();
}

RC5_received = 0 ; // Команда обработана
RC5_state = RC5_IDLE ;
GIE_bit = 1;
}
}

//------------------------------------------------------------------------------
// Обработчик прерывания
//------------------------------------------------------------------------------
void interrupt()
{
unsigned char time;

// прерывание по INT/RB0
if (INTF_bit)
{
INTEDG_bit = 1-INTEDG_bit ; //переключение INTEDG (фронт-спад INT)
INTF_bit = 0;

time = TMR0; // захват значения таймера
TMR0 = 0; // перезапуск таймера

switch (RC5_state)
{
////////// СВОБОДЕН. НИЧЕГО НЕ ПОЛУЧЕНО ////////////////////////////
case RC5_IDLE :
RC5_bits = 1; // already 1 bit (with value "1") received
RC5_bitCount = 1;
RC5_shortPulses = 0;
RC5_prevBit = 1;
RC5_state = RC5_DECODING;

T0IF_bit = 0; // сброс флага переполнения TMR0
T0IE_bit = 1; // разрешить прерывания TMR0
break ;

////////// ЗАФИКСИРОВАННО ИЗМЕНЕНИЕ. НАЧИНАЕМ ОБРАБОТКУ БИТ /////////
case RC5_DECODING : // Execution time is about 52 uS at 4 Mhz CPU clock
if ((time > 40) && (time < 120) && (RC5_received == 0))
{
if (time < 65) // обнаружен короткий импульс
{
RC5_shortPulses ++ ;
if (RC5_shortPulses == 2)
{
RC5_bits <<= 1; // сохраняем принятый бит
RC5_bits |= RC5_PrevBit;
RC5_bitCount ++ ;
RC5_shortPulses = 0;
}
} else if (time > 83){ // обнаружен длинный импульс
RC5_prevBit = 1- RC5_prevBit; // переключаем бит
RC5_bits <<= 1; // сохраняем принятый бит
RC5_bits |= RC5_PrevBit;
RC5_bitCount ++ ;
RC5_shortPulses = 0;
}

if (RC5_bitCount == 14)// если приняты все биты
{
//RC5_state = RC5_COMPLETED;
INTEDG_bit = 0; // следующее прерывание по спаду
cmd = (RC5_bits & 0b00111111) ;
RC5_received = 1 ;
T0IE_bit = 0; // отключить прерывания от TMR0
}
} else { // что-то не правильно с временами
RC5_state = RC5_IDLE; // начать сначала
INTEDG_bit = 0; // следующее прерывание по спаду
T0IE_bit = 0; // отключить прерывания от TMR0
}
break ;

/////////// ВСЕ БИТЫ ПРИНЯТЫ КОРРЕКТНО. Сохранение данных ///////////
/*case RC5_COMPLETED :
INTEDG_bit = 0; // следующее прерывание по спаду
toggle = ((RC5_bits>>11) & 0x01);
//IR.device = (RC5_bits>>6) & 0b00011111 ;
cmd = (RC5_bits & 0b00111111) ;
RC5_received = 1 ;
//RC5_state = RC5_IDLE ;
break ;*/
} // end switch
} // end INIF

// Прерывание TMR0
if (T0IF_bit) // Переполнение TMR0, тайм-аут
{
if ((RC5_state == RC5_DECODING) && (RC5_received == 0)) // что-то неправильно
{
RC5_state = RC5_IDLE; // начать с начала
INTEDG_bit = 0; // следующее прерывание по спаду
T0IE_bit = 0; // отключить прерывания TMR0
}
}
T0IF_bit = 0; // всегда сбрасывать флаг переполнения TMR0
} // конец обработчика прерывания

[Ответ]
VRTP 19:02 11.04.2011

Сообщение от Andrey T:
Убрал последнее состояние стейт-машины, все работает как нужно. В итоге получился вот такой код:

Спасибо за такие комменты
МОЛОДЦА,удачи!
[Ответ]
Andrey T 07:19 12.04.2011

Сообщение от VRTP:
Спасибо за такие комменты
МОЛОДЦА,удачи!

За комменты спасибо надо говорить petrd, это его код, я лишь доработал под себя. [Ответ]
alarm801 17:57 13.04.2011
Пытаюсь прошить pic18f252 вот этим программатором, пишет ошибку и всё. Читать читает, но не очищает! Что за х..ня??? Может кто нибудь подскажет???
Изображения
Нажмите на изображение для увеличения
Название: art2003-prog-top1.jpg
Просмотров: 13
Размер:	79.9 Кб
ID:	1261045  
[Ответ]
petrd 18:50 13.04.2011

Сообщение от alarm801:
Пытаюсь прошить pic18f252 вот этим программатором, пишет ошибку и всё. Читать читает, но не очищает! Что за х..ня??? Может кто нибудь подскажет???

Ваш программатор поддерживает только низковольтное программирование.
Если контроллер новый, то с завода он выходит с установленным битом конфигурации LVP, который разрешает низковольтовое программирование.
Если контроллер прошивался раньше или Вы с новья прошили его прошивкой со сброшенным в ней битом, то все, Ваш программатор ничего уже не сможет с ним сделать, для перепрограммирования нужен программатор с режимом высоковольтного программирования, чтобы снова установить бит LVP. [Ответ]
alarm801 19:50 13.04.2011
Подал внешнее питание при програмировании, вроде начал работать))) [Ответ]
Вовка-Морковка 10:22 26.04.2011
Здравствуйте, petrd! Проиллюстрируйте, пожалуйста, на микроси для 16F628 работу компаратора, напряжение берём с переменного резистора а при сработке изменяется переменная (загорается светодиод). [Ответ]
Butik 00:06 03.05.2011
Вот небольшой пример на Си для 12F629- - это в общем заготовка для диммера с аналоговым входом- ну или для другого подобного устройства-суть не в этом для чего но тут используется компаратор с внутренним источником опорного напряжения.. Для 628 будет в принципе аналогично- там только два компаратора- вот и все.. Если что не так- то пардон- сам только учусь... Если что- пусть господа знатоки покритикуют

Код:
unsigned short t,old_GPIO;

void init() {
  CMCON  = 0x07;
  TRISIO   = 0x28;
  OPTION_REG = 0b11000101;
  INTCON.GIE        = 0;
   }

void main() {
init() ;
    do {
   old_GPIO = GPIO;
   if(old_GPIO.F5 == 1)
   {TRISIO =0x28;
   old_GPIO.F1 = 1;
   old_GPIO.F4 = 0;
   GPIO = old_GPIO;}

  if(old_GPIO.F5 == 0)
  {
  CMCON = 0x04;
  VRCON = 0xA3;
  TRISIO = 0x2A;
  TMR0 = 0;
  Delay_us(10);
  if(CMCON.F6==1){
  t = TMR0;
  old_GPIO.F4 =1;
  GPIO = old_GPIO;}
  }
    }  while(1);

}

Изображения
Нажмите на изображение для увеличения
Название: Документ1.jpg
Просмотров: 131
Размер:	11.3 Кб
ID:	1292017  
[Ответ]
VRTP 19:50 04.05.2011

Сообщение от Butik:
Вот небольшой пример на Си для 12F629

Отличная штуковина,а комменты где?????Может на твоём примере многое почерпну.
Доведи дело до логического конца,буду благодарен. [Ответ]
Butik 14:17 05.05.2011
вот фрагмент с комментариями если что не понятно- идея там простая- из напряжения сети формируются импульсы частотой 100 герц, которые подаются на вход синхронизации. При положительной полуволне сетевого напряжения происходит заряд конденсатора, а при отрицательной - разряд конденсатора , фиксация состояния компаратора а также считывание состояния таймера TMR0.... Идея далеко не нова- фрагмент чисто учебный . За основу взят стандартный пример применения AN958 PIC 10F202,204 с официального сайта Microchip-
http://www.microchip.com/stellent/id...pnote=en021266
поищи в сети - там правда все на асемблере- вот я для развития и пытаюсь перевести подобное на Си плюс адаптировать для сети 50Гц а не 60 как в штатах

Код:
unsigned short t,old_GPIO;
  // НАЧАЛЬНАЯ ИНИЦИАЛИЗАЦИЯ
void init() {
  CMCON  = 0x07;   // все выводы контроллера-цифровые
  TRISIO   = 0x28; //выводы GPIO5,3-на ввод, остальные - на вывод
  OPTION_REG = 0b11000101;/* подтягивающие резисторы- выключены,
  активный фронт внешнего прерывания-передний,такиовый сигнал для таймера-
   внутренний. предделитель- перед TMR0, коэффициент деления- 1:64 */
  INTCON.GIE        = 0; //прерывания запрещены
   }

void main() {
init() ;  // НАЧАЛЬНАЯ ИНИЦИАЛИЗАЦИЯ
    do {
   old_GPIO = GPIO; // считывания состояния портов
   if(old_GPIO.F5 == 1)// если на входе синхронизации полуволна положительная
   {TRISIO =0x28; // то настраиваем GPIO,1 на вывод
   old_GPIO.F1 = 1;  // и выставляем на него лог 1 для зарядки конденсатора
   old_GPIO.F4 = 0; //  выключаем светодиод
   GPIO = old_GPIO;} //

  if(old_GPIO.F5 == 0) //  если на входе синхронизации полуволна положительная
  {
  CMCON = 0x04; // то конфигурируем компаратор с внутренним ИОН
  VRCON = 0xA3; //
  TRISIO = 0x2A;// настраиваем  GPIO,1  как аналоговый вход компаратора
  TMR0 = 0;     // сбрасываем таймер
  Delay_us(10);  // задержка 10мксек для установки режима компаратора
  if(CMCON.F6==1){  // ждем разряда конденсатора ниже напряжения ИОН
  t = TMR0;         // считываем показание таймера
  old_GPIO.F4 =1;   //  включаем светодиод
  GPIO = old_GPIO;}  //
  }
    }  while(1);   // бесконечный цикл

}
кстати- в сети где то читал- что существует перевод упомянотого AN958 на русский язык с адаптацией под 50гц, но опять же на ассемблере. Но пока не нашел. Впрочем описаний подобных устройств в сети немало Можно и готовое устройство подобрать если уж очень нужно [Ответ]
VRTP 17:29 05.05.2011
Butik
Спасибо! [Ответ]
Вовка-Морковка 20:04 05.05.2011
Спасибо, буду разбираться! [Ответ]
Вовка-Морковка 20:26 11.05.2011
Здравствуйте, уважаемые форумчане!
Никто не пробовал подключать индикатор от убитого DVD к пику?
Там, вроде, I2C и пример в хелпе к микроси есть, но какой адрес устройства и
какие данные/команды посылать? [Ответ]
_vka 17:10 13.05.2011
Всем привет!!!
Запустил GLCD WG240128 пишет , рисует , просто класс!!! Но вот проблема с меню ,не знаю как мне передать из одного пункта меню 3 значения. подскажите в каком направлении копать??? на форуме микрочипа нашел кусок меню написанный petrd
если есть возможность прокоментируйте как это работает, заранее спасибо
typedef struct typeMenu{
unsigned char *Name;
struct typeMenu *Prev;
struct typeMenu *Next;
struct typeMenu *Down;
struct typeMenu *Up;
unsigned char Flag: 1;
};

extern struct typeMenu Menu_0;
extern struct typeMenu Menu_1;
extern struct typeMenu Menu_2;
extern struct typeMenu Menu_3;
extern struct typeMenu Menu_4;
extern struct typeMenu Menu_4_1;

struct typeMenu Menu_0 ={"Menu_0", &Menu_4, &Menu_1, 0, 0, 0};
struct typeMenu Menu_1 ={"Menu_1", &Menu_0, &Menu_2, 0, 0, 0};
struct typeMenu Menu_2 ={"Menu_2", &Menu_1, &Menu_3, 0, 0, 0};
struct typeMenu Menu_3 ={"Menu_3", &Menu_2, &Menu_4, 0, 0, 0};
struct typeMenu Menu_4 ={"Menu_4", &Menu_3, &Menu_1, &Menu_4_1, 0, 0};
struct typeMenu Menu_4_1 ={"Menu_4_1", 0, 0, &Menu_4, 0, 0}; [Ответ]
UR5XCA 20:37 31.05.2011
Привет всем участникам форума , у меня есть проблема на счет програмирования в MicroC используя стандартный код для управления ЖКИ 16/2 я попробывал написать код бегущей строки вроде-бы все вышло решил добавить побольше текста вышла абракодабра какая-то причем она меняется при движении строки убрал пару знаков все стало нормально пробывал как в 4-х битном так и 8-ми не помогает [Ответ]
UR5XCA 20:52 31.05.2011
В последствии я так понял что переполнен стек так как MicroC выдает ошибку и отказывается компилировать также пробывал просто выводить текст на индикатор при большом объеме тоже не хочет стало ясно что это проблема самого компилятора посоветуйте как выйти из этой ситуации строго не судите так как на си только учусь програмировать, а начинал с ассемблера [Ответ]
petrd 21:23 31.05.2011
Приведенная Вами информация - ни о чем не говорит. Код показывайте. [Ответ]
UR5XCA 22:08 31.05.2011
char *text = "mikroElektronika";

void main() {
Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); // Lcd_Init_EP5, see Autocomplete

LCD_Cmd(LCD_CLEAR); // Clear display
LCD_Cmd(LCD_CURSOR_OFF); // Turn cursor off
LCD_Out(1,1, text); // Print text to LCD, 1st row, 1st column
Delay_ms(1000);
LCD_Out(2,6,"mikroE"); // Print text to LCD, 2nd row, 6th column
text = "RADIO AMATER UR5XCA";
LCD_Out(3,1,text);
LCD_Out(4,1,"RADIO AMATER UR5XCA");
Delay_ms(1000);
LCD_Cmd(LCD_CLEAR);
LCD_Cmd(LCD_CURSOR_OFF);
LCD_Out(5,2,"LIZUNOV KIRILL");
LCD_Out(6,1,"MY CALL UR5XCA");
LCD_Out(7,1,"123456");
} [Ответ]
UR5XCA 22:18 31.05.2011
Это я немного добавил текста решил попробывать когда в последнем выходе на 7-ю строку оставляю один знак то код компилируется я так понял что MicroC для хранения информации выводимой на экран ЖКИ использует стек в моем примере на 16F877A в разделе статистика видно стеки с 0-го по 15-й если я использую много текста то в GPR после 15-го стека появляется lstr2_LCD Test и так далее. [Ответ]
UR5XCA 22:23 31.05.2011
А еще после неудачной компиляции в окне Message Text появляется Const truncated lstr2_LCD но прошивка создается в режиме симуляции в Proteus могут отсутствовать некоторые строки вроде самые первые в компиляторе оно как-то заменяет ели писать больше текста то пропадет предыдущий написаный ранее. [Ответ]
petrd 22:45 31.05.2011
Это не проблема компилятора, это проблема Ваших знаний языка Си и особенностей данного компилятора. Пока не пройдет компиляция без ошибок, на hex (coff) файлы нет никакого смысла смотреть и тем более их куда-то совать в симуляторы и прошивать ими контроллеры

Сообщение от :
char *text = "mikroElektronika";

Перевод с Си на более понятный - переменная text указывает на строку типа char, т.е. переменная text содержит адрес начала строки mikroElektronika (это будет адрес буквы m), а конец строки будет определяться терминальным нулем. Исходя из этого мне кажется, что запись

Сообщение от :
text = "RADIO AMATER UR5XCA"

не совсем правильная и проблемы связаны с ней.
Почитайте про указатели в Си и загляните в ассемблерный листинг - узнаете много интересного. [Ответ]
UR5XCA 22:59 31.05.2011
Подскажите пожалуйста книжку или учебник по MicroC так как на си я никогда не програмировал этот код результат получаса разбирательств с компилятором до этого я сидел в MPlab5.7 [Ответ]
UR5XCA 23:25 31.05.2011
char;

void main() {
Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); // Lcd_Init_EP5, see Autocomplete

LCD_Cmd(LCD_CLEAR); // Clear display
LCD_Cmd(LCD_CURSOR_OFF); // Turn cursor off
LCD_Out(1,1,"abcdefg"); // Print text to LCD, 1st row, 1st column
Delay_ms(1000);
LCD_Out(2,6,"mikroE"); // Print text to LCD, 2nd row, 6th column

LCD_Out(3,1,"hklmnop");
LCD_Out(4,1,"RADIO AMATER UR5XCA");
Delay_ms(1000);
LCD_Cmd(LCD_CLEAR);
LCD_Cmd(LCD_CURSOR_OFF);
LCD_Out(5,2,"LIZUNOV KIRILL");
LCD_Out(6,1,"MY CALL UR5XCA");
LCD_Out(7,1,"123456");
Delay_ms(1000);
LCD_Cmd(LCD_CLEAR);
LCD_Cmd(LCD_CURSOR_OFF);
LCD_Out(1,2,"rstuw");

} [Ответ]
Страница 28 из 43
« Первая < 1822232425262728 29303132333438 > Последняя »
Вверх