пятница, 11 мая 2012 г.

Измерение температуры воздуха

Сегодня начал разбиратся с датчиком DS18b20. Заданием на сегодня было вывести показания температуры на экран ПК и на LCD. Для решения этой задачи выбрал Codevision AVR, так как для него уже есть готовые библиотеки.
Схема:
Программа (для 8 МГц):
#include <mega8.h>             
#include <delay.h>               //библиотека задержки
#asm                             //сообщаем куда подключен датчик
        .equ __w1_port=0x15; PORTC
        .equ __w1_bit=3
#endasm                
#asm                             //сообщаем куда подключён экран
    .equ __lcd_port=0x18
#endasm
#include <lcd.h>                 //библиотека для LCD
#include <1wire.h>               //библиотека работы с 1Wire
#include <ds18b20.h>             //библиотека для работы с датчиком ds18b20
#include <stdio.h>               //библиотека стандартных функций ввода-вывода
char lcd_buffer[33];             //массив с данными для экрана
void main(void)                
{
unsigned char devices;         //переменная в которой количество присоединённых датчиков
int temp;                               //переменная для хранения температуры
UCSRA=0x00;                     // инициализация UART
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;                      
lcd_init(16);                    //инициализация LCD, и говорим что он на 16 символов
devices=w1_init();               //ищем датчики
while(devices>0)                 //бесконечный цикл, если датчик подключен
      {
          temp=ds18b20_temperature(0);  //читаем температуру
          if (temp>1000){               //если датчик выдаёт больше 1000
             temp=4096-temp;            //отнимаем от данных 4096
             temp=-temp;                //и ставим знак "минус"
          } 
          printf("t=%i.%u\n\r",temp,temp%1); //выводим в порт
          sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1);    // записуем в массив для экрана температуру
          lcd_clear();                //чистим дисплей перед выводом
          lcd_puts(lcd_buffer);        //выводим масив на LCD
          delay_ms(500);              //ждём 500мс
      };
}

воскресенье, 26 февраля 2012 г.

Виртуальный COM на ATmega 8/48/88

В интернете есть очень много обучающих курсов по микроконтроллерам. Для обмена данными с ПК в них предлагают использовать COM порт ПК или виртуальный COM на дорогой и не очень удобной для монтажа в любительских условиях микросхеме FT232. Я для этих целей использую недорогое схемное решение на микроконтроллере ATmega8. С помощью этого устройства, также известного как CDC-232, можно создать виртуальный COM-порт на компьютере, который не имеет реального RS-232C. Порт будет доступен после подключения устройства и установки драйверов.
 Данное устройство поддерживает внутрисхемное программирование (лично я использовал для этого USBasp). Красный светодиод понижает напряжение от 5В до 3.3В и подает его на питание микроконтроллера. Ток при этом составляет около 10 мА, чего недостаточно для управления внешними цепями (устройство которое будет "общаться" с ПК должно иметь свой источник питания). При подключении к другим МК, следует объединить GND устройства и GND контроллера, а TхD и RxD соединить накрест. Резисторы R4 и R5 служат для для защиты выводов RxD и TxD.
Прошивку контроллера и драйвер для ОС можно скачать здесь.