zud Опубликовано 10 Февраля, 2018 в 12:02 Жалоба Поделиться Опубликовано 10 Февраля, 2018 в 12:02 Проблема в следующем Пытаюсь подключить 7-ми сегментник к АТ8 - даже не моргнёт,падла такая. Вроде по книжкам делал, мож подробность какую упустил? Вордовский док не хАТИт глотать, по этому открытым текстом..... Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega8.h> #include <delay.h> #include <stdio.h> char digit_out[2], cur_dig; flash char buf[] = { //массив с цифрами 0b00000011, //0 0b10011111, //1 0b00100101, //2 0b00001101, //3 0b10011001, //4 0b01001001, //5 0b01000001, //6 0b00011111, //7 0b00000001, //8 0b00001001, //9 0b11111111 }; void hc164_wr(unsigned char dig){ //подпрограмма вывода данных в регистр unsigned char a; for(a=0; a<8; a++){ //цикл для вывода 8 бит данных из массива PORTB.0 = buf[dig] & 1<<a; //выводим в линию DATA текущий бит PORTB.1=0; //опускаем линию CLK в лог.0 PORTB.1=1; //поднимаем линию CLK в лог.1 } } // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { switch (cur_dig){ case 0:{PORTC.0=0; PORTC.1=0; hc164_wr(digit_out[cur_dig]); PORTC.0=1; break;}; //первая цифра case 1:{PORTC.1=0; PORTC.0=0; hc164_wr(digit_out[cur_dig]); PORTC.1=1; break;}; //вторая цифра } cur_dig++; if (cur_dig==2) cur_dig=0; } // External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) { // Place your code here } // Declare your global variables here void main(void) { unsigned char f; // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0xFF; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0xFF; // Port D initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTD=0xFF; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 125,000 kHz TCCR0=0x03; TCNT0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x03; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer2 Stopped // Mode: Normal top=0xFF // OC2 output: Disconnected ASSR=0x00; TCCR2=0x03; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: On // INT0 Mode: Falling Edge // INT1: On // INT1 Mode: Falling Edge GICR|=0xC0; MCUCR=0x0A; GIFR=0xC0; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x02; // USART initialization // USART disabled UCSRB=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // ADC initialization // ADC disabled ADCSRA=0x00; // SPI initialization // SPI disabled SPCR=0x00; // TWI initialization // TWI disabled TWCR=0x00; // Global enable interrupts #asm("sei") while (1) { for(f=0; f<100; f++){ delay_ms(50); digit_out[0]=f/10; digit_out[1]=f%10; } }; } Ошибка где? подскажите, пожаЛЛста :unknown: Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexter Опубликовано 10 Февраля, 2018 в 20:16 Жалоба Поделиться Опубликовано 10 Февраля, 2018 в 20:16 (изменено) ... даже не моргнёт,падла такая. ...Желательно видеть схему. Во-первых, в схеме могут быть ошибки. Во-вторых, используется вход внешних прерываний и без схемы непонятно, что за сигнал на него подаётся. В третьих, программа может не соответствовать схеме. В четвёртых, без схемы нельзя понять, как выводятся знаки. В функции hc164_wr выводится последовательный код с тактом. Куда выводится? У вас индикатор с последовательным входом? Изменено 10 Февраля, 2018 в 20:24 пользователем Lexter Ссылка на комментарий Поделиться на другие сайты Поделиться
zud Опубликовано 11 Февраля, 2018 в 04:03 Автор Жалоба Поделиться Опубликовано 11 Февраля, 2018 в 04:03 Понял. Я сам сдурил - схему нарисовал 74С595 - балбес, что скажешь.... Николай, тогда вопрос шкурный - все мои извраты в данный момент связаны с следующим Хочу на AVR-ке сделать управление оконечником. Алгоритм следующий: 1 - Подали сетевое - усь в ожидании (stendbai) 2 - Нажали кнопку - включилось рэле подключающее питалово на силовой транс, появляется индикация (4-х разрядный 7-ми сегментник) -- уровень громкости на момент выключения. так же проц управляет лестничным регулятором громкости через кнопки или валкодер. Если есть возможность помочь в данном проекте - буду очень благодарен. Ссылка на комментарий Поделиться на другие сайты Поделиться
zud Опубликовано 11 Февраля, 2018 в 05:53 Автор Жалоба Поделиться Опубликовано 11 Февраля, 2018 в 05:53 Кстати в добавок к алгоритму - при подаче "стороннего" сигнала на один из входов контроллера, усил должен так же включиться ( при использовании отдельного преда). Ссылка на комментарий Поделиться на другие сайты Поделиться
zud Опубликовано 11 Февраля, 2018 в 08:45 Автор Жалоба Поделиться Опубликовано 11 Февраля, 2018 в 08:45 Добавляю переделанное под 595 AVRCV и проект в протеусе Новая папка (8).rar Новая папка (8).rar Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexter Опубликовано 11 Февраля, 2018 в 11:58 Жалоба Поделиться Опубликовано 11 Февраля, 2018 в 11:58 ... проект в протеусе ...К сожалению, в протеусе помочь не смогу. Я в нём не работаю и у меня его нет, так что даже открыть посмотреть нечем.Так как после переделки, проект "задышал"? Ссылка на комментарий Поделиться на другие сайты Поделиться
goldmen8 Опубликовано 11 Февраля, 2018 в 15:28 Жалоба Поделиться Опубликовано 11 Февраля, 2018 в 15:28 (изменено) Вот и схема добытая непосильным трудом из протеуса. Узнать бы ещё назначения кнопок. Изменено 11 Февраля, 2018 в 15:31 пользователем goldmen8 Ссылка на комментарий Поделиться на другие сайты Поделиться
zud Опубликовано 12 Февраля, 2018 в 00:27 Автор Жалоба Поделиться Опубликовано 12 Февраля, 2018 в 00:27 кнопки свеху 1,2,3,4, 1 - вкл 2 - + 3 - - 4 - нажал - есть + на PD0 , ещё раз - нету. Переделал всё и всё равно тихо. Ссылка на комментарий Поделиться на другие сайты Поделиться
zud Опубликовано 12 Февраля, 2018 в 10:31 Автор Жалоба Поделиться Опубликовано 12 Февраля, 2018 в 10:31 Перенастроил порты - индикатор засветился....... весь......все сегменты....... На нажатие не реагирует, сдвиг.рег. молчит. Хреново когда недоучь..... Ссылка на комментарий Поделиться на другие сайты Поделиться
goldmen8 Опубликовано 12 Февраля, 2018 в 10:34 Жалоба Поделиться Опубликовано 12 Февраля, 2018 в 10:34 ... появляется индикация (4-х разрядный 7-ми сегментник) -- уровень громкости на момент выключения. ... А не много будет уровень громкости в 4-е разряда? Ссылка на комментарий Поделиться на другие сайты Поделиться
zud Опубликовано 12 Февраля, 2018 в 12:10 Автор Жалоба Поделиться Опубликовано 12 Февраля, 2018 в 12:10 индикацию хочу сделать "dB" - 127, а с прибавлением или убавлением..... Буквы с индикатора отдельно сделаю... Пыжусь с чужих решений "свести" в кучу всё - ума, блин, не хватает, блин.... Может кто ссылочку скинет как правильно выводить цыфры через 595-ю в CodeVision-е? Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexter Опубликовано 12 Февраля, 2018 в 15:15 Жалоба Поделиться Опубликовано 12 Февраля, 2018 в 15:15 (изменено) ... как правильно выводить цыфры через 595-ю ...Для этого полезнее один раз разобраться, чем каждый раз искать чьи-то кривые примеры. :smile:Берётся даташит на нужную микросхему (ссылка на даташит 74HC595: _http://www.ti.com/lit/ds/symlink/sn74hc595.pdf ). Микросхема состоит из двух регистров - входного регистра сдвига и выходного регистра-защёлки. Чтобы во время передачи кода на выходах микросхемы не проскакивали промежуточные значения (чтобы цифры на подключеном индикаторе не моргали), сначала последовательный код побитно записывается в сдвиговый регистр, потом одним тактом перезаписывается в регистр-защёлку, после чего новые данные появляются на выходах микросхемы. Зная, к каким портам контроллера какие выводы микросхемы подключены, просто пишутся соответствующие действия в программе: Исходно управляющие входы микросхемы надо установить в следующие состояния: OE (13) = 0 (выходы микросхемы активны); RCLK (12) = 0 (исходное состояние входа записи в регистр-защёлку); SRCLK (11) = 0 (исходное состояние входа записи в сдвиговый регистр); SRCLR (10) = 1 (сброса в 0 сдвигового регистра нет); SER (14) - вход последовательных данных, любое состояние, так как нужное установится при первом выводе. В подпрограмме вывода кода цифры выполняются следующие действия: На SER (14) устанавливается первый бит выводимого кода. На SRCLK (11) устанавливается 1, затем 0, т.е. формируется фронт такта, по которому бит со входа SER записывается в сдвиговый регистр. Эти операции повторяются, пока в сдвиговый регистр не будут записаны все биты кода. После записи в регистр сдвига всего кода (в данном случае - кода знака цифры на индикаторе), на его выходе получается параллельный код, который надо переписать в выходной регистр. Для этого на RCLK (12) надо установить 1 (по этому фронту данные запишутся в выходной регистр и появятся на выходах), затем 0 (вернуть в исходное состояние). При динамической индикации эта операция делается в другом месте (см. ниже). Всё. Новое число установлено на выходах микросхемы. Бит, выведенный последним, окажется на выходе QА (15), остальные биты - по порядку на остальных выходах. Дальше надо разобраться с динамической индикацией. У вас 4 знака, в которые надо выводить число по-очереди циклически. В каком порядке - не имеет значения. Чтобы обеспечить наиболее быстрое переключение, последовательность такая: 1. В 595-й регистр выводится последовательный код следующего символа по алгоритму, написанному выше. В выходной регистр пока не пишется (состояние RCLK (12) не меняется). Во время длительной операции последовательного вывода на индикаторе всё ещё горит предыдущий символ. 2. Текущая линия выбора знака (на вашей схеме это PC0 - PC3 контроллера) выключается. Знак при этом гаснет. Каким уровнем (0 или 1), зависит от того, какой у вас индикатор - с общим анодом или общим катодом. 3. На выводе RCLK (12) формируется фронт записи в выходной регистр. На выходах микросхемы при этом появляется код следующего знака. 4. Устанавливается активной следующая линия выбора знака. Знак при этом "зажигается". Для четырёхразрядного светодиодного индикатора "перебирать" знаки надо с частотой 60 - 120 Гц, чтобы не было заметно мерцания. Делать частоту выше не стоит - будет уменьшаться яркость. По поводу схемы подключения индикатора. Так, как у вас нарисовано, действительно многие делают, но это некорректно. Ток через светодиодные сегменты надо ограничивать резисторами, а не загонять выходные каскады микросхем в режим ограничения тока. Это для них нештатный режим. Выводы PC0 - PC3 контроллера перегружены по току. Может быть включено одновременно все 7 сегментов (цифра 8), соответственно посчитайте, какой ток требуется с вывода порта PC, и посмотрите в даташите, какой максимальный допустим. Изменено 12 Февраля, 2018 в 15:33 пользователем Lexter Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти