Пробуем работать с PIC-контроллерами. - ФОРУМ ДВ Робот dvrobot.ru
Вторник, 16.10.2018, 02:02
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    • Страница 1 из 1
    • 1
    Модератор форума: GRACH, Serg  
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Пробуем работать с PIC-контроллерами. (Осваиваем Модуль Kit - PIC16F877A)
    Пробуем работать с PIC-контроллерами.
    SergДата: Вторник, 28.05.2013, 18:53 | Сообщение # 1
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Давно хотел опробовать Модуль Kit - PIC16F877A. Начал с самого простого - термометра.
    Нам понадобится:
    Модуль Kit - PIC16F877A



    Темодатчик DS18S20
    LCD дисплей 1602



    Для программирования микроконтроллера вот такой программатор PIC K150



    Программу для работы с этим прорамматором можно скачать по этой ссылке
     
    SergДата: Вторник, 28.05.2013, 19:14 | Сообщение # 2
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Программа написана в компиляторе MikroC for PIC

    Код

    //Термометр с датчиком на DS18S20, МК PIC16F877A, F = 20 Мгц
    //Предел измерения от - 55 до + 100

    int main (void)
    {
         unsigned char byte0,byte1,z; //байты приёма 0,1 z - счётчик
         unsigned int tm, byte6, byte7; //tm - градусы, биты приёма 6,7

         ADCON1 = 0xFF;
         PORTA = 0x00;
         TRISA = 0x02;  //RA1 - вход, все остальные выходы
         PORTC = TRISC = 0x00;
         OPTION_REG = 0x7F;
         PORTB = 0xFF;
         TRISB = 0xD8; // выходы для ЖК
         Lcd_Custom_Config ( &PORTB, 5, 2, 1, 0, &PORTC, 0, 1, 5);//Иниц.ЖКИ
         Lcd_Custom_Cmd ( Lcd_CURSOR_OFF ); // Выключить курсор
         Ow_Reset ( &PORTA,1); //Сброс DS18S20, начало команд
         Ow_Write ( &PORTA,1,0x33 ); // Чтение сигнатуры датчика
         if ( (z = Ow_Read ( &PORTA,1 )) == 0x10 ) Lcd_Custom_Out ( 2,5, "DS18S20" );
            else // если в устройстве не обнаружен нужный датчик
                 {
                    if ( z == 0x28 ) Lcd_Custom_Out ( 2,5,"DS18B20");
                       else
                            Lcd_Custom_Out ( 2,5,"ERROR !!!");
                            while(1);
                 }
         Lcd_Custom_Out ( 1,3,"t = +20,0 C" ); //Начальная надпись

         while ( 1 )
         {
               Ow_Reset ( &PORTA,1 ); //Сброс, начало команд
               Ow_Write ( &PORTA,1,0xCC );  //Пуск
               Ow_Write ( &PORTA,1,0x44 );  //Пуск
               Delay_ms ( 750 );            //Задержка по даташиту для замера тем-ры
               Ow_Reset ( &PORTA,1 );       //Сброс, начало новой команды
               Ow_Write ( &PORTA,1,0xCC );  //Чтение тем-ры
               Ow_Write ( &PORTA,1,0xBE );  //Чтение тем-ры
               byte0 = Ow_Read ( &PORTA,1 );  //Младший байт тем-ры
               byte1 = ( Ow_Read ( &PORTA,1)) ? '-':'+'; //Опр-ем + или -
               Ow_Read ( &PORTA,1 ); Ow_Read ( &PORTA,1 );// пропуск байтов 2,3
               Ow_Read ( &PORTA,1 ); Ow_Read ( &PORTA,1 );// пропуск байтов 4,5
               byte6 = Ow_Read ( &PORTA,1 );  //Чтение 6 байта
               byte7 = Ow_Read ( &PORTA,1 );  //Чтение 7 байта
               if ( byte1 == '-' ) byte0 = ( 0xFF - byte0 ) + 2; //Преобр. в отр.тем-ру
               tm = ( byte0 >> 1 ) * 100 + 75 - (( byte6 * 100 ) / byte7 );//Тем-ра
               Lcd_Custom_Chr ( 1, 7, byte1 );  //Выводим знак
               Lcd_Custom_Chr_CP ((( tm / 1000 ) % 10 ) + 0x30 );//Десятки
               Lcd_Custom_Chr_CP ((( tm / 100 ) % 10 ) + 0x30 ); //Еденицы
               Lcd_Custom_Chr_CP ( ',' ); //Разделитель
               Lcd_Custom_Chr_CP (( tm / 10 ) % 10 + 0x30 ); //Десятые доли
          }
      }
                
     
    SergДата: Вторник, 28.05.2013, 19:39 | Сообщение # 3
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Схема вот такая:



    Файл прошивки в формате HEX выложен ниже.
    Прикрепления: 8271847.gif(1.31 Mb) · Termometr.hex(7.2 Kb)
     
    SergДата: Вторник, 28.05.2013, 19:49 | Сообщение # 4
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Первые впечатления- PIC-контроллер даже поинтереснее, чем Arduino. Среда для разработки mikroC PRO for PIC очень удобна, много дополнительных иструментов, очень много примеров и библиотек. Минус лишь один- на форуме поддержки нет информации на русском языке. sad
     
    Ivan-771Дата: Среда, 29.05.2013, 06:13 | Сообщение # 5
    5 Вольт
    Группа: Пользователи
    Сообщений: 39
    Репутация: 0
    Статус: Offline
    Цитата (Serg)
    Первые впечатления- PIC-контроллер даже поинтереснее
    Залёт.
    Вот пример на ATmege8.
    Программа написана в компиляторе  CodeVisionAVR.

    Код
    #include <mega8.h>     // RC генератор на 4 MHZ
    #include <delay.h>             
    #include <alcd.h>     
    #include <ds18b20.h>      
    #include <1wire.h>           
    #include <stdio.h>    
    char lcd_buffer[33];  //массив с данными для экрана
    void main(void)                    
    {
    unsigned char devices;  //переменная в которой количество присоединённых датчиков
    int temp;       //переменная для хранения температуры
    lcd_init(16);  //инициализация LCD    
    lcd_gotoxy(1,0); // позиция     
    lcd_putsf("аaїАёє DS18B20"); //Надпись "Датчик  DS18B20"
    devices=w1_init();  //  датчики
    while(devices>0) //бесконечный цикл, если датчик подключён
         {
            temp=ds18b20_temperature(0);  //читаем температуру     
              if (temp>1000)//если датчик выдаёт больше 1000
               {     
                temp=4096-temp; //отнимаем от данных 4096
                 temp=-temp;    //и ставим знак "минус"                  
               }           
              sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1);   //записываем массив для экрана   
              lcd_gotoxy(0,1);      
              lcd_putsf("                 ");    
              lcd_gotoxy(4,1);              
              lcd_puts(lcd_buffer);  //выводим массив на LCD             
              delay_ms(500);    //ждём 500мс                      
         }                      
    }

    Схема.
    Прикрепления: 0079145.jpg(188.1 Kb)


    Сообщение отредактировал Ivan-771 - Среда, 29.05.2013, 06:17
     
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Пробуем работать с PIC-контроллерами. (Осваиваем Модуль Kit - PIC16F877A)
    • Страница 1 из 1
    • 1
    Поиск:

    ДВ Робот - Чат