Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
AlTe r
0 / 0 / 0
Регистрация: 03.12.2018
Сообщений: 7
1

Терморегулятор на AVR

17.12.2018, 17:53. Просмотров 151. Ответов 4
Метки нет (Все метки)

Создал программу для proteus терморегулятор. Но похоже где-то ошибся, помогите найти и исправить ошибки. При простейшей проверке, вывод на дисплей не работает. Заниматься только начинаю, многое что ещё не понимаю. Что не так собрал? микроконтроллер atmega128. схема proteus приложена.
Заранее спасибо.
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
/*
 
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
 
 
// для дисплея
#define e1 PORTD|=0b00001000 // установка линии E в 1
#define e0 PORTD&=0b11110111 // установка линии E в 0
#define rs1 PORTD|=0b00000100 // установка линии RS в 1 (данные)
#define rs0 PORTD&=0b11111011 // установка линии RS в 0 (команда)
 
//для кнопок
#define BUTTONPORT PORTA
#define BUTTONPORT1 PORTA.0
#define BUTTONPORT2 PORTA.1
#define BUTTONPIN PINA
#define BUTTONPIN1 PINA0
#define BUTTONPIN2 PINC0
#define BUTTONDDR DDRA
#define BUTTONDDR1 DDRA.0
#define BUTTONDDR2 DDRA.1
 
 
 
void port_ini(void)
{
    PORTD=0x00;
    DDRD=0xFF;
    DDRA = 0x00;
    PORTA = 0b00000011;
    
    PORTB=0x00;
    DDRB=0b01000000;
    
 
}
 
void sendhalfbyte(unsigned char c)
{
    c<<=4;
    e1; //включаем линию Е
    _delay_us(50);
    PORTD&=0b00001111; //стираем информацию на входах DB4-DB7, остальное не трогаем
    PORTD|=c;
    e0; //выключаем линию Е
    _delay_us(40);
}
 
void sendbyte(unsigned char c, unsigned char mode) 
{
    if (mode==0) rs0;
    else rs1;
    unsigned char hc=0;
    hc=c>>4;
    sendhalfbyte(hc); sendhalfbyte(c);
    
}
 
void clearlcd(void) //очистка дисплея
{
    sendbyte(0b00000001, 0);
    _delay_us(1500);
}
 
 
void sendchar(unsigned char c) // посимвольный вывод
{ 
    sendbyte(c,1);
    
}
 
void setpos(unsigned char x, unsigned y) // переход на позицию [от 0 до 16] и стороку [0 и 1]
{
  char adress;
  adress=(0x40*y+x)|0b10000000;
  sendbyte(adress, 0);
}
 
void LCD_ini(void)
{
    _delay_ms(15);
    sendhalfbyte(0b00000011);
    _delay_ms(4);
    sendhalfbyte(0b00000011);
    _delay_us(100);
    sendhalfbyte(0b00000011);
    _delay_ms(1);
    sendhalfbyte(0b00000010);
    _delay_ms(1);
    sendbyte(0b00101000, 0); //4бит-режим (DL=0) и 2 линии (N=1)
    _delay_ms(1);
    sendbyte(0b00001100, 0); //включаем изображение на дисплее (D=1), курсоры никакие не включаем (C=0, B=0)
    _delay_ms(1);
     sendbyte(0b00000110, 0); //курсор (хоть он у нас и невидимый) будет двигаться влево
     _delay_ms(1);
}
 
void str_lcd (char str1[]) // постороковый вывод
{
    wchar_t n;
    for(n=0;str1[n]!='\0';n++)
    sendchar(str1[n]);
}  
 
void ADC_Init(void)
{
  ADCSRA |= (1<<ADEN) // Разрешение использования АЦП
  |(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);//Делитель 128 = 64 кГц
  ADMUX |= (1<<REFS1)|(1<<REFS0); //Внутренний Источник ОН 2,56в, вход ADC0
}
 
unsigned int ADC_convert (void)
{
  ADCSRA |= (1<<ADSC); //Начинаем преобразование
  
  return (unsigned int) ADC;
}  
 
 
 
 
int main(void)
{
    port_ini();
    LCD_ini();
    clearlcd();
    ADC_Init();
    
    
    unsigned int adc_value;
    float n;
    int s = 1;
    
    
    while(1)
    {
        adc_value = ADC_convert(); //Вызовем преобразование
        setpos(0,0);
        sendchar(adc_value/1000+0x30);//Преобразуем число в код числа
        sendchar((adc_value%1000)/100+0x30);//Преобразуем число в код числа
        sendchar((adc_value%100)/10+0x30);//Преобразуем число в код числа
        sendchar(adc_value%10+0x30);//Преобразуем число в код числа
        _delay_ms(500);
        
        
        setpos(0,1);
         n= (float) adc_value / 400;
         sendchar((unsigned char) n +0x30);//Преобразуем число в код числа
         sendchar('.');//Преобразуем число в код числа
         sendchar(((unsigned char) (n*10))%10 +0x30);//Преобразуем число в код числа
         sendchar(((unsigned char) (n*100))%10 +0x30);//Преобразуем число в код числа
         _delay_ms(500);
         
         if((!(BUTTONPIN&(1<<BUTTONPIN1))) && (s<10))//Кнопка 1 нажата
         {
             s++;
         }  
         
         if((!(BUTTONPIN&(1<<BUTTONPIN2))) && (s>1))//Кнопка 2 нажата
         {
             s--;
         }           
         
         // ШИМ
         OCR0=245/s;
         TCCR0=0b01111011;
         TIMSK|=(1<<1);
         
          
      
    }
}
0
Вложения
Тип файла: rar gradysnik — копия.rar (17.2 Кб, 2 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2018, 17:53
Ответы с готовыми решениями:

Аквариумный терморегулятор
Собрал вот такой терморегулятор http://pakhom.weebly.com/r10-2012.html Всё работает без проблем,...

Терморегулятор на Attiny2313 + терморезисторе
Прочёл статью http://iosyitistromyss.ru/avr-uchebnyj- ... atora.html Решил починить давно...

AVR AVRISP STK500 V3.0 USB ISP Programmer for AVR IC
Люди помогите плз. не могу разобраться. приобрел этот чудный девайс (AVR AVRISP STK500 V3.0 USB...

Анализ стека AVR / AVR stack analysis
Привет! Уперся я в стек, и решил понять что почем. Нашел вот такой вот скриптик:...

AVR Atmega324PU не прошивается AVR ISP Mk2
Добрый день. На плату впаян данный микроконтроллер в корпусе tqfp. При подключении программатора...

4
gogaze
2 / 2 / 3
Регистрация: 09.12.2017
Сообщений: 126
14.01.2019, 12:56 2
Ну во-первых - если я правильно понял, то за основу взят урок на narod stream?
Программа написана для Atmega8, а вы прислюнили ее для Atmega128? практически ничего не меняя.
Начнем с того, что АЦП в атмеге 128-й на порту F.
Автор видеоурока подробно разжевал, как из даташита на микроконтроллер выбирать и устанавливать параметры.
Пока все. Вникайте.
0
Voland_
1677 / 1022 / 97
Регистрация: 04.01.2010
Сообщений: 3,426
15.01.2019, 09:55 3
Цитата Сообщение от gogaze Посмотреть сообщение
взят урок на narod stream?
Цитата Сообщение от AlTe r Посмотреть сообщение
#define e0 PORTD&=0b11110111 // установка линии E в 0
и что, вот такому учат в "уроках"? Это ж жестяк какой-то
0
gogaze
2 / 2 / 3
Регистрация: 09.12.2017
Сообщений: 126
15.01.2019, 10:57 4
Цитата Сообщение от Voland_ Посмотреть сообщение
и что, вот такому учат в "уроках"? Это ж жестяк какой-то
Сам многому там научился. В архиве исходники урока про АЦП и дисплей 1602 + проект в Proteus
Ссылку не даю, все равно удалят.
0
Вложения
Тип файла: zip MyADCISRLCD.zip (64.8 Кб, 0 просмотров)
gogaze
2 / 2 / 3
Регистрация: 09.12.2017
Сообщений: 126
15.01.2019, 10:58 5
Можешь сравнить со своим кодом.
0
15.01.2019, 10:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2019, 10:58

AVR Studio 6 и AVR Toolchain вопросы!
Всем доброго времени суток. Решил я написать софтинку в новой студии от Атмела AVR Studyo 6. Все...

Как подружить AVR+AVR?
Приветствую Вас уважаемые форумчане! Требуется связать 2 AVR-ки, по классической схеме Master -&gt;...

AVR Studio 6 Avr simulator
Подскажите каким образом стартануть прогу в avr symulator с адреса boottooder (atmega8a, 0x0F80)....


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru