Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
arti_46
0 / 0 / 1
Регистрация: 27.02.2013
Сообщений: 34
1

Трехразрядный семисегментный индикатор на ATtiny2313

12.04.2015, 15:01. Просмотров 2242. Ответов 12
Метки нет (Все метки)

Имеется задача сделать так, чтобы трех разрядный семисегментный идникатор считал от 1до999
Удалось реализовать счет от 1 до 9 но не знаю как разбить сегменты на разряды, чтобы числа шли как нужно по задаче.
Собственно код для одного разряда:
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
#include <tiny2313.h>
#include <delay.h>
 
//zadaem massiv chisel dlya 7 segmentnika
static flash unsigned char massiv[] = {
(0b00111111),  //0
(0b00000110),  //1
(0b01011011),  //2
(0b01001111),  //3
(0b01100110),  //4
(0b01101101),  //5
(0b01111101),  //6
(0b00000111),  //7
(0b01111111),  //8
(0b01101111)   //9
};
//dop peremennie
unsigned char i,m;
 
void ind(unsigned char edin) {
PORTB=massiv[edin];
delay_ms(2);
 
 
}
 
void main(void)
{
 
PORTB=0x00;
DDRB=0b01111111;
 
PORTD=0x00;
DDRD=0x00;
 
while (1)
{
 
for(i=0;i<20;i++)ind(m);
m++;
if(m==10)m=0;
 
};
}
И скрин схемы для данного кода
Трехразрядный семисегментный индикатор на ATtiny2313

Помогите переделать под задачу, заранее спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2015, 15:01
Ответы с готовыми решениями:

Семисегментный индикатор с общим анодом
Помогите переделать вот этот исходник, так как я в программировании почти...

АЦП+UART+семисегментный индикатор(ATMega16, asm)
Пытаюсь разобраться с АЦП на AVR. Взял за исходник вот эту программу...

Семисегментный индикатор
Здравствуйте! Помогите написать программу к курсовому на тему:&quot;Семисегментный...

Вывод на семисегментный индикатор
Реализовать на левой паре знакомест статического семисегментного индикатора...

Семисегментный индикатор (ассемблер)
Сохранить числа в двоичной и двоично - десятичной системе счисления, и...

12
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
12.04.2015, 18:50 2
0
Moonlight00
1 / 1 / 0
Регистрация: 25.02.2014
Сообщений: 13
12.04.2015, 19:00 3
Вроде так:

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
unsigned char Digit0, Digit1, Digit2;
int counter;
 
static flash unsigned char massiv[] = 
{
    (0b00111111),  //0
    (0b00000110),  //1
    (0b01011011),  //2
    (0b01001111),  //3
    (0b01100110),  //4
    (0b01101101),  //5
    (0b01111101),  //6
    (0b00000111),  //7
    (0b01111111),  //8
    (0b01101111)   //9
};
 
 
void ind(unsigned char Digit0, unsigned char Digit1, unsigned char Digit2) 
{
    PORTB = massiv[Digit0];
    PORTD = 0x01;
    delay_ms(2);
    PORTB = massiv[Digit1];
    PORTD = 0x02;
    delay_ms(2);
    PORTB = massiv[Digit2];
    PORTD = 0x04;
    delay_ms(2);
}   
 
int main(void)
{
    PORTB=0x00;
    DDRB=0x7f;
    DDRD=0x07;
    PORTD=0x00;
    
    while(1)
    {
        for(int i = 0; i < 999; i++)
        {
            i = counter;
            Digit0 = 0;
            Digit1 = 0;
            Digit2 = 0;
            while (counter >= 100)
            {
                counter -= 100;
                Digit0++;
            }
            while (counter >= 10)
            {
                counter -= 10;
                Digit1++;
            }
            while (counter >= 1)
            {
                counter -= 1;
                Digit2++;
            }
            ind(Digit0, Digit1, Digit2)
        }           
    }
}
PD0, PD1, PD2 нужно подключить через транзисторы к катодам индикатора.
1
arti_46
0 / 0 / 1
Регистрация: 27.02.2013
Сообщений: 34
15.04.2015, 14:22  [ТС] 4
не помогло, числа на индикатор выводить не хочет, все еще нужна помощь с счетчиком от 0 до 999
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
15.04.2015, 14:30 5
Схему дорисовали? Если да выкладывайте картинку.
0
VovkOdinak
0 / 0 / 0
Регистрация: 29.04.2015
Сообщений: 1
29.04.2015, 14:54 6
Выкладываю свою реализацию функции вывода цифр. Вдруг новичкам понадобится.
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
void SSD_show(uint16_t value){
// порты на которые выдаются цифры
  #define dig_0 PB0
  #define dig_1 PB1
  #define dig_2 PB2
  #define dig_3 PB3
  
  const uint8_t segments[10] = {0x3f, 6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 7, 0x7f, 0x6f}; // числа для формирования цифр, зависит от конкретной реализации
  uint8_t digit[dig_3]; // массив под отдельные цифры
 
// переменные под разные нужды
  uint8_t i = dig_3;
  uint16_t j = pow10(i);
  uint16_t v = value;
 
// разбивка входных данных на отдельные цифры
  while(j > 0){
      digit[i] = v / j;
      v %= j;
      j /= 10;
      i--;
    }
  }
  for(i = dig_0; i <= dig_3; i++){    // Формирование и отображение символов
      if((i > dig_0) && (value < pow10(i))){ // Отключение ненужных нулей
          continue;
      }
      else{
        PORTD = segments[digit[i]];  // Формирование цифр из сегментов
      }
    for(j = 0; j < 32; j++) PORTB &= ~(1 << i); // яркость свечения индикатора, подбирается экспериментально
    PORTB |= 0x0f; // Гашение
    }
}
Функция pow10(n) возводит число 10 в n-ую степень. Она слишком проста и для новичка.
0
MS24
11 / 11 / 2
Регистрация: 22.02.2012
Сообщений: 115
Завершенные тесты: 1
29.04.2015, 17:33 7
Цитата Сообщение от arti_46 Посмотреть сообщение
не помогло, числа на индикатор выводить не хочет, все еще нужна помощь с счетчиком от 0 до 999
Для того, что бы выводить более одного числа Вам необходимо применить динамическую индикацию. Ув. Витальич дал Вам правильную ссылку. Почитайте теорию, в трех словах из-за инерции человеческого глаза, если быстро переключать индикаторы, то они буду восприниматься как будто горят постоянно. Т.е Вам нужно сделать так:
Вывели на первый индикатор первое число, подождали небольшое время, например 1мксек.
Вывели на второй, подождали.
Вывели на третий, подождали и т.д.

