Большой Воронежский Форум
Страница 19 из 43
« Первая < 913141516171819 20212223242529 > Последняя »
»Радиолюбитель>PIC контроллеры. Программаторы и первый проект на PIC
Азат 11:11 17.09.2010
Люди куда потерялись? [Ответ]
petrd 11:55 17.09.2010
Для работы с COM портом никаких препятствий нет.
1. Надо использовать аппаратный UART микроконтроллера.
2. К контроллеру прицепить микросхему преобразователя уровней RS232 (типа MAX232 и т.п.).
3. Подправить программу для работы с UART.
И уже можно будет работать с какой-нибудь терминалкой или написать свою программку для PC. [Ответ]
Азат 07:41 20.09.2010
petrd, подскажите пожалуйста схематично как подцепить мах232 к нашему проекту.Какую лучше купить Микросхема MAX232CWE+ или Микросхема MAX232CPE или MAX232AEWE+. [Ответ]
petrd 10:00 20.09.2010

Сообщение от Азат:
petrd, подскажите пожалуйста схематично как подцепить мах232 к нашему проекту.Какую лучше купить Микросхема MAX232CWE+ или Микросхема MAX232CPE или MAX232AEWE+.

Любую, главное чтобы ее корпус Вас устроил и правильные номиналы конденсаторов поставить.
Чтобы подключить MAX232 к PIC16F628A надо будет еще переназначить выводы для ЖКИ.
Изображения
Нажмите на изображение для увеличения
Название: MAX232.JPG
Просмотров: 70
Размер:	74.5 Кб
ID:	942486  
[Ответ]
Азат 10:16 20.09.2010
petrd, Спасибо Петр сегодня куплю попробую спаять.И ЖКИ с RB1 и RB2 куда лучше переназначить.А программно думаю без Вас пока не разберусь. [Ответ]
petrd 11:10 20.09.2010

Сообщение от Азат:
И ЖКИ с RB1 и RB2 куда лучше переназначить.

Думаю на RA7 и RA6. Но программу надо будет переписывать на MikroC PRO, в ней более гибко переназначаются выводы ЖКИ. [Ответ]
Азат 11:18 20.09.2010
petrd, Я в ней делаю MikroC Version: 8.2.0.0 только незнаю Pro она или нет.Кнопка уставка остается на прежнем месте? Если не трудно давайте сразу посмотрим и учтем подключение инфакрасного приемника к какой ноге.
Изображения
Нажмите на изображение для увеличения
Название: ik.GIF
Просмотров: 37
Размер:	8.0 Кб
ID:	942697  
[Ответ]
petrd 12:08 20.09.2010

Сообщение от Азат:
petrd, Я в ней делаю MikroC Version: 8.2.0.0 только незнаю Pro она или нет.Кнопка уставка остается на прежнем месте? Если не трудно давайте сразу посмотрим и учтем подключение инфакрасного приемника к какой ноге.

Нет 8.2 это не PRO, MikroC PRO 3.8 здесь http://www.mikroe.com/eng/products/v...c-pro-for-pic/ , MikroC PRO 4.0 Beta здесь http://www.mikroe.com/forum/viewtopic.php?f=85&t=26269. Кнопка пока на месте, ИК на любой оставшийся.
Только под Ваши потребности памяти может не хватить. [Ответ]
Азат 13:21 20.09.2010
petrd, Программу закачал.Тогда инфракрасный вешаем на RB6.А схема подключения ик приемлема? [Ответ]
Азат 06:56 21.09.2010
petrd, Все купил спаял.Осталось разобраться с написанием программы. [Ответ]
petrd 18:59 21.09.2010

Сообщение от Азат:
petrd, Все купил спаял.Осталось разобраться с написанием программы.

