Общие сведения. Функциональное назначение используемых программ
Для выполнения курсовой работы были использованы следующие программные средства: компилятор языка С для микроконтроллеров AVR (CodeVisionAVR), генератор начального кода программы CodeWizard AVR с необходимой конфигурацией периферии МК (AVR Studio).
CodeVision AVR представляет собой кросс-компилятор языка С, графическую оболочку и автоматический генератор шаблонов программ, ориентированные на работу с семейством микроконтроллеров AVR фирмы Atmel.
Программа представляет собой 32-разрядное приложение для работы в операционных системах Windows 95, 98, Me, NT4.0, 2000, XP.
Кросс-компилятор включает в себя практически все элементы, соответствующие стандарту ANSI. Кроме того, в компилятор включены дополнительные возможности, ориентированные на использование архитектурных особенностей микроконтроллеров AVR и встроенных систем в целом.
Объектные файлы COFF позволяют осуществлять отладку программ с просмотром содержимого переменных. Для этого следует применять свободно распространяемый фирмой Atmel (www.atmel.com) отладчик AVR Studio.
|
|
Для отладки систем, использующих последовательную передачу данных, в графической оболочке имеется встроенная программа Terminal.
Кроме стандартных библиотек языка С, компилятор имеет библиотеки для работы с:
ЖКИ индикаторами со встроенным контроллером;
шиной I2C фирмы Philips;
датчиком температуры LM75 фирмы National Semiconductor;
часами реального времени PC8536 и PC8583 фирмы Philips, DS1302 и DS1307 фирмы Dallas Semiconductor;
однопроводным протоколом фирмы Dallas Semiconductor;
датчиками температуры DS1820 и DS1822 фирмы Dallas Semiconductor;
датчиком температуры/термостатом DS1621 фирмы Dallas Semiconductor;
памятью EEPROM DS2430 и DS2433 фирмы Dallas Semiconductor;
шиной SPI;
управлением режимами пониженного потребления энергии;
временными задержками;
преобразованием кодов Грэя.
В CodeVision AVR имеется автоматический генератор шаблонов программ, который позволяет в течение считанных минут получить готовый код для следующих функций:
настройка доступа к внешней памяти;
определение источника прерывания Reset;
инициализация портов ввода/вывода;
инициализация внешних прерываний;
инициализация таймеров/счетчиков;
инициализация сторожевого таймера;
инициализация UART;
инициализация аналогового компаратора;
инициализация встроенного АЦП;
инициализация интерфейса SPI;
инициализация поддерживаемых библиотеками CodeVision AVR микросхем, работающих с однопроводным интерфейсом и шиной I2C;
инициализация модуля ЖКИ со встроенным контроллером.
Кроме того, среда CodeVision AVR включает в себя программное обеспечение для работы с различными AVR-программаторами. После компиляции исходной программы на языке С полученный код может быть сразу записан в память программ микроконтроллера.
|
|
Реализация
Основные компоненты:
1. Микроконтроллер ATmega128
2. Датчик температура DS18B20
3. ЖКИ
Выделим следующие этапы в разработке программного обеспечения термометра:
1. Получение данных с датчика.
2. Передача данных на ЖКИ.
3. Обработка прерывания.
4. Передача данных на ЖКИ.
1. Получение данных с датчика:
Данные получаем с температурного датчика DS18B20, подключенного на порт В.
2. Передача данных на ЖКИ:
Данные выводим на ЖК индикатор, подключенный на порт А.
3. Обработка прерывания:
Промежуток между измерениями 500 мс.
В процессе разработки проекта возникли следующие вопросы:
1. Каким образом подключить датчик к шине 1-Wire?
2. Как зашифрована температура, передаваемая датчиком?
3. Какие специализированные команды необходимо применять для опроса датчика?
Запуск и выполнение
Скомпилированная программа представляет собой файл типа cof, который прошиваем на микроконтроллер ATmega 128 семейства AVR.
Соединяем компоненты рабочей модели прибора, получаем сигнал с температурного датчика, считываем температуру окружающей среды.
Список используемой литературы
1. Белов А.В. Конструирование устройств на микроконтроллерах. - СПб.: Наука и Техника, 2005. - 256 С.
2. Бородин В.Б., Калинин А.В. Системы на микроконтроллерах и БИС программируемой логики - М.: Издательство ЭКОМ, 2002. - 400 с.: илл.
3. Гребнев В.В. Микроконтроллеры семейства AVR фирмы Atmel М.: ИП РадиоСофт, 2002. - 176 с.
4. Евстифеев А.В. Микроконтроллеры AVR семейств Tiny и Mega фирмы "ATMEL" - М.: Издательский дом "Додека-ХХI", 2004. - 560 с.
5. Шпак Ю.А. Программирование на языке Си для AVR и PIC микроконтроллеров. - К: ”МК-Пресс", 2006. - 400 С.
Приложение
Код программы
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.8 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s. r. l.
http://www.hpinfotech.com
Project: Digital Thermometer
Version: 1
Date: 24.11.2009
Author: Marina
Company:
Comments:
Chip type: ATmega128
Program type: Application
Clock frequency: 7,000000 MHz
Memory model: Small
External SRAM size: 0
Data Stack size: 1024
*****************************************************/
#include <mega128. h>
#include <delay. h>
#include <stdio. h>
#include <lcd. h> // Alphanumeric LCD Module functions
#asm // сообщаем куда подключен датчик
. equ __w1_port=0x1B; PORTA
. equ __w1_bit=0
#endasm
// сообщаем куда подключён ЖКИ
#asm
. equ __lcd_port=0x15; PORTC
#endasm
#include <1wire. h> // 1 Wire Bus functions
#include <ds18b20. h>
/* >>>>>>>>>>>>>>>>maximum number of DS18B20 connected to the 1 Wire bus */
#define MAX_DEVICES 8
// Declare your global variables here
/* >>>>>>>>>>>>>>DS18B20 devices ROM code storage area */
unsigned char devices;
unsigned char rom_code [MAX_DEVICES] [9];
/*>>>>>>>>>*/char lcd_buffer [33];
void main (void)
{ int temp;
unsigned int a;
double d;
UCSR0A=0x00;
UCSR0B=0x10;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x2D;
// >>>>>>>>>>>>>>>> Declare your local variables here
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=Out Func6= Out Func5= Out Func4= Out Func3= Out Func2= Out Func1= Out Func0= Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0xFF;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=T
PORTB=0x00;
DDRB=0x02;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Port E initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTE=0x00;
DDRE=0x00;
// Port F initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTF=0x00;
DDRF=0x00;
// Port G initialization
// Func4=In Func3=In Func2=In Func1=In Func0=In
// State4=T State3=T State2=T State1=T State0=T
PORTG=0x00;
DDRG=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
|
|
ASSR=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: Timer 3 Stopped
// Mode: Normal top=FFFFh
// Noise Canceler: Off
// Input Capture on Falling Edge
// OC3A output: Discon.
// OC3B output: Discon.
// OC3C output: Discon.
// Timer 3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;
// External Interrupt (s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;
// Timer (s) /Counter (s) Interrupt (s) initialization
TIMSK=0x00;
ETIMSK=0x00;
// USART0 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART0 Receiver: On
// USART0 Transmitter: Off
// USART0 Mode: Asynchronous
// USART0 Baud Rate: 57600
UCSR0A=0x00;
UCSR0B=0x18;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x07;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
PORTB=0x00;
DDRB=0x01;
// LCD module initialization
lcd_init (16);
w1_init ();
/*>>>>>>>>>>>>>*/
delay_ms (250);
lcd_clear ();
/* detecting device */
devices=w1_search (0xF0,rom_code);
delay_ms (250);
sprintf (lcd_buffer,"%u DS18B20\nDevice detected", devices);
lcd_puts (lcd_buffer);
delay_ms (250);
lcd_clear ();
while (1)
{
temp=ds18b20_temperature (0); // чтение температуры с датчика
if (temp>1000) { // преобразование отрицательной температуры
temp=4096-temp;
temp=-temp;
}
sprintf (lcd_buffer,"t=%i.%u\xdfC",temp,temp%1); // запись температуры в массив для вывода на экран
lcd_clear (); // очистка экрана
lcd_puts (lcd_buffer); // вывод температуры
delay_ms (500); // ожидание 500 мс перед следующим измерением
a = ADCW;
d = (double) a / 1024 * 5;
printf ("%f\r", a);
};
}