3.6 Проектування процедури main()

Процедура main() повинна складатися з процедур ініціалізації, основного тіла програми та незкінченного циклу. Після ініціалізації всіх вузлів дозволяються усі переривання і ми очікуємо переривання від АЦП, при приході переривання ми аналізуємо флаг ADCFlag , і якщо він дорівнює 1, то ми переходимо до тіла основної програми. Зчитуємо значення АЦП, перетворюємо його, виводимо текстове повідомлення на РКІ. Далі ми аналізуємо чи змінилось значення АЦП, і якщо так, то забороняємо переривання, викликаємо процедури перетворення та відображення результату, відновлюємо дозвіл на переривання.

void main(void)

{

init_mega();

lcd_init(16);

#asm("sei")

while(1)

{


int A, Current;

A = ADCW;

if (ADCFlag)

{

ADCFlag = 0;

Current = 2 * A;

lcd_gotoxy(2,0);

lcd_putsf("Current, A:");

//lcd_gotoxy(0,1);

//lcd_putsf("PREVED AE-022!!!");

if (d != A)

{

#asm("cli")

bar (2000,0);

d = A;

convert_out (Current, 5, 1);

#asm("sei")

}

}

}

}


4. Лістінг програми

#include "interrupt.h"

#include "io.h"

#include "mega16.h"

#include "signal.h"

#include "delay.h"

#include "string.h"

#include <stdio.h>

#include <delay.h>

#include <lcd.h>

//############################################################################################

#define ADC_VREF_TYPE 0x40

#define Tmr0_Reload 0

#define PrescalerTmr0 5 // timer0 counts clk/256

#define TOIE0 0

#define ADSC 0

#define CLRBIT(x,y) ((x&=~(1<<y)))

#define SETBIT(x,y) ((x|=(1<<y)))

//############################################################################################

#asm

.equ __lcd_port=0x15 ;PORTC

#endasm

//############################################################################################

unsigned char ADCFlag = 0;

unsigned char TMR0Flag = 0;

int d;

//############################################################################################

interrupt [ADC_INT] void adc_isr(void)

{

ADCFlag = 1;

}

//############################################################################################

interrupt [TIM0_OVF] void TIMER0_OVF_interrupt(void)

{

TCNT0=Tmr0_Reload;

TMR0Flag = 1;

SETBIT(ADCSRA,6);

}

//############################################################################################

void init_mega (void)

{

DDRC = 0xFF;

DDRB = 0xFF;

DDRD = 0xFF;

ACSR = 0x80;

ADMUX = ADC_VREF_TYPE;

ADCSRA = 0xEE;

SFIOR = 0x80;

#asm("cli")

TIMSK |= (1 << TOIE0);

TCNT0=Tmr0_Reload;

TCCR0=PrescalerTmr0;

}

//############################################################################################

void convert_out (int a, char position_x, char position_y )

{

int a1, a2, a3, a4;

a1 = a/1000;

lcd_gotoxy(position_x,position_y);

lcd_putchar(a1 + 0x30);

a2 = (a - (a1 * 1000))/100;

lcd_gotoxy(position_x + 1,position_y);

lcd_putchar(0x2C);

lcd_gotoxy(position_x + 2,position_y);

lcd_putchar(a2 + 0x30);

a3 = (a - (a1 * 1000) - (a2 * 100))/10;

lcd_gotoxy(position_x + 3,position_y);

lcd_putchar(a3 + 0x30);

a4 = (a -(a1 * 1000) - (a2 * 100) - (a3 * 10));

lcd_gotoxy(position_x + 4,position_y);

lcd_putchar(a4 + 0x30);

}

//############################################################################################

void bar (char time, char posit)

{

lcd_clear();

lcd_gotoxy(posit,0);

lcd_putsf("Working.");

delay_ms(time);

lcd_clear();

lcd_putsf("Working..");

delay_ms(time);

lcd_clear();

lcd_putsf("Working...");

delay_ms(time);

lcd_clear();

lcd_putsf("Working....");

delay_ms(time);

lcd_clear();

}

//############################################################################################

void main(void)

{

init_mega();

lcd_init(16);

#asm("sei")

while(1)

{

int A, Current;

A = ADCW;

if (ADCFlag)

{

ADCFlag = 0;

Current = 2 * A;

lcd_gotoxy(2,0);

lcd_putsf("Current, A:");

//lcd_gotoxy(0,1);

//lcd_putsf("PREVED AE-022!!!");

if (d != A)

{

#asm("cli")

bar (2000,0);

d = A;

convert_out (Current, 5, 1);

#asm("sei")

}

}

}

}

//############################################################################################

Файл LCD.h

#ifndef _LCD_INCLUDED_

#define _LCD_INCLUDED_

#pragma used+

void _lcd_ready(void);

void _lcd_write_data(unsigned char data);

// write a byte to the LCD character generator or display RAM

void lcd_write_byte(unsigned char addr, unsigned char data);