1. Скачайте программку TCOM (ftp://ftp.radio.ru/pub/2003/05/tcom/tcom.exe) и проверьте, что MAX подключен правильно.
2. Откройте help MikroC, найдите в нем описание UART Library, там есть тестовая программа с эхом, поробуйте ее откомпилировать и запустить самостоятельно. [Ответ]
Азат 11:23 22.09.2010
petrd, Да все просто как никогда т.е я отправил а он мне в ответ прислал.
1) обмен данных на какой скорости я могу делать и от чего это зависит.От max 232? или просто при написание увеличить(там можно установить скорость соединения).
2)Еще вопрос Usart и Uart это одно и тоже?
3)Теперь давайте разбиремся с ПДУ. [Ответ]
petrd 12:26 22.09.2010

Сообщение от Азат:
petrd, Да все просто как никогда т.е я отправил а он мне в ответ прислал.
1) обмен данных на какой скорости я могу делать и от чего это зависит.От max 232? или просто при написание увеличить(там можно установить скорость соединения).
2)Еще вопрос Usart и Uart это одно и тоже?
3)Теперь давайте разбиремся с ПДУ.

Скорости обмена имеют установившиеся значения.
1. СмОтрите доступные скорости в терминальной программе. Выбираете нужную.
2. В своей программе для PIC ( UART1_Init(........); ) ставите такую же. При компиляции компилятор скажет какой процент отклонения будет при данной тактовой частоте процессора и, вообще, можно ли работать на такой скорости обмена. Подробности смотрите в datasheet.
3. USART - возможна работа в синхронном и асинхронном режиме, UART - возможна работа в асинхроннном режиме. Все написано в datasheet. Библиотека MikroC работает в асинхронном режиме и этого обычно достаточно.
4. Название Вашего IR приемника?
5. Думаю Вам надо почитать про декодирование формата RC5, есть и другие, но думаю с этим проще. [Ответ]
Азат 16:45 22.09.2010
название ir приемника ksm-lj4 37кГц [Ответ]
ec-11 06:55 23.09.2010
Здравствуйте!
Попробовал смоделировать проект термометра, который размещен немного раньше. В протеусе он у меня почему-то не работает. Помогите мне, пожалуйста, найти ошибку. Файлы загрузил.
Изображения
[Ответ]
Азат 12:29 23.09.2010
petrd, Прочитал про декодирование формата RC5.Ну пока в голове ясности как сделать нет,понял только как приходит что обозначает и сколько должны быть задержки в мс. [Ответ]
petrd 11:45 24.09.2010

Сообщение от ec-11:
Здравствуйте!
Попробовал смоделировать проект термометра, который размещен немного раньше. В протеусе он у меня почему-то не работает. Помогите мне, пожалуйста, найти ошибку. Файлы загрузил.

Протеус не люблю и не пользуюсь. У меня стоит, на всякий случай, 7.4 SP3, но он не хочет открывать Ваш проект, говорит что проект в более новой версии. Если нужна помощь, откомпилите под мой протеус или киньте ссылку на Вашу версию, только с лекарством. [Ответ]
petrd 11:53 24.09.2010

Сообщение от Азат:
petrd, Прочитал про декодирование формата RC5.Ну пока в голове ясности как сделать нет,понял только как приходит что обозначает и сколько должны быть задержки в мс.

Тоже никогда с RC5 дела не имел и глубоко разбираться с ним не вижу нужды. В сети навлом примеров кода для декодирования RC5, формат старый и разжеванный, надо найти подходящий код и переделать, например, здесь http://www.microchip.su/showthread.p...E%E4%E5%F0+RC5 [Ответ]
ec-11 06:20 25.09.2010

Сообщение от petrd:
Если нужна помощь, ... ... или киньте ссылку на Вашу версию, только с лекарством.

Ссылку отправил в Вашу личку. [Ответ]
petrd 11:41 25.09.2010

Сообщение от ec-11:
Ссылку отправил в Вашу личку.

Благодарю за ссылку.
Не стал разбираться в чем была проблема у Вас, пересобрал проект, откомпилировал, работает.
Изображения
[Ответ]
ec-11 06:11 26.09.2010

