Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 13.05.2020
Сообщений: 13
1

Динамическая индикация на два независимых индикатора на atmega8

14.05.2020, 16:16. Просмотров 294. Ответов 8
Метки нет (Все метки)

Здравствуйте. Так как только учусь программировать с миру по нитки собрал программу.
На два индикатора разделил. Но никак не пойму как на втором индикаторе включить точку, что б она светилась постоянно не зависимо от отображаемой цифры. М и если можно, посоветуйте пожалуйста, как можно более оптимизировать код?
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
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
 
 
#define  CHISLO PORTD
#define  RAZRIAD PORTB
 
 
 
unsigned int razr1 = 0, razr2 = 0, razr3 = 0, razr4 = 0, razr5 = 0, razr6 = 0;
unsigned char reg = 1;
unsigned int z, a=0, i=0, k=0;
 
 
unsigned int chisla [11] = {
    
    // числа от 0 до 9
    0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x80
};
 
 
void vse_chislo (unsigned int razbivka_chisla)
{
   // индикация первого дисплея 4 индикатора
    razr1 = razbivka_chisla/1000; // тысячи
    razr2 = razbivka_chisla%1000/100; // сотни
    razr3 = razbivka_chisla%100/10; // десятки
    razr4 = razbivka_chisla%10; // единицы
        
}
 
void vse_chislo1 (unsigned int razbivka_chisla1)
{
     // индикация второго дисплея 2 индикатора
    razr5= razbivka_chisla1%100/10;// десятки
    razr6= razbivka_chisla1%10;// единицы
}
 
ISR (TIMER0_OVF_vect)
{
   //переключение разрядов для обоих дисплеев
    if (reg == 1) {RAZRIAD = 0b00000001; CHISLO = chisla[razr1];} //включаем 1-й разряд, остальные выключаем
    if (reg == 2) {RAZRIAD = 0b00000010; CHISLO = chisla[razr2];} //включаем 2-й разряд, остальные выключаем
    if (reg == 3) {RAZRIAD = 0b00000100; CHISLO = chisla[razr3];} //включаем 3-й разряд, остальные выключаем
    if (reg == 4) {RAZRIAD = 0b00001000; CHISLO = chisla[razr4];} //включаем 4-й разряд, остальные выключаем
    if (reg == 5) {RAZRIAD = 0b00010000; CHISLO = chisla[razr5];} //включаем 5-й разряд, остальные выключаем
    if (reg == 6) {RAZRIAD = 0b00100000; CHISLO = chisla[razr6];} //включаем 6-й разряд, остальные выключаем
    reg++; // добавляем к переменной reg единицу
    if (reg > 6) reg = 1; // отслеживаем переменную reg, чтобы она не превысила значение 4
        
}
 
 
 
