Jump to content

Recommended Posts

В общем есть небольшая тривиальная задача - сделать свитюльку. Контроллер управляет светодиодиками, цвета меняются, людишки довольны.
Схема проста: Attiny44a -> 2n3904 x3 -> RGB-светодиод.
Собрал, протестил, всё норм, но!
Как только в коде я использую функцию задержки - _delay_ms (util/delay.h) - контроллер повисает!

#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{        
    // Input/Output Ports initialization
    // Port A initialization
    // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
    DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
    // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
    PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);

    // Port B initialization
    // Function: Bit3=In Bit2=Out Bit1=In Bit0=In
    DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0);
    // State: Bit3=T Bit2=0 Bit1=T Bit0=T
    PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 16000,000 kHz
    // Mode: Phase correct PWM top=0xFF
    // OC0A output: Non-Inverted PWM
    // OC0B output: Non-Inverted PWM
    // Timer Period: 0,031875 ms
    // Output Pulse(s):
    // OC0A Period: 0,031875 ms Width: 0 us
    // OC0B Period: 0,031875 ms Width: 0 us
    TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00);
    TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00);
    TCNT0=0x00;
    OCR0A=0x00;
    OCR0B=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 16000,000 kHz
    // Mode: Ph. correct PWM top=0x00FF
    // OC1A output: Non-Inverted PWM
    // OC1B output: Disconnected
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer Period: 0,031875 ms
    // Output Pulse(s):
    // OC1A Period: 0,031875 ms Width: 0 us
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10);
    TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 0 Interrupt(s) initialization
    TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0);

    // Timer/Counter 1 Interrupt(s) initialization
    TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1);

    // External Interrupt(s) initialization
    // INT0: Off
    // Interrupt on any change on pins PCINT0-7: Off
    // Interrupt on any change on pins PCINT8-11: Off
    MCUCR=(0<<ISC01) | (0<<ISC00);
    GIMSK=(0<<INT0) | (0<<PCIE1) | (0<<PCIE0);

    // USI initialization
    // Mode: Disabled
    // Clock source: Register & Counter=no clk.
    // USI Counter Overflow Interrupt: Off
    USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC);

    // Analog Comparator initialization
    // Analog Comparator: Off
    // The Analog Comparator's positive input is
    // connected to the AIN0 pin
    // The Analog Comparator's negative input is
    // connected to the AIN1 pin
    ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
    ADCSRB=(0<<ACME);
    // Digital input buffer on AIN0: On
    // Digital input buffer on AIN1: On
    DIDR0=(0<<ADC1D) | (0<<ADC2D);

    // ADC initialization
    // ADC disabled
    ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
    
        
    unsigned char    VL_OCR0A = 0,
                    VL_OCR0B = 0,
                    VL_OCR1A = 0;

    OCR0A = 0;
    OCR0B = 0;
    OCR1A = 0;
    
    while(1)
    {                
        _delay_ms( 100 );
        
        VL_OCR0A = VL_OCR0A + 1;
        VL_OCR0B = VL_OCR0B + 1;
        VL_OCR1A = VL_OCR1A + 1;    
        
        if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; }
        if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; }
        if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; }
            
        OCR0A = VL_OCR0A;
        OCR0B = VL_OCR0B;
        OCR1A = VL_OCR1A;
    }
}

Т.е. если указать задержку в начале цикла, то светодиод не светится вообще.
Если задержку убрать - светодиод немного подсвечивает всеми цветами.

while(1)
{                
        _delay_ms( 100 ); // <--- ЗАДЕРЖКА ---
        
        VL_OCR0A = VL_OCR0A + 1;
        VL_OCR0B = VL_OCR0B + 1;
        VL_OCR1A = VL_OCR1A + 1;    
        
        if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; }
        if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; }
        if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; }
            
        OCR0A = VL_OCR0A;
        OCR0B = VL_OCR0B;
        OCR1A = VL_OCR1A;
}

