Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 26.05.2012
Сообщений: 8
1

Работа с LCD (ATMega32, AVR Studio)

18.12.2014, 17:43. Показов 2166. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте , у появилась проблема с программированием в AVR studio , а именно нужно создать термометр с выводом данных на LCD, вывести данные с термометра на ножки микроконтроллера, я вроде разобрался, а как теперь перевести их на LCD не знаю(, данные а ножках представлены в двоичном коде, язык программирования Си, микроконтроллер ATMega32.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.12.2014, 17:43
Ответы с готовыми решениями:

Atmega32. AVR Studio. Объявление типа Long Int
Добрый день. Программирую на си в AVR Studio 6. Возникла проблема в том, что тип long int...

Работа SD/MMC карты с микроконтроллером AVR ATMega32
Добрый день! Мне нужна помощь по данной работе. Пожалуйста расскажите как её сделать через...

CAVR против AVR Studio, что не так в программе под AVR Studio
Проблема такая, есть исходник, если его компилировать в CAVR заливаю в МК все работает, если этот...

V-USB на AVR ATmega32
Всем привет!) такое у меня случилось.. ставлю прошивку на AVR ATmega 32 c V-USB как HID...

4
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
18.12.2014, 20:18 2
Цитата Сообщение от Антоныч Посмотреть сообщение
я вроде разобрался
Так выкладывайте код, тип lcd итд
0
0 / 0 / 0
Регистрация: 26.05.2012
Сообщений: 8
19.12.2014, 01:04  [ТС] 3
вот код программы термометра с выводом двоичного кода на порт D ,
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
 
#define SKIP_ROM 0xCC // Пропустить индентификацию
#define CONVERT_T 0x44 // Измерить температуру
#define READ_SCRATCHPAD 0xBE // Прочитать измеренное
 
//определяем порт и бит к которому подключено устройство
#define OWI_PORT PORTD
#define OWI_DDR DDRD
#define OWI_PIN PIND
#define OWI_BIT 0
 
#define OWI_LOW OWI_DDR |= 1<<OWI_BIT//притягиваем шину к 0
#define OWI_HIGH OWI_DDR &= ~(1<<OWI_BIT)//отпускаем шину
 
//функция определяет есть ли устройство на шине
char OWI_find(void)
{
char SR0=SREG;//сохраняем значение регистра
cli(); //запрещаем прерывания
char device;
OWI_LOW; //притягиваем шину к 0
_delay_us(485);//ждем минимум 480мкс
OWI_HIGH;//отпускаем шину
_delay_us(65);//ждем минимум 60мкс и смотрим что на шине
 
if((OWI_PIN & (1<<OWI_BIT)) ==0x00)//смотрим есть ли ответ
device = 1; //на шине есть устройство
else
device = 0; //на шине нет устройства
SREG=SR0;//возвращаем первонач знач регистра
_delay_us(420);//ждем оставшееся время до 480мкс
return device;
}
 
// функция отправляет бит на устройство
void OWI_write_bit (char bit)
{
char SR1=SREG;//сохраняем значение регистра
cli(); //запрещаем прерывания
OWI_LOW;//логический "0"
_delay_us(2);
if(bit) OWI_HIGH; //отпускаем шину
_delay_us(65);
OWI_HIGH; //отпускаем шину
SREG=SR1;//возвращаем первоначальное значение регистра
}
 
//функция посылает байт на устройство
void OWI_write_byte(unsigned char c)
{
char i;
for(i = 0; i < 8; i++)//в цикле посылаем побитно
{
if((c & (1<<i)) == 1<<i)//если бит=1 посылаем 1
OWI_write_bit(1);
else//иначе посылаем 0
OWI_write_bit(0);
}
}
 
//функция чтения одного бита
char OWI_read_bit (void)
{
char SR2=SREG;//сохраняем значение регистра
cli(); //запрещаем прерывания
char OWI_rbit; //переменная хранения бита
OWI_LOW;//логический "0"
_delay_us(2);
OWI_HIGH; //отпускаем шину
_delay_us(13);
OWI_rbit=(OWI_PIN & (1<<OWI_BIT))>>OWI_BIT;
_delay_us(45);//задержка до окончания тайм-слота
SREG=SR2;//возвращаем первоначальное значение регистра
return OWI_rbit;
}
 