int main(void)
{
  
   // Настройка портов ввода-вывода
        DDRD = 0xFF;
        DDRB = 0xFF;
        DDRC &= ~((1<<4) | (1<<5));
    PORTC |= (1<<2) | (1<<3)| (1<<4)| (1<<5);
    
    
    RAZRIAD = 0b00000001;
    CHISLO = 0xff;
    
    // Настройка 0-го таймер счетчика на прерывание по переполнению
    
    TCCR0 |= (1<<1); TCCR0 &= ~((1<<0) | (1<<2)); // f/8
    TIMSK |= (1<<0);
    TCNT0 = 0;
    sei ();
    
    
    
    while (1) 
    {
        vse_chislo(k); //вывод на первый дисплей
        vse_chislo1(z); //вывод на второй дисплей
       
           switch(i){
      case 1: z=1; break;
         case 2: z=5; break;
        case 3: z=10; break;
           case 4: z=20; break;
              case 5: z=50; break;
             default : z=0;
       }
       
       //кнопки переключения для дисплеев
       if (bit_is_clear(PINC, 2)){
      
     if(i<5){
        
         i=i+1;
         _delay_ms(800);
      }else { i=5;}
      }
        
        
           if (bit_is_clear(PINC, 3)){
      
     if(i>1){
        
         i=i-1;
         _delay_ms(800);
      }else { i=0;}
      }
      
         if (bit_is_clear(PINC, 4)){
      
     if(k<9999){
        
         k=k+1;
         _delay_ms(800);
      }else { k=9999;}
      }
        
        
           if (bit_is_clear(PINC, 5)){
      
     if(k>1){
        
         k=k-1;
         _delay_ms(800);
      }else { k=0;}
      }
 
        
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2020, 16:16
Ответы с готовыми решениями:

Динамическая индикация
AT90USB162. Нужно чтобы два средних разряда 4-разрядного индикатора мигали. Прерывания по идее пока...

динамическая индикация
подскажите пожалуйста! предположим у нас 10 индикаторов (восьмёрки) подключены по схеме с...

Динамическая индикация
Здравствуйте! Хочу сделать динамическую индикацию на Atmega8 код примера взял отсюда : Динамическая...

Снова динамическая индикация
Добрый день! Прошу помощи в решении моей проблемы. Написал код на AVRStudyo5, чтобы для...

8
1779 / 1109 / 109
Регистрация: 04.01.2010
Сообщений: 3,892
14.05.2020, 21:58 2
в одной из строчек 43..48 вам нужно добавить запятую, к значению, которое выводится. Ну, то есть, наверное, типа такого:
C
1
 CHISLO = chisla[razr4] | comma;
где "comma" представляет собой выставленный в единицу разряд запятой (судя по вашему коду это бит 7).

Добавлено через 12 минут
Цитата Сообщение от Azerhud Посмотреть сообщение
посоветуйте пожалуйста, как можно более оптимизировать код?
в принципе, особо оптимизировать нечего, в вашем коде. Естственно, можно придраться буквально ко всему, но это не принесет существенных улучшений. Единственное, место, где можно "задуматься", это строчки 26..29, где выполняется куча деления. "Остаток от деления" можно всегда заменить вычитанием результата деления, умноженного на делитель, от делимого:

то есть:

C
1
2
3
4
5
razr1 = razbivka_chisla/1000;
razbivka_chisla = razbivka_chisla - razr1*1000; // subtracting digit 1 value
razr2 = razbivka_chisla / 100;
razbivka_chisla = razbivka_chisla - razr2*100; // subtracting digit 2 value
...
Скорее всего, так работать будет немножко быстрее, т.к. умножение выполняется быстрее деления. Но это оптимизация - так себе, мало на что повлияет,. Потому что основная нагрузка на процессор будет в прерывании.
1
0 / 0 / 0
Регистрация: 13.05.2020
Сообщений: 13
16.05.2020, 12:00  [ТС] 3
Спасибо за совет, по экспериментирую.
А теперь к основному вопросу.
При подключении одного семиразрядного индикатора с шестью разрядами всё работает отлично, но при подключении двух индикаторов с двумя и четырьмя разрядами происходит что то не понятное. Скрины во вложении. Может я что то не допонимаю?
Снимки сделаны в один момент работы при изменении показания индикатора нажимая кнопку.
0
Миниатюры
Динамическая индикация на два независимых индикатора на atmega8   Динамическая индикация на два независимых индикатора на atmega8   Динамическая индикация на два независимых индикатора на atmega8  

0 / 0 / 0
Регистрация: 13.05.2020
Сообщений: 13
16.05.2020, 12:05  [ТС] 4
Добавил точку, и вновь что то не так
0
Миниатюры
Динамическая индикация на два независимых индикатора на atmega8  
901 / 541 / 81
Регистрация: 15.05.2012
Сообщений: 3,168
17.05.2020, 17:33 5
C
1
CHISLO = chisla[razrХ];} //включаем Х-й разряд, остальные выключаем
Вот в этой строке управлять запятой нужного разряда.
1
1779 / 1109 / 109
Регистрация: 04.01.2010
Сообщений: 3,892
17.05.2020, 18:46 6
Цитата Сообщение от Azerhud Посмотреть сообщение
происходит что то не понятное.
по идее, в реальной жизни у вас получится совершенно однородный интерфейс, и в первом и во втором случае. При замене "1х6" на "4+2", как вы показали, соединения в схеме внутри индиктора просто переносятся в схему, вот и все. Тут скорее всего либо у вас выбраны разные индикаторы по схеме светодиодов (например, выбраны один с общим анодом, другой - с общим катодом), либо это глюк в симуляторе.

Добавлено через 3 минуты
Еще, возможно, симулятору не нравится переключение символов, и он может "жаловаться" на грязь при перходе между разрядами":
Цитата Сообщение от Azerhud Посмотреть сообщение
C
1
RAZRIAD = 0b00000001; CHISLO = chisla[razr1];
Чтобы было совсем правильно, нужно сначала гасить предыдущий разряд, а потом уже включать следующий:
C
1
CHISLO = 0; RAZRIAD = 0b00000001; CHISLO = chisla[razr1];
1
0 / 0 / 0
Регистрация: 13.05.2020
Сообщений: 13
17.05.2020, 23:15  [ТС] 7
Перебрал указанные варианты, но пока результат тот же. Попробую в железе собрать, но пока у меня в наличиитолько одноразрядные индикаторы


Добавлено через 3 часа 45 минут
Всем спасибо за советы. Проблема решена.
0
1779 / 1109 / 109
Регистрация: 04.01.2010
Сообщений: 3,892
18.05.2020, 11:18 8
Цитата Сообщение от Azerhud Посмотреть сообщение
Попробую в железе собрать,
а в железе страшновато так, без резисторов, собирать.
Цитата Сообщение от Azerhud Посмотреть сообщение
Проблема решена.
Так в чем же причина была?
0
0 / 0 / 0
Регистрация: 13.05.2020
Сообщений: 13
18.05.2020, 21:30  [ТС] 9
Цитата Сообщение от Voland_ Посмотреть сообщение
а в железе страшновато так, без резисторов, собирать.
Конечно же буду всю обвязке делать
Цитата Сообщение от Voland_ Посмотреть сообщение
Так в чем же причина была?
Массив с символами был для индикатора ОК, индикатор ОК а переключение регистров был для индикатора с ОА.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.05.2020, 21:30

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Динамическая индикация ATMega8535
Необходимо реализовать динамическую индикацию на 7 сегментном индикаторе. Даны начальные условия...

Динамическая индикация и 74hc164
наверное, многие догадались какой вопрос будет :) Почему есть засветка соседних диодов матрицы,...

Протеус. Динамическая индикация
Собственно проблема состоит в том что при выполнении динамической индикации числа которые выводятся...

DS18b20 и динамическая индикация
Всем привет.Написал программу управляющая компрессором,которая следит за работой,измеряет...

Динамическая индикация, регулировка яркости
Что-то не могу осилить, как яркость светодиодов регулировать. Вот так работает без регулировки-...

Динамическая индикация, захлебнулся в таймерах.
Есть stm32f4Dyscovery, есть блок газоразрядных индикаторов, подключенных к одному дешифратору...


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

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

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