Jump to content
skraftway2020

Поменять в прошивке индикатор с общего анода на общий катод.

Recommended Posts

День добрый. Скорее всего уместно будет написать тут.

Кто может помочь?
Есть программа, код для индикатора с общим анодом, хочу переделать для индикатора с общим катодом, массив инвертировал то что было ранее закомментировал.

flash unsigned char DIG[33] = {
//G C DP D E A F B
//0b10100000, //0
0b01011111,
//0b10111110, //1
0b01000001,
//0b01100010, //2
0b10011101,
//0b00101010, //3
0b11010101,
//0b00111100, //4
0b11000011,
//0b00101001, //5
0b11010110,
//0b00100001, //6
0b11011110,
//0b10111010, //7
0b01000101,
//0b00100000, //8
0b11011111,
//0b00101000, //9
0b11010111,
//0b00110000, //A-10
0b11001111,
//0b00100101, //b-11
0b11011010,
//0b11100001, //C-12
0b00011110,
//0b00100110, //d-13
0b11011001,
//0b01100001, //E-14
0b10011110,
//0b01110001, //F-15
0b10001110,
//0b10100001, //G-16
0b01011110,
//0b00110101, //h-17
0b11001010,
//0b11110111, //i-18
0b00001000,
//0b10100110, //J-19
0b01011001,
//0b11100101, //L-20
0b00011010,
//0b00110111, //n-21
0b11001000,
//0b00100111, //o-22
0b11011000,
//0b01110000, //P-23
0b10001111,
//0b01110111, //r-24
0b10001000,
//0b01100101, //t-25
0b10011010,
//0b10100100, //u-26
0b01011011,
//0b00110100, //H-27
0b11001011,
//0b00101100, //Y-28
0b11010011,
//0b01111111, //- 29
0b10000000,
//0b11101111, //_-30
0b00010000,
//0b10110111, //ii31
0b01001000,
//0b11111111  // -32
0b00000000
};

Прошиваю,  получаю что горят три первых разряда.

Хотя должен гореть последний, четвертый, значит где то еще надо вывод инвертировать.

Если правильно понимаю то тут

switch (PLACE) {
case 0:  PORTB |= 0b00111100;
         PORTC &= 0b11000000;
         PORTD &= 0b11111100;
         PORTC |= (DIG[L0]&0b00111111);
         if (MODE==1) PORTC.5=0;
         PORTD |= ((DIG[L0]&0b11000000)>>6);
         A0=0;
        break;
case 1:  PORTB |= 0b00111100;
         PORTC &= 0b11000000;
         PORTD &= 0b11111100;
         PORTC |= (DIG[L1]&0b00111111);
         PORTD |= ((DIG[L1]&0b11000000)>>6);
         A1=0;
        break;
case 2:  PORTB |= 0b00111100;
         PORTC &= 0b11000000;
         PORTD &= 0b11111100;
         PORTC |= (DIG[L2]&0b00111111);
         PORTD |= ((DIG[L2]&0b11000000)>>6);
         A2=0;
        break;
case 3:  PORTB |= 0b00111100;
         PORTC &= 0b11000000;
         PORTD &= 0b11111100;
         PORTC |= (DIG[L3]&0b00111111);
         PORTD |= ((DIG[L3]&0b11000000)>>6);
         A3=0;
        break;

Пробовал по разному но что то совсем дичь получается.
Кто то может подсказать что не так делаю? Приложил файлик с кодом, если не сложно можно в файлике поправить, просто хочу сравнить, посмотеть что я не так делаю

инд.png

Wind.zip

Share this post


Link to post
Share on other sites

Приглашаем на вебинар «Новинки и уникальные решения Molex. На что обратить внимание и почему»

15 апреля приглашаем на вебинар, который будет интересен разработчикам и инженерам-схемотехникам, интересующимся тенденциями рынка, новыми перспективными решениями для соединений «провод-провод», «провод-плата», «плата-плата». Для инженеров КИПиА и IT будут освещены уникальные решения Molex для «удлинения» интерфейсов HDMI, DisplayPort и USB даже в условиях сильного зашумления, а также семейство бесконтактных датчиков Contrinex. Помимо этого, будет уделено внимание дальнейшему развитию направления антенн, где Molex имеет ряд интересных и уникальных решений.

Подробнее

A0=0; подает на ногу 0 для включения Анода. А анод включается "Плюсом". Скорей всего на выходе стоит транзистор, видимо PNP. Который подает питание на индикатор. Просто прошивкой этого не исправить. Ну и в любом случае напрямую выходом МК включать индикатор весь не желательно, можно сжечь ногу) По этому там скорей всего стоит или транзистор или еще какая микросхема. Нужна схема как и сказали выше.

Share this post


Link to post
Share on other sites
                     

Как снизить потери при включении силового ключа: простая схема управления скоростью нарастания

Снижение потерь на переключения в силовых электронных системах, например, в приводах, зачастую противоречит требованиям ЭМС и ограничивается таким параметром как скорость нарастания напряжения. Простой способ решения, предлагаемый Infineon – параллельное использование двух традиционных драйверов.

Читать статью

Схему приложил. Там в схеме еще получается что часть сегментов идет на другой порт.

Share this post


Link to post
Share on other sites

Индикатор с общим катодом, значит, чтобы их зажечь, надо на сегмент подать плюс, а на общий (катоды) - минус. В схеме катоды включены через транзисторы n-p-n, а чтобы их открыть надо на базу подать "+". Отсюда вывод: на управляющих портах МК для включения нужных сегментов должен быть высокий уровень. И еще учесть, что в схеме динамическая индикация.