Где я накосячил?
З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает :(

Share this post


Link to post
Share on other sites
16 часов назад, Антон Плюшкин сказал:

Собрал, протестил, всё норм,

 

16 часов назад, Антон Плюшкин сказал:

Если задержку убрать - светодиод немного подсвечивает всеми цветами.

Поточнее опишите.

Share this post


Link to post
Share on other sites

Как затактирован МК? По коду 16 МГц - это значит, внешний кварц? Или внешнего кварца нет и тактируется по умолчанию?

Share this post


Link to post
Share on other sites

Конденсаторы Panasonic. Часть 4. Полимеры – номенклатура

В заключительной, четвертой статье из цикла «Конденсаторы Panasonic» рассматриваются основные достоинства и особенности использования конденсаторов этого японского производителя на основе полимерной технологии. Главной конструктивной особенностью таких конденсаторов является полимерный материал, используемый в качестве проводящего слоя. Полимер обеспечивает конденсаторам высокую электрическую проводимость и пониженное эквивалентное сопротивление (ESR). Номинальная емкость и ESR отличается в данном случае высокой стабильностью во всем рабочем диапазоне температур. А повышенная емкость при низком ESR идеальна для решения задач шумоподавления и ограничения токовых паразитных импульсов в широком частотном диапазоне.

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

17 часов назад, Антон Плюшкин сказал:

контроллер повисает!

А тактовая у него точно 16 МГц?

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...

  • Similar Content

    • By Anton Bondarenko
      Всем привет
      Прошу не ругать, впервые подобный вопрос задаю.
      Хочу сделать прибор, который будет посылать сигнал, когда возле прибора будет проходить металлический предмет. 
      — угол отслеживания до 30° а лучше прямая линия, траектория
      — время реакции очень высокое до 100 мс
      — ширина проема в котором нужно сканировать от 10 до 20метров,
      — передача сигнала через вифи
      Может есть готовые решения, или отдельные компоненты.
      Подскажите пжл в каком направлении искать.
      Смотрел датчики движения, но главная проблема — время реакции.
      Спасибо
       
    • By Вячеслав_НС
      Здравствуйте ! подскажите , какую лучше библиотеку использовать (и где ее взять) для управления i2c atmega8 в atmel studio 7  .  задача - управлять atmega8 по i2c ,  цап  PCF8591T .
      понимаю , в интернете много примеров и библиотек , но хотелось бы пример максимально простой и точно рабочий . т.к. пока что все мои попытки не привели к успеху ... то Atmel Studio 7 при компиляции ругается на несуществующий файл ( к примеру - "stream.h") при использовании библиотеки i2c , то еще какие то грабли .
    • By Sofia Vin
      Предлагаем проектную работу в Москве:
      Микроконтроллер STM32F103.
        
      Есть встроенный код с использованием функций библиотеки FreeRTOS, код имеет описанный протокол для связи с внешним миром.
        
      Необходимо проводить доработку кода под задачи программиста верхнего уровня и его тестирование в составе оборудования. 
      Работа в лаборатории (м.Университет) и удаленно. 
      Оплата по договоренности.
      Если Вы обладаете опытом схемотехнического проектирования и программирования микроконтроллеров, и Вас заинтересовала данная возможность, ждем Ваши отклики по контактным данным:
      8 (925) 023-60-02   Алексей
      E-mail: nassa@marathon.ru
       
    • Guest Денис
      By Guest Денис
      В общем, есть такое чудо китайской техники (фото)
      Что оно может:
      1. Заряжаться через microUSB порт
      2. Кнопка вкл/выкл, она же переключает режимы
      3. 3 режима свечения светодиода (он светит разными цветами)
      Что я хочу сделать:
      1. Пункты 1 и 2 выше
      2. Разнообразить количество режимов, переливание статичный цвет и тд...
      Вопрос: как это сделать? что купить?

      P.S. К сожалению, в гугле не нашел подробной инструкции, а я в электронике я дуб дубом


    • By bustamax
      Привет хочу сделать лазерный проектор по типу элт монитора. Из vga разъёма выходят 2 Синала срочной и кадровой развёртки. Со строчной разобрался. Вопрос по кадровой. Она будет реализована с помощью гальванометра который после каждой строки отклоняет зеркало на какой то угол ( пускай строк 480 тогда если взять напряжение управления гальво от 0 до 10 вольт и шаг задать 0,01 в - будет 1000 строк) даже если строк будет 720 в 1000 они уместятся.
      Так вот принцип придумал такой - с выхода Hsync поступает сигнал строки - микросхема прибавляет пускай напряжение +0,01 вольт, затем поступает 2й сигнал от Hsync микросхема прибавляет ещё 0,01 вольт ( напряжение 0,02) наш гальво отклонился уже до 3й строки и так далее пока не поступит сигнал VSYNC о смене кадра - Гальво возвращается в 0.
      Хотя правильней вот так:
      Либо сделать что бы гальво двигался при отсутствии сигнала Hsync - скажем поступает сигнал строчной развёртки отрабатывает строчная развертка затем сигнал становится логическим 0 и тут срабатывает гальво и т.д пока не придёт сигнал от vsync (логическая 1).
       
      по факту схема даж считать не должна - есть сигнал прибавляем есть другой сигнал сбрасываем
       Я в электронике логический 0 но спаять по приведённой схеме смогу)
      если кто поможет спасибо
       
       
  • Сообщения

    • Тогда мостик отдеьныф убрать
    • Нужно пересчитать трансформатор, витков в первичке возможно мало, поэтому ток в первичке возрастает, на шунте повышается амплитуда выбросов и микра периодически софтстартует... ДГС не подтягивает питание, а прилагает встречное напряжение/ток к другому выходу... я немного отвлекусь, Вы тут не скучайте  
    • @Olegoff , у Вас ведь выходная цепь гальванически соединена с питанием. Зачем все эти изощрения? Гляньте-ка здесь: 1) https://cxem.net/avto/electronics/4-172.php 2) https://cxem.net/pitanie/5-343.php Может, что-то возьмете для себя.
    • а здесь она и не имеет связи с другим выходом) -50вольт- к чему он будет подтягивать напряжение в динамике - к земле ? обмотки ДГС должны быть примерно такого количества что трансформаторhttps://leoniv.livejournal.com/228551.html
    • Но эти 5 витков мало что изменят,магнитопровод имеет разброс.Расчеты в программе не с особой точностью прям.Знать бы мне реальную марку кольца и магнитную проницаемость.Знаю только что еще сссровское.может быть и НМ3000.
    • да не , удорожит дежурка - да и не нужна она в этом усилке - попробую провести питание - как сделано в ирке -с обшей силовой землей.имхо наверно поступлю так - разведу первичку - вторичка только силовая - запущу - ес нет) то хоть не очень большой кусок текстолита выкидывать.имхо
    • Помнится питание 3525 на отдельной плате делалось или трансформатор и были готовые залитые блоки,впаивались в основную плату Поищи на коте Я не с компа
  • Покупай!

×
×
  • Create New...