Сообщение от petrd:
Благодарю за ссылку.
Не стал разбираться в чем была проблема у Вас, пересобрал проект, откомпилировал, работает.

"Ура заработало".
Я думал проблема в Протеусе. А оказалось, была ошибка в Си-коде.
Буду разбирать Ваши примеры дальше.
Большое Вам спасибо.
[Ответ]
petrd 07:37 27.09.2010

Сообщение от ec-11:
"Ура заработало".
Я думал проблема в Протеусе. А оказалось, была ошибка в Си-коде.
Буду разбирать Ваши примеры дальше.
Большое Вам спасибо.

Не за что. Проблема была видимо не в коде, так как код почти не трогал (только подправил вывод минуса для отрицательных температур, для Вашей проблемы это не принципиально), а в настройках самого проекта - частота, биты конфигурации. [Ответ]
petrd 12:05 28.09.2010
Программа - декодер формата RC5. Нашел в сети, переделал, работает.
Выводит на ЖКИ принятый сигнал, разложенный в соответствии со стандартом RC5 (номер системы, номер команды, управляющий бит) + количество повторов.
Код:
/***********************************************************************************
*               ПРОГРАММА ДЕКОДИРОВАНИЯ ПРОТОКОЛА  IR PHILIPS RC5                  *
************************************************************************************
* Для приемника RC5 с инверсным выходом (= активный выходной уровень низкий,)      *
* например, TSOP1736. Выход приемника RC5 подключен к выводу внешнего прерывания   *
* INT(RB0).                                                                        *
*                                                                                  *
************************************************************************************
*Алгоритм :                                                                        *
*~~~~~~~~~                                                                         *
* При каждом изменении входного сигнала от приемника RC5 генерируется прерывание.  *
* В обработчике измеряется время между двумя следующими друг за другом изменениями.*
* На основании измеренной разницы делается вывод: одиночный или двойной импульс.   *
* Если измеренное время находится вне допустимого интервала принятый код считается *
* недостоверным и обработчик переводит себя в исходное состояние. В стейт-машине   *
* используется три состояния: IDLE (СВОБОДЕН), DECODING (ДЕКОДИРОВАНИЕ) и          *
* COMPLETED (ЗАВЕРШЕНО).                                                           *
************************************************************************************
* Hardware config : 16F628A @ 4Mhz  + TSOP1736 + LED + LCD                         *
* -------------------------------------------------------------------------------- *
* LED on RA0 (active when port high)                                               *
* TSOP-1736 : Output pin connected to RB0 (active when low)                        *
* LCD : WH1602 on PORTB : bits 7..4 = DB7...DB4/bit 3 = EN/bit 2 = RS/ GND = RW    *
* Note : when using a different Crystal speed, you will need to change prescaler   *
* in the main program and potentially the counters in the definition section       *
***********************************************************************************/

//-----------------------------------------------------------------------------
// Hardware specific settings
//-----------------------------------------------------------------------------
#define LED_On()      (RA0_bit=1)
#define LED_Off()     (RA0_bit=0)
#define LED_Toggle()  (RA0_bit=~RA0_bit)

#define IR_PIN        (RB0_bit)

//-----------------------------------------------------------------------------
// Predefined constants
//------------------------------------------------------------------------------
#define RC5_NR_Bits   14

// Всего должно быть захвачено 14 RC5_Bits (первый "стартбит" уже есть
// при первом прерывании)
// Формат принимаемых бит:
// - 2 стартовых бита (оба "1")
// - 1 управляющий бит (изменяется всякий раз когда отправлена новая команда)
// - 5 системных бит, старшим битом вперед (номер системы)
// - 6 командных бит, старшим битом вперед (номер команды)
// Биты распознаются между 2-мя фронтами сигнала RC5:
// - "длинный" означает: принятый бит отличается от предыдущего
// - два "коротких" означает: принятый бит эквивалентен предыдущему биту,
//   первый стартовый бит всегда равен "1"

