Форум программистов, компьютерный форум, киберфорум
Наши страницы

C для начинающих

Войти
Регистрация
Восстановить пароль
 
Scrypto
66 / 67 / 14
Регистрация: 08.02.2013
Сообщений: 363
#1

Посмотрите код на предмет оптимизации. (вывод на семисегментные индикаторы) - C (СИ)

23.09.2016, 21:17. Просмотров 259. Ответов 1
Метки нет (Все метки)

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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
/*
* 7Segment.c
*
* Created: 10.09.2016 14:51:07
* Author : igora
*/
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
//Вектор прерывания по таймеру
ISR( TIMER2_COMP_vect )
{
        //Выводим вольтаж
        PrintLedVolt();
}
//Разряды вольт
volatile int RV1 = 0;
volatile int RV2 = 0;
volatile int RV3 = 0;
volatile int RV4 = 0;
// точка вольт
volatile int Vdot = 0;
 
//Разряды ампер
volatile int RA1 = 0;
volatile int RA2 = 0;
volatile int RA3 = 0;
volatile int RA4 = 0;
// точка ампер
volatile int Adot = 0;
 
//Цифры без точки 16чная система
const unsigned char digits[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//Время перехода
const int perehod = 3;
//Задаем начальные установки
void preset(){
    TIMSK = (1<<OCIE2);  // timer2: Режим перехода по совпадению включен
    TCCR2 = (1<<WGM21);  // Устанавливаем режим перехода в прерывание по совпадению
    TCCR2|= (1<<CS22) |(1<<CS21)| (1<<CS20); // делитель основной частоты 1/1024
    OCR2  = 128;  //Число при котором уходит в вектор прерывания
    sei();                // выставляем бит общего разрешения прерываний
    //ADCSRA
    ADCSRA |= (1<<ADEN) //Включаем АЦП
    |(1<<ADPS2)|(1<<ADPS1); //Делитель на 64
    //ADMUX
    ADMUX |= (1<<REFS0) | (1<<REFS0); //Опорное напряжение 
    DDRD = 0xFF;
    PORTD = 0x00;
    // ноги для управления катодами семисегментными индикаторами
    DDRC |=(1<<5) | (1<<4) | (1<<3) | (1<<2) | (1<<1);
    DDRB |=(1<<2) | (1<<1) | (1<<0);
}
//Функция расчета напряжения
float ReadADC(){
    ADMUX |= (0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0); //Строка только для понятия, какая нога зайдействована как АЦП
    _delay_us(10);
    float Vtmp = 0;
    //Вычисляем средне арифметическое для значения ADC (50 проходов)
    for(int i = 0; i<50; i++){
        ADCSRA |= (1<<ADSC); // Начало преобразования
        while(ADCSRA &(1<<ADSC)); // Ждем конец преобразования
        Vtmp += ADC;
    }
    return Vtmp/50;
}
//Функция разбиения дробного числа на разряды для вольт
void PutRazryadVolt( double volt){
    int y = volt;
    double z = volt-y;
 
    if(y>9){
        RV1 = y/10;
        RV2 = y%10;
        int RD = z*100;
        Vdot=2;
        RV3 = RD/10;
        RV4 = RD%10;
    }
    else if(y<10 && y>=1){
        RV1 = y;
        Vdot = 1;
        int RD  = z*1000;
        RV2 = RD/100;
        RD = RD-(100*RV2);
        RV3 = RD/10;
        RV4 = RD%10;
    }
    else{
        RV1 = 0;
        Vdot = 1;
        int RD  = z*1000;
        RV2 = RD/100;
        RD = RD-(100*RV2);
        RV3 = RD/10;
        RV4 = RD%10;
    }
}
//Функция разбиения дробного числа на разряды для ампер
void PutRazryadAmp( double amp){
    int y = amp;
    double z = amp-y;
 
    if(y>9){
        RA1 = y/10;
        RA2 = y%10;
        int RD = z*100;
        Adot=2;
        RA3 = RD/10;
        RA4 = RD%10;
    }
    else if(y<10 && y>1){
        RA1 = y;
        Adot = 1;
        int RD  = z*1000;
        RA2 = RD/100;
        RD = RD-(100*RA2);
        RA3 = RD/10;
        RA4 = RD%10;
    }
    else{
        RA1 = 0;
        Adot = 1;
        int RD  = z*1000;
        RA2 = RD/100;
        RD = RD-(100*RA2);
        RA3 = RD/10;
        RA4 = RD%10;
    }
}
//Display 1
//PORTC От 2 ноги до 5
//Display 2
//PORTC 1 нога PORTB 0-2 нога
//Функция вывода дробного числа на семисегментный индикатор для вольт
void PrintLedVolt(){
    
    if (Vdot == 2){
        PORTD=0x00;
        //display 1
        PORTC =(1<<2);
        PORTD = digits[RV1];
        _delay_ms(perehod);
        PORTC = (1<<3);
        PORTD = digits[RV2];
        PORTD |= (1<<7); //Добавляем точку к разряду
        _delay_ms(perehod);
        PORTC = (1<<4);
        PORTD = digits[RV3];
        _delay_ms(perehod);
        PORTC = (1<<5);
        PORTD = digits[RV4];
        _delay_ms(1);// Задержка меньше основной, для того, чтобы выровнять яркость разрядов
    }
    else{
        //display 1
        PORTD=0x00;
        PORTC =(1<<2);
        PORTD = digits[RV1];
        PORTD |= (1<<7); //Добавляем точку к разряду
        _delay_ms(perehod);
        PORTC = (1<<3);
        PORTD = digits[RV2];
        _delay_ms(perehod);
        PORTC = (1<<4);
        PORTD = digits[RV3];
        _delay_ms(perehod);
        PORTC = (1<<5);
        PORTD = digits[RV4];
        _delay_ms(1);// Задержка меньше основной, для того, чтобы выровнять яркость разрядов
    }
}
//Функция вывода дробного числа на семисегментный индикатор для ампер
void PrintLedAmp(){
    if (Adot == 2){
        //display 2
        PORTC =(1<<1);
        PORTD = digits[RA1];
        _delay_ms(perehod);
        PORTC &=~0xFF;
        PORTB = (1<<0);
        PORTD = digits[RA2];
        PORTD |= (1<<7); //Добавляем точку к разряду
        _delay_ms(perehod);
        PORTB = (1<<1);
        PORTD = digits[RA3];
        _delay_ms(perehod);
        PORTB = (1<<2);
        PORTD = digits[RA4];
        _delay_ms(perehod);
        PORTB &=~0xFF;
    }
    else{
        //display 2
        PORTC =(1<<1);
        PORTD = digits[RA1];
        PORTD |= (1<<7); //Добавляем точку к разряду
        _delay_ms(perehod);
        PORTC &=~0xFF;
        PORTB = (1<<0);
        PORTD = digits[RA2];
        _delay_ms(perehod);
        PORTB = (1<<1);
        PORTD = digits[RA3];
        _delay_ms(perehod);
        PORTB = (1<<2);
        PORTD = digits[RA4];
        _delay_ms(perehod);
        PORTB &=~0xFF;
    }
}
 
int main(void)
{
    preset(); // Запускаем функцию, задающую начальные параметры
    while (1)
    {
        //2.56/1023 чтобы узнать цену деления, умножаем на ReadADC (количество делений), и умножаем на коэффицент делителя
        //53.76/2.56, чтобы узнать вольтаж
        PutRazryadVolt(2.49/1024*ReadADC()*(52.29/2.49));
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2016, 21:17
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Посмотрите код на предмет оптимизации. (вывод на семисегментные индикаторы) (C (СИ)):

В группе из 200 студентов 75 изучают предмет А, 70 - предмет В, 75 – предмет С, 35 – изучают А и С, 20 – изуча - Логика и множества
В группе из 200 студентов 75 изучают предмет А, 70 - предмет В, 75 – предмет С, 35 – изучают А и С, 20 – изучают В и С, 25 – изучают А и...

.NET 4.x Семисегментные часы - C#
Здравствуйте, уважаемые! :) Задача такая : Написать часы, которые отображают текущее время в виде семисегментного индикатора. Внизу...

Посмотрите код - C++
Всем доброго времени суток. Вот написал програмку, которая считает сумму элементов массива. Помогите написать её через svitch.Заранее...

Посмотрите код - C++
Помогите разобраться, пишу программу на С++. Вот код: app.cpp #include &lt;SDL/SDL.h&gt; #include &quot;App.h&quot; #include &quot;Log.h&quot; ...

Посмотрите код. - Delphi
В чем дело? Выдается ошибка в этой строке. Data.Add('ab='+Edit1.Text); Сам код: type TForm1 = class(TForm) Edit1: TEdit; ...

посмотрите код - C++
Добавлено через 5 минут и еще, не подскажнте, как сделать так, чтоб работал великий и могучий)) русский язык

1
Novi4ekC
81 / 81 / 19
Регистрация: 03.03.2013
Сообщений: 311
25.09.2016, 02:55 #2
Scrypto, удалить все неиспользованные функции, быстрей работать не будет, но памяти больше останется.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
//Функция расчета напряжения
float ReadADC(){
* * ADMUX |= (0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0); //Строка только для понятия, какая нога зайдействована как АЦП
* * _delay_us(10);
* * float Vtmp = 0;
* * //Вычисляем средне арифметическое для значения ADC (50 проходов)
* * for(int i = 0; i<50; i++){
* * * * ADCSRA |= (1<<ADSC); // Начало преобразования
* * * * while(ADCSRA &(1<<ADSC)); // Ждем конец преобразования
* * * * Vtmp += ADC;
* * }
* * return Vtmp/50;
}
это строку перенести в
Цитата Сообщение от Scrypto Посмотреть сообщение
void preset()

C
1
ADMUX |= (0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0); //Строка только для понятия, какая нога зайдействована как АЦП
это строку - удалить
Цитата Сообщение от Scrypto Посмотреть сообщение
_delay_us(10);
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2016, 02:55
Привет! Вот еще темы с ответами:

Посмотрите код - Delphi
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; ...

Посмотрите код - PHP
Проверьте пожалуйста правильно ли написан обработчик формы обратной связи. Когда я жму отправить открывается пустая страница и все....

Семисегментные часы на Паскале - Free Pascal
Товарищи! Помогие пожалуйста! Как можно вывести цифры в виде семисегментных индикаторов для часов? На языке Паскаль соответственно:)

Нужен код, нуждающийся в оптимизации - C++
ребята - несколько необычная просьба - у кого нибудь может есть небольшой по объему ( меньше 500-600 строчек) код, написанный как можно...


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

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

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