// read a byte from the LCD character generator or display RAM

unsigned char lcd_read_byte(unsigned char addr);

// set the LCD display position x=0..39 y=0..3

void lcd_gotoxy(unsigned char x, unsigned char y);

// clear the LCD

void lcd_clear(void);

void lcd_putchar(char c);

// write the string str located in SRAM to the LCD

void lcd_puts(char *str);

// write the string str located in FLASH to the LCD

void lcd_putsf(char flash *str);

// initialize the LCD controller

unsigned char lcd_init(unsigned char lcd_columns);

#pragma used-

#pragma library lcd.lib

#endif


5. Рекомендаціі по розробці програмних та апаратних діагностичних засобів для перевірки працездатності пристрою

Для розробки програми варто використати достатньо легкий у освоєнні пакет CodeVisionAVR C Compiler . До його функцій входить така важлива риса, як наявність власного програматора. Для відпрацювання програми треба використовувати фірмовий пакет ATMEL AVR Studio.

Зібраний пристрій треба запрограмувати та відкалібрувати за допомогою точного зовнішнього амперметру, джерела живлення, навантаження. Калібрування треба проводити встановленням або зняттям перемичок на шунті (резистор R1 на схемі пристрою) виконаним друкованим способом. Встановити таким чином рівні показання приладу та амперметру при різних значеннях струму.


6. Проектування плати друкованої пристрою

На сьогоднішній день існує багато програмних пакетів спеціально розроблених для розведення та проектування друкованих плат, таких як PCad, OrCad, Eagle, але з метою закріплення знань з таких дисциплін як САПР, ТЕМЦ , метрології та т.п. вирішено розробити плату друковану ручним способом у пакеті Sprint-Layout4 з урахуванням усіх вимог та стандартів. Розмір ПД вирішено обрати таким самим як і розміри плати РКІ. Їх крепіжні отвори співпадають. У корпусі вони кріпляться друг за другом за допомогою гвинтів.


Висновок

У даному курсовому проекту ми детально розібрали устрій, алгорітм роботи та способи програмування мікроконтролерами фірми ATMEL. На прикладі МК ATmega16 розробили пристрій вимірювання струму до 2А. Відладили програму, розробили принципову схему та плату друковану. Зібрали пристрій на макетній платі та опробували його працездатність.


Література

1. Программирование на языке С для AVR и PIC микроконтроллеров. / Сост. Ю.А.Шпак – К.: «МК-Пресс» , 2006. – 400 с., ил

2. Микроконтроллеры AVR семейств Tiny и Mega фирмы ATMEL, 2-е изд., стер. – М.: Издательский дом «Додека-ХХІ», 2005. – 560с.


Вид со стороны А (деталей)


Вид со стороны В

 


Схема расположения элементов (вид сверху)


Информация о работе «Система вимірника струмів»
Раздел: Коммуникации и связь
Количество знаков с пробелами: 20027
Количество таблиц: 0
Количество изображений: 15

Похожие работы

Скачать
41792
1
5

... вище, вони не можуть складати конкуренції для нової розробки, оскільки мають недосяжні для українського фермера ціни. 3. Розробка структурних схем 3.1 Розробка структурної схеми автоматизованої системи вимірювання удоїв та управління доїльними апаратами Для вирішення поставлених задач розробимо структурну схему автоматизованої системи вимірювання удоїв і управління доїльними апаратами. ...

Скачать
90637
12
4

... ) Вимірник відстані до місця пошкодження кабелю (ЦР0200, Щ4120) Амперметри, вольтметри (аналогові, кутові) Тестер (ЭА 0300-3, ЭВ 0300-3)   Аналіз техніко - економічних показників роботи підприємства. ВАТ Уманський завод "Мегомметр" здійснює облік готової продукції за фактичною собівартістю. Реалізація продукції (робіт, послуг) і її виручка враховується при формуванні фінансових результатів ...

Скачать
11711
1
1

... приладів. 2. РОЗРАХУНКОВА ЧАСТИНА 2.1 Вихідні данні Ном. варіанту Тип приладу Струм, мкА Внутр. R, Ом Диод R1, Ом R2, Ом 25 М592М 250 600 Д9Б 800 11 2.2 Завдання Виконати синтез багатомежового електровимірювального приладу, призначеного для виміру: -  постійної напруги на межах 3; 6; 15; 60; 150; 300 В; -  постійного струму на межах 0.06; 0.6; 6; 60; 600 мА; -  змі ...

Скачать
31848
1
0

... і питання і ідеальні відповіді на них зведені в таблицю 1. Пункти в таблиці 1 і в древі рішення нерозривно зв'язані і є засланнями один на одного. Висновок: Урок креативного типу, заснований на методі евристичних питань, розглянуті в даному дидактичному проекті, на мою думку, неоднозначні. З одного боку вони дозволяють розвинути у учнів розвивати творчий підхід до рішення будь-якого питання, у ...

0 комментариев


Наверх