#define RC5_TIME_BOUNDARY       83  // граница, ниже 83 = короткий, выше = длинный (0.75 bittime)
#define RC5_TIME_TOO_SHORT      28  // (0.25 bittime)
#define RC5_TIME_TOO_LONG      140  // (1.25 bittime)

// 1 bit time = 1778 uS
//    "короткий" время = 1/2 bittime = 889 uS, = timer value 55.5 (= 889/16)
//    "длинный"  время = 1 bittime = 1778 uS,  = timer value 111.12 (=1778/16)

//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections

enum {
      RC5_IDLE,
      RC5_DECODING,
      RC5_COMPLETED
} RC5_state = RC5_IDLE ;

unsigned int   RC5_bits ;               // содержит принятые биты
unsigned char  RC5_bitCount ;           // счетчик обработанных битов
unsigned char  RC5_prevBit ;            // значение предыдущего бита
unsigned char  RC5_shortPulses ;        // число последовательных коротких бит

struct
{
    toggle   : 1 ;
    device   : 5 ;
    command  : 6 ;
    received : 1 ;
} IR ;

//-----------------------------------------------------------------------------
// Прототипы функций
//-----------------------------------------------------------------------------
void  Lcd_INT (int row, int col, int x, unsigned char len);

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

     // прерывание по INT/RB0
     if (INTF_bit)
     {
       LED_Toggle () ;

       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 > RC5_TIME_TOO_SHORT) && (time < RC5_TIME_TOO_LONG))
                {
                     if (time < RC5_TIME_BOUNDARY) // обнаружен короткий импульс
                     {
                        RC5_shortPulses ++ ;
                        if (RC5_shortPulses == 2)
                        {
                           RC5_bits <<= 1;          // сохраняем принятый бит
                           RC5_bits |= RC5_PrevBit;
                           RC5_bitCount ++ ;
                           RC5_shortPulses = 0;
                        }
                     } else {    // обнаружен длинный импульс
                        RC5_prevBit = 1- RC5_prevBit;  // переключаем бит
                        RC5_bits <<= 1;                // сохраняем принятый бит
                        RC5_Bits |= RC5_PrevBit;
                        RC5_bitCount ++ ;
                        RC5_shortPulses = 0;
                     }

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

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

       } // end switch
     } // end INIF

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

     T0IF_bit = 0; // всегда сбрасывать флаг переполнения TMR0

} // конец обработчика прерывания

//------------------------------------------------------------------------------
// MAIN PROGRAM
//------------------------------------------------------------------------------
void main ()
{
     unsigned int dev, cmd ;
     unsigned int repeat ;
     unsigned char last_toggle ;

     // инициализация стейт машины
     RC5_state = RC5_IDLE ;
 
    // инициализация регистров
    CMCON  = 0x07 ;         // отключить компараторы
    
    PORTA  = 0;
    TRISA = 0;
    
    PORTB = 0;
    TRISB = 0b00000001;     // PORTB D7-D1 = LCD  / D0 = IR приемник

    // Настройка TMR0  -->  Настройки зависят от кварца
    // Настройки TMR0  : Предделитель = 1:16 -  1 тик = 16 usec / 62.5 Khz
    OPTION_REG = 0x83;
    TMR0  = 0;  // предустановка TMR0

    T0IF_bit = 0;
    T0IE_bit = 0;      // отключить прерывания от TMR0

    // Enable external interrupt
    INTEDG_bit    = 0;            // начинаем со спада
    INTF_bit      = 0;            // сброс флага прерывания INT
    INTE_bit      = 1;            // разрешить прерывание INT
    GIE_bit       = 1;            // разрешить все прерывания

    // Инициализация LCD
    LCD_Init();
    Lcd_Cmd(_LCD_CURSOR_OFF);                  // Выключить курсор
    Lcd_Out (1, 1, "  Philips RC5") ;
    Lcd_Out (2, 1, "    Decoder  ") ;

    IR.received = 0 ;
    last_toggle = 2 ; // Невозможное значение

    // главный цикл программы

    while (1)
    {
          if (IR.received) {
             dev = IR.device ;
             cmd = IR.command;
             IR.received = 0 ;  // Команда обработана

             if (last_toggle == IR.toggle)
             {
                repeat ++ ;
             } 
             else
             {
                repeat = 0 ;
                last_toggle = IR.toggle;
             }

             LCD_Out (1, 1, "DEV CMD TOG CNT") ;
             LCD_INT (2, 1, dev, 3) ;
             LCD_Chr (2, 4, ' ');
             LCD_INT (2, 5, cmd, 3) ;
             LCD_Chr (2, 8, ' ');
             LCD_Out (2, 9, IR.toggle ? " T  ":"    ") ;
             LCD_INT (2, 13, repeat, 3) ;
          }
          Delay_ms (250) ;
    }
} // end main

