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

Тестирование литиевых батареек Fanso в нормальных условиях

Компания Компэл, эксклюзивный дистрибьютор компании Fanso, предлагает широкий перечень ЛХИТ, позволяющий подобрать элемент питания, в наибольшей степени соответствующий конкретным требованиям. Для тестирования параметров, указанных в Datasheet, специалисты Компэл организовали в апреле 2019 г. полугодовой тест на постоянный разряд в нормальных условиях четырех наиболее популярных моделей литий-тионилхлоридных и литий-диоксидмарганцевых батареек Fanso.

Посмотреть результаты первого среза

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

    • 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 но спаять по приведённой схеме смогу)
      если кто поможет спасибо
       
       
    • By small girl
      Привет, ребят! Кто возьмется написать на С протокол взаимодействия для сети микроконтроллеров. База: STM32 с bluetooth модулем HC-06,- slave. ПК - master?

      За вознаграждение
    • By LegionKC
      Добрый день.
      Экспериментирую с платой TP4056 и MK ATmega8, конкретнее - пытаюсь собрать простенькое зарядное устройство с выводом параметров при зарядке/разрядке на АЦП МК. Для измерения тока нашел ACS712. Думаю, что получится выводить ток при зарядке (т.е. когда идет питание на TP4056 и нагрузка отключена) и при разрядке (питание выключено, нагрузка подключена). Нагрузка - резистор. Возникла проблема с измерением напряжения на АКБ. Вернее, проблема с отсутствием идей как это сделать. Может какую-нибудь схему делителя напряжения нужно сделать? Прошу помочь советом. Схему из пэинта прилагаю.
      Спасибо.
       

  • Сообщения

    • ХА-ХА-ХА пожрал !!!!! Спасибо.
    • хахаха покажи свой первый вопрос. зачем это тут? да, бп вполне работает, емкость только на вход надо.
    • Отойдите от розетки .. от  греха подальше   - то есть от электроники
    • Согласен. Итак: не Путин начал развал, и не он его закончил. Согласны? Начал развал Ельцин, а закончился он сам по себе в силу "исчерпания ресурса". И кто рулил, на это никак не повлиял. Зато тот, кто рулил, повлиял на начало работы того, что осталось, а так же вновь образованного. Согласны? У меня в городе закрылось 6 заводов и заводиков, на их месте сейчас торговые центры. Зато осталось два "градообразующих" предприятия, которые стали регулярно платить зарплату, повышать ее и т.д. - и это как раз при Путине произошло. Это есть факт. На НЭВЗе при Ельцине зарплату выдавали утюгами и китайскими сапогами, а сейчас - рублями  И идет постоянный набор персонала. Правда, уже не 14 тысяч человек работает, а то ли 9, то ли около того - не знаю точных цифр. Ну и "Электродный" тоже как-то работает, хоть и не так, как в СССР (по объемам - по деньгам не знаю). Вот это все - объективная реальность, а не пропаганда. А то, что взяли в руки "эффективные менеджеры" при Ельцине, то и до сих пор на ладан дышит - тот же завод Магнит возьмите. Он и при Ельцине в коматозе был, и сейчас ни жив, ни мертв. И если он помрет - вряд ли будет виноват Путин. Кстати, я бы сказал, что развал и не Ельцин даже начал, а "младореформаторы" - Гайдар, Чубайс и Немцов. Ельцин лишь дал им порулить...
    • Ну покажите нам, что там в *.lss файле - листинг то есть покажите. Может, и вправду что-то у вас не то с задержкой выходит. Хотя это настолько удивительно, что если это окажется правдой - я буду очень сильно удивлён...
    • Надо быть объективным до конца - те кто рулил тогда - рулит и сейчас)) и Господина Путина усе устраивает, жесть, когда у нас вообще вот эта манера пропадет - ПРИ Путине - ПРИ Сталине)) вот это не здоровое отношение нас и крутит)) имхо
×
×
  • Create New...