//функция читает один байт с устройства 1-wire
unsigned char OWI_read_byte()
{
char data=0,i;
for(i = 0; i < 8; i++) //в цикле смотрим что на шине и сохраняем значение
data|= OWI_read_bit()<<i;//читаем очередной бит
return data;
}
 
//функция преобразует полученные с датчика 18b20 данные в температуру
int  temp_18b20()
{
unsigned char B;
unsigned int ds18_temp=0;
if(OWI_find()==1)//если есть устройство на шине
{
OWI_write_byte(SKIP_ROM);//пропустить ROM код, мы знаем, что у нас одно устройство или передаем всем
OWI_write_byte(CONVERT_T);//преобразовать температуру
_delay_ms(750);//преобразование в 12 битном режиме занимает 750ms
OWI_find();//снова посылаем Presence и Reset
OWI_write_byte(SKIP_ROM);
OWI_write_byte(READ_SCRATCHPAD);//передать байты ведущему(у 18b20 в первых двух содержится температура)
 
B = OWI_read_byte(); //читаем бит LS
ds18_temp = OWI_read_byte(); //читаем бит MS
ds18_temp = (ds18_temp<<8)|B;//уладываем биты в последовательности MS потом LS
}
// else return можно сделать возврат числа что датчика нет
return ds18_temp;//возвращаем int (MS,LS)
}
 
//перевод инф от temp_18b20() в удобный вид
char convert (unsigned int td)
{
char dat=td>>4;//сдвиг и отсечение старшего байта
return dat;// (знак,2в6,2в5,2в4,2в3,2в2,2в1,2в0)
}
 
int main (void)
{
DDRD=0x00;
PORTD=0x00;
char T=0;
 
DDRA=0xFF;
while(1)
{ T=convert(temp_18b20());
PORTA=T;
}
}
теперь его надо вывести (это двоичное число температуры) в десятичном виде на LCD HD44780,
0
194 / 154 / 23
Регистрация: 16.08.2013
Сообщений: 738
19.12.2014, 15:40 4
Полученное число преобразуешь в двоично-десятичное и прибавляешь переводной коэф (для преобразования числа в код символа) и отправляешь на дисплей. НО предварительно нужно настроить дисплей..
1
0 / 0 / 0
Регистрация: 26.05.2012
Сообщений: 8
21.12.2014, 09:40  [ТС] 5
ну или можно использовать этот только нужно как-то вставить в него lcd (как не знаю)
Кликните здесь для просмотра всего текста

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define SKIP_ROM 0xCC // Пропустить индентификацию
#define CONVERT_T 0x44 // Измерить температуру
#define READ_SCRATCHPAD 0xBE // Прочитать измеренное

//определяем порт и бит к которому подключено устройство
#define OWI_PORT PORTD
#define OWI_DDR DDRD
#define OWI_PIN PIND
#define OWI_BIT 0

#define OWI_LOW OWI_DDR |= 1<<OWI_BIT//притягиваем шину к 0
#define OWI_HIGH OWI_DDR &= ~(1<<OWI_BIT)//отпускаем шину

//функция определяет есть ли устройство на шине
char OWI_find(void)
{
char SR0=SREG;//сохраняем значение регистра
cli(); //запрещаем прерывания
char device;
OWI_LOW; //притягиваем шину к 0
_delay_us(485);//ждем минимум 480мкс
OWI_HIGH;//отпускаем шину
_delay_us(65);//ждем минимум 60мкс и смотрим что на шине

if((OWI_PIN & (1<<OWI_BIT)) ==0x00)//смотрим есть ли ответ
device = 1; //на шине есть устройство
else
device = 0; //на шине нет устройства
SREG=SR0;//возвращаем первонач знач регистра
_delay_us(420);//ждем оставшееся время до 480мкс
return device;
}