//------------------------------------------------------------------------------
// ДОПОЛНИТЕЛЬНЫЕ ПОДПРОГРАММЫ
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
void  Lcd_INT (int row, int col, int x, unsigned char size)
{
      static char txt[7] ;
      int i ;

      IntToStr (x, txt) ;
      for (i=0; i<7; i++) if (txt[i] == ' ') txt[i] = '0' ;
      Lcd_Out(row, col, txt+(6-size)) ;
}
[Ответ]
Азат 12:52 29.09.2010
petrd, Если не трудно нарисуйте схему подключения [Ответ]
petrd 09:18 30.09.2010

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

Так там по коду все расписано. Только у меня IR приемник неизвестного происхождения.
Изображения
Нажмите на изображение для увеличения
Название: RC5_пример.JPG
Просмотров: 104
Размер:	105.5 Кб
ID:	958157  
[Ответ]
Азат 13:15 30.09.2010
Уважаемый petrd, Скомпилировал проект Микро Си Про что то не вкл.Проект прикрепил.Теперь как всегда вопрос на RA2 цепляем через транзистор реле,где в теле программы правильно указать что если код(т.е команду с пульта 14 бит) вкл реле и выкл.
Изображения
[Ответ]
petrd 22:25 30.09.2010

Сообщение от Азат:
Уважаемый petrd, Скомпилировал проект Микро Си Про что то не вкл.Проект прикрепил.Теперь как всегда вопрос на RA2 цепляем через транзистор реле,где в теле программы правильно указать что если код(т.е команду с пульта 14 бит) вкл реле и выкл.

1. У Вас в слове конфигурации установлен HS (внешний кварц), а кварца-то нет на схеме, она работает от внутреннего генератора INTOSC (4 МГц).
2. Признаком безошибочного приема является переменная IR.received == 1, значит, когда это так, то надо смотреть, какая команда пришла, команда содержится в переменной IR.command :
Код:
if(IR.received == 1) {
   switch(IR.command)
              {
               case 1: RA2_bit = ~RA2_bit; break; // на ПДУ нажата кнопка "1", переключить RA2
               case 2: RA3_bit = ~RA3_bit; break; // на ПДУ нажата кнопка "2", переключить RA3
       ......................
              }
  IR.received = 0;
}
[Ответ]
Азат 07:29 01.10.2010
petrd, А в чем отличие INTOSK CLOKOUT и INTOSK I/O какой мне нужно поставить [Ответ]
petrd 08:03 01.10.2010

Сообщение от Азат:
petrd, А в чем отличие INTOSK CLOKOUT и INTOSK I/O какой мне нужно поставить

Читаем datasheet!
INTOSCK CLKOUT - сигнал внутреннего генератора деленный на 4 выводится наружу через RA6, вывод RA7 - вход/выход.
INTOSCK I/O - сигнал внутреннего генератора наружу не выводится, выводы RA6/RA7 используются как входы/выходы. [Ответ]
Азат 08:44 01.10.2010
petrd, Получается мне нужно поставить второе? [Ответ]
Страница 19 из 43
« Первая < 913141516171819 20212223242529 > Последняя »
Вверх