Atmega 16 не дружит с 74hc595

Тема в разделе "Микроконтроллеры AVR", создана пользователем maxpayn, 14 мар 2019.

Метки:
  1. maxpayn

    maxpayn Нуб

    Добрый день! Цепляю на контроллер много независимых сдвиговых регистров. Но многие не работают. Сначала не работало вообще, но блокировочный конденсатор на питание + pull-down резисторы на clock и data. Но теперь из 5 работают нормально только 2, 1 не хочет переключать latch(st-cp)(только когда на борде достаю контакт - переключает), и 2 вообще не хотят реагировать.
    Попробовал на 3 микрухах (атмеги16), результат тот же. Добавил делай на затворе что бы успело переключиться, но результата нету.
    Может есть у кого какие идеи и советы?
    по коду. не работает Dig1, Led2. и с затвором проблема с Time.
    // 10 выход 74hc595 подключен к питанию, а 13 к земле.
    Код (C++):
    #define dataPin165 PB6        //  165
    #define shiftPin165 PB7        //
    #define latchPin165 PB4        //
    #define DATATime (1<< PC1)           //DS 14 Time on main board
    #define LATCHTime (1<< PC2)          //St 12
    #define CLOCKTime (1<< PC0)          //sh 11
    #define DATALED1 (1<< PA3)           //DS 14 Led board 1
    #define LATCHLED1 (1<< PA4)          //St 12
    #define CLOCKLED1 (1<< PA5)          //sh 11
    #define DATALED2  (1<< PC3)           //DS 14 Led board 2
    #define LATCHLED2 (1<< PC4)          //St 12
    #define CLOCKLED2 (1<< PC5)          //sh 11
    #define DATADig1 (1<< PB0)           //DS 14 Led Digital 1
    #define LATCHDig1 (1<< PB1)          //St 12
    #define CLOCKDig1 (1<< PB2)          //sh 11
    #define DATADig2 (1<< PA0)           //DS 14 Led Digital 2
    #define LATCHDig2 (1<< PA1)          //St 12
    #define CLOCKDig2 (1<< PA2)          //sh 11
    #define LEDW1 (1<< PA6)           //
    #define LEDW2 (1<< PA7)          //
    #define LEDW3 (1<< PB3)          //
    #define IROUT (1<< PD7)           //IR out
    #define IRTSOP (1<< PD3)          //IR in
    #define BUZZER (1<< PD1)          //buzzer
    #define BUTONOFF (1<< PD2)           //Button 1
    #define BUT2 (1<< PD4)          //Button 2
    #define BUT3 (1<< PD6)          //Button 3
    #define BUT4 (1<< PD5)          //Button 4
    void Init (){
        DDRB |= (LEDW3|DATADig1|CLOCKDig1|CLOCKDig1|shiftPin165|latchPin165|LEDW3);
        PORTB &= ~(LEDW3|DATADig1|CLOCKDig1|CLOCKDig1|shiftPin165|latchPin165|LEDW3);
        DDRA |= (DATALED1|LATCHLED1|CLOCKLED1|DATADig2|LATCHDig2|CLOCKDig2|LEDW1|LEDW2);
        PORTA &= ~(DATALED1|LATCHLED1|CLOCKLED1|DATADig2|LATCHDig2|CLOCKDig2|LEDW1|LEDW2);
        DDRD &= ~(BUT2|BUT3|BUT4);
        DDRD |= (IROUT|BUZZER);
        PORTD |=(BUT2|BUT3|BUT4);
        PORTD &= ~(IROUT|BUZZER);
        DDRC |= (DATATime|LATCHTime|CLOCKTime|DATALED2|LATCHLED2|CLOCKLED2);
        PORTC &= ~(DATATime|LATCHTime|CLOCKTime|DATALED2|LATCHLED2|CLOCKLED2);
        PORTC &= ~(LATCHTime);
        DDRB&=~(IRTSOP|BUTONOFF|dataPin165); //input
        PORTB|=(IRTSOP|BUTONOFF|dataPin165);
    }
    int main(void)
    {  
        _delay_ms(1000);
        Init();
     
     
     
        while (1)
        {  
                        for(uint8_t i=0;i<8;i++)
                        {
                            if(i==1)
                            {
                                PORTC |= (DATALED2);
                            }
                            else
                            {
                                PORTC &= ~(DATALED2);
                            }
                            PORTC |= (CLOCKLED2);
                            PORTC &= ~(CLOCKLED2);
                        }
                        PORTC |= (LATCHLED2);
                        _delay_ms(100);
                        PORTC &= ~(LATCHLED2);
                     
            for(uint8_t i=0;i<8;i++)
            {
                if(i==1)
                {
                    PORTC |= (DATATime);
                }
                else
                {
                    PORTC &= ~(DATATime);
                }
                PORTC |= (CLOCKTime);
                PORTC &= ~(CLOCKTime);
             
            }
            PORTC |= (LATCHTime);
            _delay_ms(100);
            PORTC &= ~(LATCHTime);
            // not
            for (uint8_t i = 0 ; i < 8 ; i++){
                if(i==0)
                {
                    PORTB |= (DATADig1);
                }
                else
                {
                    PORTB &= ~(DATADig1);
                }
                PORTB |= (CLOCKDig1);
                PORTB &= ~(CLOCKDig1);
            }
            PORTB |= (LATCHDig1);
            _delay_ms(150);
            PORTB &= ~(LATCHDig1);
            //ok
            for(uint8_t i=0;i<8;i++)
            {
                if(i==1)
                {
                    PORTA |= (DATALED1);
                }
                else
                {
                    PORTA &= ~(DATALED1);
                }
                PORTA |= (CLOCKLED1);
                PORTA &= ~(CLOCKLED1);
             
            }
            PORTA |= (LATCHLED1);
            _delay_ms(100);
            PORTA &= ~(LATCHLED1);
         
            //ok
            for(uint8_t i=0;i<8;i++)
            {
                if(i==1)
                {
                    PORTA |= (DATADig2);
                }
                else
                {
                    PORTA &= ~(DATADig2);
                }
                PORTA |= (CLOCKDig2);
                PORTA &= ~(CLOCKDig2);
             
            }
            PORTA |= (LATCHDig2);
            _delay_ms(100);
            PORTA &= ~(LATCHDig2);
        }
    }
     
  2. parovoZZ

    parovoZZ Гуру

    Какая частота? Микрухи исправны? Проблема в контактах и неправильной разводке питания.
     
  3. maxpayn

    maxpayn Нуб

    Забыл добавить что 16Мгц
    Код (C++):
    #ifndef F_CPU
    #define F_CPU 16000000UL
    #endif
    #include <avr/io.h>
    //#include <avr/sleep.h>
    //#include <avr/interrupt.h>
    #include <util/delay.h>
    //#include <avr/eeprom.h>
    #include <stdio.h>
    //#include <inttypes.h>
    Микрухи исправны.
    Какие проблемы в контактах? если они напрямую соединены с понижающими резисторами.
    Какая неправильная разводка питания? что Вы под этим имеете в виду?
     
  4. parovoZZ

    parovoZZ Гуру

    Нет. Эта не интересна в данном случае. Хоть 100 МГц. Частота тактирования регистров.

    Которые на ноль линию тянут? они зачем?

    В контактах всего одна проблема - его наличие когда не надо и отсутствие когда надо.
     
  5. maxpayn

    maxpayn Нуб

    Без них, контакты ловят все подряд и вместо программы где должен загораться 2 светодиод, горят все или моргают все.
     
  6. KindMan

    KindMan Гуру

    Ерунда. У меня есть несколько макеток с регистрами со светодиодами, для отладки использую, провода длинные, перекручены со всем подряд, и всегда всё без проблем. Покажите схему вашего подключения, как сказали выше, наверняка проблема в "соплях" где нибудь. В коде много заморочек, на мой не профессиональный взгяд, трудно читать и понять, что куда
     
  7. Ariadna-on-Line

    Ariadna-on-Line Гуру

    10-я нога микры - это не выход, а вход, или просто ВЫВОД (выступ). Если вы засадили ее в ноль - все триггеры микры в сбросе. Микра естественно не принимает данные.
    Нафига пул-даун резисторы. Поставьте пул-апы, Они не помешают, если выводы процессора вдруг переключатся с выхода на вход.
     
    Последнее редактирование: 14 мар 2019
  8. maxpayn

    maxpayn Нуб

    2019-03-14 14.35.01.jpg Снимок экрана 2019-03-14 в 14.45.11.png
    Схемка и фотка
     
  9. maxpayn

    maxpayn Нуб

    так 10 нога это питание.
     
  10. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Псс. Виноват-с не разглядел. Щас покумекаем... Поставьте резистор в цепь светодиода. У 595 - свойство фигово работать при перегрузке. Зачем микрам 6 вольт ? А не проще ли в коде использовать digitalWrite (pin, 1/0). А то этот формализованный код без пол-литра не усвоишь. ПС. Удаляюсь - дела.
     
    Последнее редактирование: 14 мар 2019
  11. KindMan

    KindMan Гуру

    У вас просто схема одна, код от другой…
    Я думаю по одному наладить работу, на 100 %, и подключать каждый последующий. Странно, регистры обычно дубовые, хоть тумблерами щелкай.
     
    Ariadna-on-Line и parovoZZ нравится это.
  12. parovoZZ

    parovoZZ Гуру

    у тебя выход МК превратился во вход. Резисторы - это костыли.
     
  13. maxpayn

    maxpayn Нуб

    Код уже масштабируемый, под пару регистров и тд. и поскольку нефига не работало, то начал на борде тестировать. и вот тут смотрю что некоторые работают, а другие -нет
     
  14. maxpayn

    maxpayn Нуб

    я по одному и делаю, но не могу понять почему выходы не загружают в регистр сдвига, и не включают
     
  15. DetSimen

    DetSimen Guest

    Никогда так не делай. Тяни вверх
     
    Andrey12 нравится это.
  16. parovoZZ

    parovoZZ Гуру

    Там вообще не надо ничего никуда тянуть, если выход драйвера не уходит в Z состояние.
     
  17. maxpayn

    maxpayn Нуб

    Без б. убрал резисторы. фигня осталась та жа. некоторые порты загружают биты, другие нет. какие идеи?
     
  18. parovoZZ

    parovoZZ Гуру

    Это как раз тот момент, когда надо цеплять ЛА. И читать регистр PIN/
     
  19. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Это как раз тот момент, когда стОит не задирать нос, а воспользоваться обычным Протеусом и его виртуальным осциллографом. Времянку уровней на пинах проца он показывает достаточно достойно. Не, ну если у вас есть под рукой логический анализатор - ради бога...
     
    Последнее редактирование: 14 мар 2019
  20. parovoZZ

    parovoZZ Гуру

    Легально приобретён или нагло сворован?