// функция отправляет бит на устройство
void OWI_write_bit (char bit)
{
char SR1=SREG;//сохраняем значение регистра
cli(); //запрещаем прерывания
OWI_LOW;//логический "0"
_delay_us(2);
if(bit) OWI_HIGH; //отпускаем шину
_delay_us(65);
OWI_HIGH; //отпускаем шину
SREG=SR1;//возвращаем первонач знач регистра
}

//функция посылает байт на устройство
void OWI_write_byte(unsigned char c)
{
char i;
for(i = 0; i < 8; i++)//в цикле посылаем побитно
{
if((c & (1<<i)) == 1<<i)//если бит=1 посылаем 1
OWI_write_bit(1);
else//иначе посылаем 0
OWI_write_bit(0);
}
}

//функция чтения одного бита
char OWI_read_bit (void)
{
char SR2=SREG;//сохраняем значение регистра
cli(); //запрещаем прерывания
char OWI_rbit; //переменная хранения бита
OWI_LOW;//логический "0"
_delay_us(2);
OWI_HIGH; //отпускаем шину
_delay_us(13);
OWI_rbit=(OWI_PIN & (1<<OWI_BIT))>>OWI_BIT;//строчка исправлена 05.2014 (исправлена ошибка)
_delay_us(45);//задержка до окончания тайм-слота
SREG=SR2;//возвращаем первонач знач регистра
return OWI_rbit;
}

//функция читает один байт с устройства 1-wire
unsigned char OWI_read_byte()
{
char data=0,i;
for(i = 0; i < 8; i++) //в цикле смотрим что на шине и сохраняем значение
data|= OWI_read_bit()<<i;//читаем очередной бит
return data;
}

//функция преобразует полученные с датчика 18b20 данные в температуру
int temp_18b20()
{
unsigned char B;
unsigned int ds18_temp=0;
if(OWI_find()==1)//если есть устройство на шине
{
OWI_write_byte(SKIP_ROM);//пропустить ROM код, мы знаем, что у нас одно устройство или передаем всем
OWI_write_byte(CONVERT_T);//преобразовать температуру
_delay_ms(750);//преобразование в 12 битном режиме занимает 750ms
OWI_find();//снова посылаем Presence и Reset
OWI_write_byte(SKIP_ROM);
OWI_write_byte(READ_SCRATCHPAD);//передать байты ведущему(у 18b20 в первых двух содержится температура)

B = OWI_read_byte(); //читаем бит LS
ds18_temp = OWI_read_byte(); //читаем бит MS
ds18_temp = (ds18_temp<<8)|B;//уладываем биты в последовательности MS потом LS
}
// else return можно сделать возврат числа что датчика нет
return ds18_temp;//возвращаем int (MS,LS)
}

//перевод инф от temp_18b20() в удобный вид
char convert (unsigned int td)
{
char dat=td>>4;//сдвиг и отсечение старшего байта
return dat;// (знак,2в6,2в5,2в4,2в3,2в2,2в1,2в0)
}

int main (void)
{
DDRD=0x00;
PORTD=0x00;
char T=0;

DDRA=0xFF;
while(1)
{ T=convert(temp_18b20());
PORTA=T;
}
}
0
21.12.2014, 09:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.12.2014, 09:40
Помогаю со студенческими работами здесь

Работа с ATMega128 . AVR studio
Всем привет! Я написал код на ассемблере , но не знаю как написать точно такой же код на C....

AVR Studio. Работа с байтами
Имеются старший и младший 8 битных байта. Их нужно преобразовать в один 16 битный байт и сравнить с...

AVR LCD
Решил вынести в отдельную тему. неожиданно появился глюк с LCD (WH-1602B-YYH-CKT). Неожиданно...

AVR + SHT10 + LCD
Мое почтение! Вопрос адресован знающим товарищам, кому не лень разбираться в чужом коде и кто...

K-Line -> AVR + LCD
авто диагностируется мастеркитовской приблудой, которая читает по к-линии данные и передает через...

AVR + LCD + Bluetooth + MicroSD
Здравствуйте. Есть куча запчастей, мозгов и свободного времени и нет опыта практического....

Помогите разобраться с lcd в bascom avr
Помогите разобраться! Подключил рабочий МЭЛТ mt-16s2d к atmego32 по 4 битам, а он не реагирует на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru