Конструкторская часть

 

Общие сведения. Функциональное назначение используемых программ

 

Для выполнения курсовой работы были использованы следующие программные средства: компилятор языка С для микроконтроллеров 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);

};

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: