Перейти к содержанию

SigmA

Members
  • Постов

    3
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные SigmA

  1. 1 час назад, WinneR сказал:

     В 8 меге ещё 2 таймера есть! Зачем эта куча задержек??? Можно же функцию написать, которая раз в 10 меньше кода будет занимать. 

    Конечно можно. Этим завтра я и буду заниматься. Теперь-то я знаю как это делается. Мне главное было решить задачу, которая образовалась изначально. 

     

  2. Только что, artos5 сказал:

    Конечно программный ШИМ работать не будет. 

     

    Это почему же? Два часа усиленного штудирования публикаций о таймерах/счетчиках, прерываниях и т.д, привело к результату.

    Для меня было открытием, что помимо глобального разрешения прерываний #asm("sei") , есть еще и запрет #asm("cli") , теперь все прекрасно работает)))

    
        #include <mega8.h>
        #include <delay.h> 
        #define GREEN PORTC.1=PORTC.2=PORTC.3=PORTC.0 
        
         unsigned char i, s, t=5, tt=200;
        unsigned char  green=255;
    unsigned char  green_b;     //переменные, для буферизации значений скважности ШИМ
    unsigned char count;                            //переменная- счетчик вызовов обработчика прерываний
    unsigned char temp=1;
         interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    count++;
    if (count == 0){                                //если счетчик переполнился и принял значение 0
            
                                     //сохранием значения в буфер
            green_b = green; 
            
           
                                       //выставляем ноги, отвечающие за ШИМ в логическую 1
            GREEN = 1; 
                             
           
            }
    
                 //по достижении заданной скважности выводим логический 0 в ножку МК
    if (green_b == count) { GREEN = 0;}
    }
    
        void main(void)
    
        {  
         PORTC=0x0F;                                     //конфигурируем порт
    DDRC=0x0F;
    
    TCCR0=0x01;                                     //настраиваем таймер
    TCNT0=0x00;
    
    TIMSK=0x01;                                     //разрешаем генерацию прерывания по переполнению таймера T0
    
                                        //глобально разрешаем прерывания
    
        
    
    
        while (1)
            {      
                #asm("sei") 
                if (temp==1) {if (green < 255)   green += 1; else temp = 2;}
                if (temp==2) {if (green   >   0)   green   -= 1; else temp = 3;}
            if (temp==3) {if (green < 255)   green += 1; else temp = 4;}  
            if (temp==4) {if (green   >   0)   green   -= 1; else temp = 5;}
            if (temp==5) {if (green < 255)   green += 1; else temp = 6;}
            if (temp==6) {if (green   >   0)   green   -= 1; else temp = 7;}
            if (temp==7) {if (green < 255)   green += 1; else temp = 8;}
            if (temp==8) {if (green   >   0)   green   -= 1; else temp = 9;}
            if (temp==9) {if (green   <   255)    #asm("cli"); temp = 10; }
             delay_ms(t); 
            
            if (temp==10) {if (green   == 0) 
             
              s=2;
       for (i=0;i<=s;i++)
            { 
            PORTC.0=1;
            delay_ms(tt);
            PORTC.0=0;
            
            PORTC.1=1;
            delay_ms(tt);
            PORTC.1=0;
            
            PORTC.2=1;
            delay_ms(tt);
            PORTC.2=0;
            
            PORTC.3=1;
            delay_ms(tt);
            PORTC.3=0;
            
            }        
            
                 for (i=0;i<=s;i++)
            { 
            PORTC.3=1;
            delay_ms(tt);
            PORTC.3=0;
            
            PORTC.2=1;
            delay_ms(tt);
            PORTC.2=0;
            
            PORTC.1=1;
            delay_ms(tt);
            PORTC.1=0;
            
            PORTC.0=1;
            delay_ms(tt);
            PORTC.0=0;
            
            }
             
                  for (i=0;i<=s;i++)
            { 
            PORTC.3=1;
            delay_ms(tt);
            
            
            PORTC.2=1;
            delay_ms(tt);
            ;
            
            PORTC.1=1;
            delay_ms(tt);
            
            
            PORTC.0=1;
            delay_ms(tt);
            
             PORTC.3=0;
            delay_ms(tt);
            
            
            PORTC.2=0;
            delay_ms(tt);
            
            
            PORTC.1=0;
            delay_ms(tt);
            
            
            PORTC.0=0;
            delay_ms(tt);
            
            
            }  
             for (i=0;i<=s;i++)
            { 
            PORTC.0=1;
            delay_ms(tt);
            
            
            PORTC.1=1;
            delay_ms(tt);
            ;
            
            PORTC.2=1;
            delay_ms(tt);
            
            
            PORTC.3=1;
            delay_ms(tt);
            
             PORTC.0=0;
            delay_ms(tt);
            
            
            PORTC.1=0;
            delay_ms(tt);
            
            
            PORTC.2=0;
            delay_ms(tt);
            
            
            PORTC.3=0;
            delay_ms(tt);
            }              
                for (i=0;i<=s;i++)
            { 
           PORTC=0x01;
           delay_ms(tt);
           PORTC=0x02;
           delay_ms(tt);
           PORTC=0x04;
           delay_ms(tt);
            PORTC=0x08;
           delay_ms(tt);
           PORTC=0x09;
           delay_ms(tt);
            PORTC=0x0A;
           delay_ms(tt);
           PORTC=0x0C;
           delay_ms(tt);
            PORTC=0x0D;
           delay_ms(tt);
           PORTC=0x0E;
            delay_ms(tt);
           PORTC=0x0F; 
           
           delay_ms(tt);
            PORTC=0x07;
           delay_ms(150);
           PORTC=0x0B;
           delay_ms(tt);
           PORTC=0x03;
           delay_ms(250);
           PORTC=0x05;
           delay_ms(300);
            PORTC=0x09;
           delay_ms(350);
           PORTC=0x01;
           delay_ms(400);
            PORTC=0x02;
           delay_ms(tt);
           PORTC=0x04;
           delay_ms(tt);
            PORTC=0x08;
           delay_ms(tt);
           PORTC=0x00;
            delay_ms(tt);
            }
            for (i=0;i<=5;i++)
                {
                 PORTC=0x0f;
                 delay_ms(100);
                 PORTC=0x00; 
                 delay_ms(100);
                 PORTC=0x0f;
                 delay_ms(100);
                 PORTC=0x00; 
                 delay_ms(100);
                 PORTC=0x0f;
                 delay_ms(100);
                 PORTC=0x00; 
                 delay_ms(150);
                 PORTC=0x0f;
                 delay_ms(300);
                 PORTC=0x00; 
                 delay_ms(100);
                  PORTC=0x0f;
                 delay_ms(300);
                 PORTC=0x00; 
                 delay_ms(100);
                  PORTC=0x0f;
                 delay_ms(300);
                 PORTC=0x00; 
                 delay_ms(150); 
                  PORTC=0x0f;
                 delay_ms(100);
                 PORTC=0x00; 
                 delay_ms(100);
                 PORTC=0x0f;
                 delay_ms(100);
                 PORTC=0x00; 
                 delay_ms(100);
                 PORTC=0x0f;
                 delay_ms(100);
                 PORTC=0x00; 
                 delay_ms(1000); temp=1;
                 
                }  
            
                #asm("sei") 
            
               
               
            }        
         }
           }

     

  3. Доброго времени суток всем. Для своей новой жены захотелось мне сделать сердечко на atmega8, с кучей эффектов и т.д. Так вот, разные мигалки-переключалки св-диодов я написал, использовал delay. Но мне этого стало мало и я решил подключить шим программный. Отдельно от всей программы шим работает как нужно, так же и переключалки работают отдельно от шим, но вот когда я соединяю это всё воедино то работает только шим и не переходит дальше по коду.Я так понимаю, что таймеры и delay вместе работать не могут? Но если могут, то как?

        #include <mega8.h>
        #include <delay.h>
        #define GREEN PORTC.1=PORTC.2=PORTC.3=PORTC.0
       
        unsigned char i, s,;
        unsigned char  green=255;
        unsigned char  green_b;     //переменные, для буферизации значений скважности ШИМ
        unsigned char count;                            //переменная- счетчик вызовов обработчика прерываний
        unsigned char temp=1; 
        interrupt [TIM0_OVF] void timer0_ovf_isr(void)
        {
        count++;
        if (count == 0){                                //если счетчик переполнился и принял значение 0
           green_b = green; 
           GREEN = 1; 
          }
    
        if (green_b == count) { GREEN = 0;}
        }
    
        void main(void)
    
        {  
        PORTC=0x0F;                                     //конфигурируем порт
        DDRC=0x0F;
        TCCR0=0x01;                                     //настраиваем таймер
        TCNT0=0x00;
        TIMSK=0x01;                                     //разрешаем генерацию прерывания по переполнению таймера T0
    
        #asm("sei")                                     //глобально разрешаем прерывания
    
                
    
    
        while (1)
            {  
            for (i=0;i<3;i++)
                        
            {
            if (temp==1) {if (green < 255)   green += 1; else temp = 2;}                                                
            if (temp==2) {if (green   >   0)   green   -= 1; else temp = 1;}
                    
            delay_ms(1000);   
    
            };
           
            s=7;
            for (i=0;i<=s;i++)
            { 
            PORTC.0=1;
            delay_ms(200);
            PORTC.0=0;
                    
            PORTC.1=1;
            delay_ms(200);
            PORTC.1=0;
                    
            PORTC.2=1;
            delay_ms(200);
            PORTC.2=0;
                    
            PORTC.3=1;
            delay_ms(200);
            PORTC.3=0;
                    
            }        
                    
            for (i=0;i<=s;i++)
            { 
            PORTC.3=1;
            delay_ms(200);
            PORTC.3=0;
                    
            PORTC.2=1;
            delay_ms(200);
            PORTC.2=0;
                    
            PORTC.1=1;
            delay_ms(200);
            PORTC.1=0;
                    
            PORTC.0=1;
            delay_ms(200);
            PORTC.0=0;
                    
            }
                     
            for (i=0;i<=s;i++)
            { 
            PORTC.3=1;
            delay_ms(200);
                    
                    
            PORTC.2=1;
            delay_ms(200);
            ;
                    
            PORTC.1=1;
            delay_ms(200);
                    
                    
            PORTC.0=1;
            delay_ms(200);
                    
             PORTC.3=0;
            delay_ms(200);
                    
                    
            PORTC.2=0;
            delay_ms(200);
                    
                    
            PORTC.1=0;
            delay_ms(200);
                    
                    
            PORTC.0=0;
            delay_ms(200);
                    
                    
            }  
             for (i=0;i<=s;i++)
            { 
            PORTC.0=1;
            delay_ms(200);
                    
                    
            PORTC.1=1;
            delay_ms(200);
            ;
                    
            PORTC.2=1;
            delay_ms(200);
                    
                    
            PORTC.3=1;
            delay_ms(200);
                    
            PORTC.0=0;
            delay_ms(200);
                    
                    
            PORTC.1=0;
            delay_ms(200);
                    
                    
            PORTC.2=0;
            delay_ms(200);
                    
                    
            PORTC.3=0;
            delay_ms(200);
            }              
            for (i=0;i<=s;i++)
            { 
           PORTC=0x01;
           delay_ms(200);
           PORTC=0x02;
           delay_ms(200);
           PORTC=0x04;
           delay_ms(200);
            PORTC=0x08;
           delay_ms(200);
           PORTC=0x09;
           delay_ms(200);
            PORTC=0x0A;
           delay_ms(200);
           PORTC=0x0C;
           delay_ms(200);
            PORTC=0x0D;
           delay_ms(200);
           PORTC=0x0E;
            delay_ms(200);
           PORTC=0x0F; 
                   
           delay_ms(200);
            PORTC=0x07;
           delay_ms(150);
           PORTC=0x0B;
           delay_ms(200);
           PORTC=0x03;
           delay_ms(250);
           PORTC=0x05;
           delay_ms(300);
            PORTC=0x09;
           delay_ms(350);
           PORTC=0x01;
           delay_ms(400);
            PORTC=0x02;
           delay_ms(200);
           PORTC=0x04;
           delay_ms(200);
            PORTC=0x08;
           delay_ms(200);
           PORTC=0x00;
            delay_ms(200);
            }
            for (i=0;i<=5;i++)
                {
                 PORTC=0x0f;
                 delay_ms(100);
                 PORTC=0x00; 
                 delay_ms(100);
                 PORTC=0x0f;
                 delay_ms(100);
                 PORTC=0x00; 
                 delay_ms(100);
                 PORTC=0x0f;
                 delay_ms(100);
                 PORTC=0x00; 
                 delay_ms(150);
                 PORTC=0x0f;
                 delay_ms(300);
                 PORTC=0x00; 
                 delay_ms(100);
                  PORTC=0x0f;
                 delay_ms(300);
                 PORTC=0x00; 
                 delay_ms(100);
                  PORTC=0x0f;
                 delay_ms(300);
                 PORTC=0x00; 
                 delay_ms(150); 
                  PORTC=0x0f;
                 delay_ms(100);
                 PORTC=0x00; 
                 delay_ms(100);
                 PORTC=0x0f;
                 delay_ms(100);
                 PORTC=0x00; 
                 delay_ms(100);
                 PORTC=0x0f;
                 delay_ms(100);
                 PORTC=0x00; 
                 delay_ms(1000);
                         
                }        
                    
                    
            }        
         }

     

×
×
  • Создать...