Jump to content
Sign in to follow this  
Дмитрий Т87

Статическая Индикация На Сдвиговых Регистрах В Прерываниях.

Recommended Posts

Здравствуйте. Прошу помощи в теме статитическая индикация 6 разрядного 7ми сегментного индикатора по 2м проводам Data и Clock.

Есть такой код для 3х разрядного индикатора в CVavr Си

Хочу закидывать данные в каждый разряд отдельно, и выводить эти функции в прерываниях avr микроконтроллера.

// cd4094 control example by kalobyte.com 2009
#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>
#define REG_PORT PORTB
#define REG_DDR DDRB
#define REG_PIN_DATA 3
#define REG_PIN_CLK 4
//---
#define REG_DATA_ON REG_PORT|=1<<REG_PIN_DATA;
#define REG_DATA_OFF REG_PORT&=~(1<<REG_PIN_DATA);
#define REG_CLK {REG_PORT|=1<<REG_PIN_CLK;REG_PORT&=~(1<<REG_PIN_CLK);}
unsigned char digs[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; // katode
// unsigned char digs[10]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; //anode
void cd4094_init(void){
char i=0;
while(i!=24){

REG_CLK
i++;
}
}
void cd4094(int dig){
char i,tmp,j;
//dig = 123;
int div[4];
div[1] = digs[dig%10];
dig = dig/10;
div[2] = digs[dig%10];
div[3] = digs[dig/10];

for(j=3;j>0;j--){

tmp = div[j];
for(i=8;i>0;i--){

if(tmp & 0x80){ REG_DATA_ON } else {REG_DATA_OFF}

tmp <<=1;
REG_CLK
}

}
}

int main(void){
int i=1;
REG_DDR = (1<<REG_PIN_DATA)|(1<<REG_PIN_CLK);
REG_PORT = (0<<REG_PIN_DATA)|(0<<REG_PIN_CLK);
cd4094_init();
//cd4094(2);
while(i<999){
_delay_ms(1000);
cd4094(i);
i++;
}

return 0;
}

Вот такая схема

post-198720-0-45583600-1456081668_thumb.gif

Edited by Дмитрий Т87

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. 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...
Sign in to follow this  

  • Сообщения

    • Замеры на резисторах RD 1 и RD 4 как расположены на плате
    • Ещё один туда же. А почему вы все считаете, что если человек попросил помочь с ремонтом, то обязательно идиот или *****й? Посмотрите на себя лет так ...дцать назад. И я ничего не делаю без консультаций со специалистом. У меня с электроникой давно дружеские отношения, вот с инверторами только третий раз сталкиваюсь. До этого монитор отремонтировал с помощью спецов, был ещё телевизор. И не надо смотреть на других свысока! Это не культурно! Никто её не выдирал!!! Видимо не те буквы смотрели)))
    • 24 В при токе 2.5 А это 60 Вт. 27000 вольт при 60 Вт это ток один-два миллиампера. Которые имеют ток утечки выше миллиампера. Собственно, заряжать столь слабым источником не получится, что ты и получил на практике. Перематывай трансформатор на гораздо меньшее напряжение, но на гораздо больший ток, хотя бы в 30 раз!
    • Карочь ребя  , все по  фне шую ...  Холодильник в кухню , капутер  в гостинную ...  
    • Делаю зарядное устройство для электролитических конденсаторов, заряжать решил от ТДКС и схемы ZVS драйвера. Питание беру от лабораторного источника питания (выставляю около 24В и 2,5 А). Зарядить нужно блок флэш электролитов (те, что применяются в вспышке фотоаппаратов, 330В, 120 мкФ каждый) со смешанным подключением (общей емкостью 1280 мФ и напряжением 990В). Этот способ уже рассмотрен здесь: https://youtu.be/et0DtOzbB0U https://youtu.be/t7iZNVMdrU8 Подключил ТДКС к блоку - напряжение зарядки выше 60В не растёт. То есть, показание на мультиметре доходит до 60В и остаётся на месте. При этом, без нагрузки ТДКС работает стабильно, выдаёт хорошую дугу и напряжение выше киловольта. Сами конденсаторы - рабочие. Чем может быть связана такая просадка? Пробовал подключать отдельно линию из 10 параллельных конденсаторов - напряжение достигает максимум 30 В.

  • Модуль защиты от отключения питания. 12-48В DC, 10А.

  • Similar Content

    • By xrou
      Здравствуйте. Собираю светодиодный индикатор. Использую stm32F103C8T6, сдвиговый регистр 74HC595 (HYC 825Z - не знаю что это значит), светодиодный индикатор на 10 светодиодов SHB10R.
      Подключаю по такой схеме
      https://cxemka.com/upload/art/74hc595_spi_stm32/connection_stm32_74hc595_spi.svg
      Код в Keil с использованием HAL и Cube
       
      Проблема: на индикаторе то вообще ничего не зажигается, то надо раз 10 нажать резет и только спустя какое то время оно начинает работать, но не правильно:

      По идее оно должно зажечь сначала весь индикатор, 4 светодиода, 2 и так по кругу. Но оно иногда проскакивает состояния, зажигает левые светодиоды.

      Подскажите в чем может быть проблема, изучаю stm совсем не много еще толком ничего не знаю. Можно ли вообще использовать HAL для передачи данных? или писать самому.
       
    • By Владислав Семёнов
      Доброго дня!
      Много дней бьюсь со схемой, разводил сам, делаю автополивалку на ESP32 для комнатных растений.
      Суть загвоздки. Без нагрузки всё работает идеально, регистры переключаются, всё короче чудно. Но как только подключаешь хотя бы один движок - всё, финита. В момент запуска открытый(т.е. низкий. Т.к. транзы P-канальные, низкий уровень=открытый транзистор. Буду далее называть низкий уровень на регистре открытым) разряд регистра закрывается, при этом может самопроизвольно открыться более высокий разряд(а может самый низкий. Или даже возможно ещё какой, не ловил - не знаю). При этом программа на МК продолжает исполняться штатно. Если принудительно постоянно писать в регистр нужное состояние, движки кое-как крутят, но это лютый костыль и вообще не дело. На картинке уже вторая итерация платы, в ней добавлено раздельное питание для силовой и логической части. Т.е. регистр потребляет свои +5В, а исток транзисторов подключён к своим +5. Это вроде как решает проблему, но ровно до того момента, пока я не подключаю питание датчика (датчик влажности почвы, простой, резистивный, питание на все датчики разом открывает ещё один транзистор, подключенный к 0-му разряду регистра) - после этого схема снова начинает чудить. Перебросил питание датчиков с 3.3 на +5(придётся городить делитель для сигнальной линии, но пусть так, чёрт с ним), чудеса более-менее прекращаются. Но всё равно, нет-нет да откроется ненужный разряд. Чую, что где-то порылся какой-то косяк, но найти его не могу.
       


    • By Сергей Фомин
      Изучаю прерывания на attiny13. Пока остановился на прерываниях по переполнению. Сделал тестовый код в Atmel Studio и сразу через программатор заливаю на тиньку со светодиодом. Проблема в том что гореть он должен 10 секунд и выключаться, а горит примерно 20-23 секунды. Прошу помощи в правильном расчёте. Код ниже (пока учусь сильно не ругайтесь) :
      #define F_CPU 1000000 #define LED PB2 #include <avr/io.h> //#include <util/delay.h> #include <avr/interrupt.h> unsigned char work_time =384;    //  1000000/1024/256=3.8  (0.026 сек)    10/0.026=384 volatile unsigned char temp =0; ISR (TIM0_OVF_vect) {      TCNT0=0x00;     temp ++;     if (temp>=work_time)     {         PORTB &=~(1<<LED);  //Инвертируем состояние         TCCR0B=0x00    // остановка таймера         cli (); //общее запрещение прерываний     } } int main (void) {     init();               while (1)     {              } } void init () {          DDRB |= (1<<LED); // выход     PORTB =(1<<LED); //включен     TCCR0B =0x05; // установка делителя на 1024     TIMSK0 |= _BV(TOIE0);     sei();   // Либо SREG |= (1<<SREG_I); //Разрешаем прерывания глобально     TCNT0 = 0X00;        //Обнулить счётный регистр }  
    • By RIMUS1989i
      Здравствуйте. Затеялся собрать анализатор спектра на светодиодах, 20x20 светодиодов, МК ATMEGA328P. 
      Долго ломал голову, как переключать столбцы без использования МК, дабы его не загружать.И вот что у меня получилось. Набросал тестовую прошивку для теста в протеусе. 
      При инилизации подается импульс на вторую ножку U4a, и на предпоследнем столбце.
      Думал сетку сделать на 5 сдвиговых регистрах (как раз 40 сигнальных линий), но боюсь мощности МК не хватит для обработки FFT и вывода на матрицу, будет подвисать.
      Кто что думает по поводу схемы?
      бегущая строка.pdsprj Natali_2012_program.hex
    • By katet
      Добрый день. Может быть,кто-нибудь уже сталкивался с таким. 
      Занимаюсь доработкой чужого проекта в среде STM32CubeMX, первый раз работаю с библиотекой HAL.
      В этом проекте осуществлялся прием байт по USART1 из ComMon. Проект был открыт в STM32CubeMX, где мной дополнительно были активированы новые модули - RTC, SD, USART2. Настройки USART1 не менялись. 
      Часы реального времени RTC: питание от батарейки, тактирование – от LSE. 
      При приеме байт по USART1 в новом проекте (активны  USART1, RTC, SD, USART2) было выявлено, что после приема 2 байт по USART1 перестает инкрементироваться значение переменной uwTick, отвечающей за прерывания Systick, в результате чего дальнейшая отладка невозможна. Не удается выяснить, в каком месте и почему перестает увеличиваться значение uwTick. При работе со старым проектом (где активен только USART1) uwTick инкрементируется после приема 2 байт.
      Смены приоритета прерываний не происходит, в  функцию HAL_Delay() отладчик не попадает. При вызове функции HAL_ResumeTick(), возобновляющей прерывания Systick, ничего не меняется, значение uwTick остается неизменным.
      Остановка прерываний была обнаружена при попадании в функцию:
      static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
      {
        /* Wait until flag is set */
        while((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status) 
        {
          /* Check for the Timeout */
          if(Timeout != HAL_MAX_DELAY)
          {            
            if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))
            {
              /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
              CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
              CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
              
              huart->gState  = HAL_UART_STATE_READY;
              huart->RxState = HAL_UART_STATE_READY;
              
              /* Process Unlocked */
              __HAL_UNLOCK(huart);
              
              return HAL_TIMEOUT;
            }
          }
        }
        
        return HAL_OK;
      }
      В новом проекте текущее значение uwTick, возвращаемое функцией HAL_GetTick(), всегда равно значению Tickstart. В старом проекте сначала также, но затем uwTick начинает увеличиваться. Выяснить, в каком именно месте кода значение uwTick должно начать увеличиваться, не удается.
      Может быть, у кого-нибудь есть хоть какие-то идеи, с чем может быть связана остановка увеличения значений uwTick, помогите пожалуйста)
      Распиновка и конфигурация обоих проектов: верхняя часть рисунков - первоначальный, работающий вариант,  нижняя - сбой прерываний Systick.


×
×
  • Create New...