Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Scrypto
66 / 67 / 26
Регистрация: 08.02.2013
Сообщений: 383
#1

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

23.09.2016, 21:17. Просмотров 301. Ответов 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
Ответы с готовыми решениями:

Про семисегментные индикаторы
Имеется обычный блок из 8 семисегментных индикаторов и МК pic16f877A Удалось...

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

Bosch b1zdi24202 код ошибки, мигают индикаторы timer+operation
проверили (заменили) все датчики не помогло, вырубаем автомат удерживаем кнопку...

СМА Candy CTH1076SY мигают индикаторы, какой код ошибки
Доброго времени суток вам, мастера! СМА Candy CTH1076SY Cod.31001319 0702...

СМА BOSCH WAE 20160 OE/04 неисправность, Мигают индикаторы.Код ошибки?
СМА BOSCH WAE 20160 OE/04 s/n 437060239756006646 мигают индикаторы, все...

1
Novi4ekC
81 / 81 / 33
Регистрация: 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

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

Посмотрите код
Помогите разобраться, пишу программу на С++. Вот код: app.cpp #include...

Посмотрите код
Всем доброго времени суток. Вот написал програмку, которая считает сумму...


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

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

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