Share this post


Link to post
Share on other sites
19.01.2020 в 10:36, skraftway2020 сказал:

Схему да переделал. 

ну я вам написал уже, измените
A0=0; на A0=1;
A1=0; на A1=1;
и тд.

у вас теперь npn транзистор, значит управляется плюсом.

 

Странно перечитал, нет моего сообщения, куда дели?) Я вчера писал же что у вас включаются индикаторы строками A0 - A3. Нади их тоже инвертировать с заменой транзисторов. 

Ну то есть транзисторы у вас уже заменены так что не надо менять больше их))

Share this post


Link to post
Share on other sites

попробуй так

switch (PLACE) {
case 0:  PORTB &= 0b11000011;
         PORTC |= (DIG[L0]&0b00111111);
         if (MODE==1) PORTC.5=0;
         PORTD |= ((DIG[L0]&0b11000000)>>6);
         A0=1;
        break;
case 1:  PORTB &= 0b11000011;
         PORTC |= (DIG[L1]&0b00111111);
         PORTD |= ((DIG[L1]&0b11000000)>>6);
         A1=1;
        break;
case 2:  PORTB &= 0b11000011;
         PORTC |= (DIG[L2]&0b00111111);
         PORTD |= ((DIG[L2]&0b11000000)>>6);
         A2=1;
        break;
case 3:  PORTB &= 0b11000011;
         PORTC |= (DIG[L3]&0b00111111);
         PORTD |= ((DIG[L3]&0b11000000)>>6);
         A3=1;
        break;

 

Share this post


Link to post
Share on other sites
5 часов назад, DrobyshevAlex сказал:

ну я вам написал уже, измените

Попробовал. Меняю так:

switch (PLACE) {
case 0: PORTB |= 0b00111100;
        PORTC &= 0b11000000;
        PORTD &= 0b11111100;
        PORTC |= (DIG[L0]&0b00111111);
        if (MODE==1) PORTC.5=0;
        PORTD |= ((DIG[L0]&0b11000000)>>6);
        A0=1;
        break;
case 1: PORTB |= 0b00111100;
        PORTC &= 0b11000000;
        PORTD &= 0b11111100;
        PORTC |= (DIG[L1]&0b00111111);
        PORTD |= ((DIG[L1]&0b11000000)>>6);
        A1=1;
        break;
case 2: PORTB |= 0b00111100;
        PORTC &= 0b11000000;
        PORTD &= 0b11111100;
        PORTC |= (DIG[L2]&0b00111111);
        PORTD |= ((DIG[L2]&0b11000000)>>6);
        A2=1;
        break;
case 3: PORTB |= 0b00111100;
        PORTC &= 0b11000000;
        PORTD &= 0b11111100;
        PORTC |= (DIG[L3]&0b00111111);
        PORTD |= ((DIG[L3]&0b11000000)>>6);
        A3=1;
        break;

Горят 4- нуля

4 часа назад, skripach сказал:

попробуй так

Попробовал так:

switch (PLACE) {
case 0:  PORTB &= 0b11000011;
         PORTC |= (DIG[L0]&0b00111111);
         if (MODE==1) PORTC.5=0;
         PORTD |= ((DIG[L0]&0b11000000)>>6);
         A0=1;
        break;
case 1:  PORTB &= 0b11000011;
         PORTC |= (DIG[L1]&0b00111111);
         PORTD |= ((DIG[L1]&0b11000000)>>6);
         A1=1;
        break;
case 2:  PORTB &= 0b11000011;
         PORTC |= (DIG[L2]&0b00111111);
         PORTD |= ((DIG[L2]&0b11000000)>>6);
         A2=1;
        break;
case 3:  PORTB &= 0b11000011;
         PORTC |= (DIG[L3]&0b00111111);
         PORTD |= ((DIG[L3]&0b11000000)>>6);
         A3=1;
        break;

Горят 4-е восьмерки с точками, т.е все сегменты полностью.

Share this post


Link to post
Share on other sites
41 минуту назад, skraftway2020 сказал:

Горят 4-е восьмерки

switch (PLACE) {
case 0:  PORTB &= 0b11000011;
        PORTC &= 0b11000000;
        PORTD &= 0b11111100;
         PORTC |= (DIG[L0]&0b00111111);
         if (MODE==1) PORTC.5=0;
         PORTD |= ((DIG[L0]&0b11000000)>>6);
         A0=1;
        break;
case 1:  PORTB &= 0b11000011;
        PORTC &= 0b11000000;
        PORTD &= 0b11111100;
         PORTC |= (DIG[L1]&0b00111111);
         PORTD |= ((DIG[L1]&0b11000000)>>6);
         A1=1;
        break;
case 2:  PORTB &= 0b11000011;
        PORTC &= 0b11000000;
        PORTD &= 0b11111100;
         PORTC |= (DIG[L2]&0b00111111);
         PORTD |= ((DIG[L2]&0b11000000)>>6);
         A2=1;
        break;
case 3:  PORTB &= 0b11000011;
        PORTC &= 0b11000000;
        PORTD &= 0b11111100;
         PORTC |= (DIG[L3]&0b00111111);
         PORTD |= ((DIG[L3]&0b11000000)>>6);
         A3=1;
        break;

 

Share this post


Link to post
Share on other sites

 skripach

Попробовал, вот теперь ноль в четвертом разряде, как и должно быть. Спасибо.

Получается все порты не надо было инвертировать а только Порт B

Т.е в каждом разряде инвертировали строку PORTB |= 0b00111100; на PORTB &= 0b11000011;

и A0-A3 c 0 на 1

Edited by skraftway2020

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...