Что бы включать светодиодные индикаторы, Вам нужно подключить транзисторы (npn в данном случае) и включать их в нужный момент. Ваша схема не удовлетворяет данным условиям, нужно перерисовать.
0
Ethereal
5200 / 1943 / 251
Регистрация: 17.02.2013
Сообщений: 2,882
29.04.2015, 18:33 8
Цитата Сообщение от MS24 Посмотреть сообщение
например 1мксек
При мксек светить будет тускло. На три порядка больше. Миллисекунды три. Частота моргания каждого из индикаторов тогда будет сто герц. Что нормально.
0
pyzhman
791 / 485 / 66
Регистрация: 15.05.2012
Сообщений: 2,744
30.04.2015, 08:46 9
20мсек/число_разрядов. В данном случае 20/3= 6мсек время отображения одного разряда. Не более.
0
MS24
11 / 11 / 2
Регистрация: 22.02.2012
Сообщений: 115
Завершенные тесты: 1
30.04.2015, 08:56 10
Цитата Сообщение от Ethereal Посмотреть сообщение
При мксек светить будет тускло. На три порядка больше. Миллисекунды три.
Я признаться всегда эксперементально подбирал =)
Цитата Сообщение от pyzhman Посмотреть сообщение
20мсек/число_разрядов. В данном случае 20/3= 6мсек время отображения одного разряда. Не более.
А откуда взялось 20мкс не объясните?
0
Ethereal
5200 / 1943 / 251
Регистрация: 17.02.2013
Сообщений: 2,882
30.04.2015, 13:21 11
Цитата Сообщение от MS24 Посмотреть сообщение
Я признаться всегда эксперементально подбирал =)
Так и я тоже. Просто время можно поделить на
1 Время горения данного разряда
2 Время горения остальных разрядов
3 Время когда ничего не горит пока код программы ворочается от гашения одного разряда до зажигания следующего.
Если сделать время 1 в 1 микросекунду, то время 3 будет с ним сравнимо, а то и больше. Отсюда потеря в яркости. Надо делать, чтобы время 1 было много больше времени 3 и меньше времени когда человеческий глаз начнет замечать мерцания. Вот и все. Говорят, что человек не различает то, что мерцает быстрее 24 герц. Это не так. 50 герц все таки воспринимаются как что-то подмерцивающее. А вот около 100 герц уже все горит сплошняком. Так-что около 100 герц и чаще, но не слишком часто, чтобы яркость не подсадить.

Добавлено через 6 минут
Цитата Сообщение от MS24 Посмотреть сообщение
А откуда взялось 20мкс не объясните?
У него было 20 мсек. 20 мсек - это от частоты 50 гц. Я бы посоветовал сделать частоту побольше. Поближе к 100 гц. Т.е. взять поменьше, чем 20 мсек / число разрядов минимум раза в полтора. От этого индикатор будет гореть приятнее.
0
ValeryS
Модератор
7445 / 5637 / 716
Регистрация: 14.02.2011
Сообщений: 19,200
Завершенные тесты: 1
30.04.2015, 13:22 12
Цитата Сообщение от Ethereal Посмотреть сообщение
Говорят, что человек не различает то, что мерцает быстрее 24 герц. Это не так. 50 герц все таки воспринимаются как что-то подмерцивающее.
не совсем так у человека есть переферийное и центральное зрение, периферийное имеет большее "быстродействие"
легко удостоверится, если смотреть прямо на телевизор (старые с кинескопами) то картинка нормальная, если смотреть мимо то видно мелькание
24 герца эта плавность движения, одинокие картинки сливаются там даже ниже, "немое" кино было 16 кадров в секунду
24 пришло со звуковым, но экран мелькал
тогда пошли на хитрость
коно проецирует 24 кадра в секунду но с частотой 48 герц
обтюратор два раза за время проецирования одного кадра, перекрывает объектив
0
pyzhman
791 / 485 / 66
Регистрация: 15.05.2012
Сообщений: 2,744
30.04.2015, 13:35 13
MS24, уже объяснили.
Но вы можете провести собственный эксперимент. Никто не мешает. И довести до публики его результаты.
0
30.04.2015, 13:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2015, 13:35

Двойной семисегментный индикатор
Подскажите, пожалуйста, как подключить двойной семисегментный индикатор к...

Вывод данных в семисегментный индикатор
что не так сделал? должно выводится 0 1 2 3 4 5 из массива BufTime ...

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


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

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

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