Jump to content
Alek_von_German

Atmega8 timer0 не запускается

Recommended Posts

Доброго времени всем. Сижу осваиваю таймеры на atmega8. Играюсь с разными режимами работы и т.д. Только вот непоняточка вышла одна, timer0 работающий в proteus не работает в железе, хотя параллельно ему работает timer1. Я сначала подумал, что контроллер гавкнул, заменил- результат тот же. Потом решил переключить на timer2, при таких же настройках он заработал на всех камнях, а вот нулевой не хочет. Даже 328-ю мегу взял, и на ней ничего не заработало... Поправте меня, можт это я туплю и его отдельно где включать нужно?

#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

char dig[] = {0b10000001, 0b11110011, 0b01001001, 0b01100001, 0b00110011, 0b00100101, 0b00000101, 0b11110001, 0b00000001, 0b00100001, 0b00000000};
char razr[] = {0b11111110, 0b11111101, 0b11111011, 0b11110111};
unsigned char display[2];
unsigned char  i, a=0;
unsigned int z=0;
unsigned char dig1, dig2, dig3, dig4;

ISR(TIMER0_OVF_vect)
{
    TCNT0=178;
    a++;
    if (a>10)
    {
        z++;
        a=0;
    }
}


void write_display(unsigned char *data)
{
    unsigned char mask,i;
   
    for(i = 0; i < 2; i++)
    {
        mask = 0x80;
       
        for(char k = 0; k < 8; k++)
        {
            // Сравниваем каждый бит с единицей
            if(data[i] & mask)
            {
                PORTB |= (1 << 0); // DATA 1
                PORTB |= (1 << 1); // CLK 1
                PORTB &= ~(1 <<1); // CLK 0
            }
            else
            {
                PORTB &= ~(1 << 0); // DATA 0
                PORTB |= (1 << 1); // CLK 1
                PORTB &= ~(1 << 1); // CLK 0
            }
            mask = mask >> 1; // Сдвигаем биты
        }
    }
    // Защелкиваем регистр
    PORTB |= (1 << 2);
    PORTB &= ~(1 << 2);
}



ISR (TIMER1_COMPA_vect)
{
   
    dig4=dig[z % 10000 / 1000];
    dig3=dig[z % 1000 / 100];
    dig2=dig[z % 100 / 10];
    dig1=dig[z % 10];
   
    display[0] =  razr[3];
    display[1] = ~ dig4;
    write_display(display);
   
    display[0] =  razr[3];
    display[1] =  dig[10];
    write_display(display);
   
   
    display[0] =  razr[2];
    display[1] = ~ dig3;
    write_display(display);
   
    display[0] =  razr[2];
    display[1] =  dig[10];
    write_display(display);
   
    display[0] =  razr[1];
    display[1] =  ~dig2;
    write_display(display);
   
    display[0] =  razr[1];
    display[1] =  dig[10];
    write_display(display);

    display[0] =razr[0];    // в крайний левый символ
    display[1] =~ dig1;        // выводится цифра
    write_display(display);
   
    display[0] =  razr[0];    // в крайний левый символ
    display[1] =  dig[10];        // выводится цифра
    write_display(display); // и посылается на 74hc595
   
}
/*
*/
int main(void)
{
    DDRB = 0xFF;
    PORTB = 0x00;
    DDRC=0xff;
    PORTC=0x03;
    TCCR0A=0;
    TCNT0=178;
   
    TCCR0B=(1<<CS02)|(1<<CS00);
   
    TIMSK0|=1<<TOIE0;
   
    TCCR1A = 0x00;
    TCCR1B = (1<<WGM12) | (1<<CS11)  | (1<<CS10);
    TCNT1H = 0;
    TCNT1L = 0;
    OCR1A=5;
   
    TIMSK1 |= (1<<OCIE1A);
   
    sei();

    while (1)
    {
    }
}

 

Share this post


Link to post
Share on other sites
10 минут назад, aitras сказал:

А что-за TIMSK0, TIMSK1?

это я на атмега328 портировал... там такие регистры стоят

 

Share this post


Link to post
Share on other sites

Время – деньги и наноамперы: применение часов реального времени Maxim Integrated

Зачем использовать внешнюю микросхему часов реального времени (RTC), а не внутренние RTC микроконтроллера? Хотя бы потому, что у RTC MAX31342 производства Maxim Integrated типовое потребление составляет 150 нА при 3 В и температуре 25°С, а у встроенных RTC одного из самых малопотребляющих микроконтроллеров при тех же условиях – примерно 370 нА.

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

Вот конкретно для меги8 код,

в протеусе работает, в железе только нули загораются, таймер 0 не считает ничего

#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
//#include <util/delay.h>

const char dig[] = {
    0b10000001, //0
    0b11110011, //1
    0b01001001, //2
    0b01100001, //3
    0b00110011, //4
    0b00100101, //5
    0b00000101, //6
    0b11110001, //7
    0b00000001, //8
    0b00100001, //9
0b00000000};//пусто

const char razr[] = {
    0b11111110,
    0b11111101,
    0b11111011,
0b11110111};

unsigned char display[2];
volatile unsigned char i, a=0;
volatile unsigned int  z=0;
unsigned char dig1, dig2, dig3, dig4;


void init_timer0()
{
    TCCR0 =(1<<CS02)|(1<<CS00);
    TCNT0  =255;
    
    TIMSK|=1<<TOIE0;
    sei();
}

void init_timer1()
{
    TCCR1A = 0x00;
    TCCR1B = (1<<WGM12) | (1<<CS11)  | (1<<CS10);
    TCNT1H = 0;
    TCNT1L = 0;
    OCR1A  =1;
    TIMSK |= (1<<OCIE1A);
    sei();
}

void counter0(void)
{
    a++;
    
}

ISR(TIMER0_OVF_vect)
{
    TCNT0=255;
    counter0();
}


void write_display(unsigned char *data)
{
    unsigned char mask,i;
    
    for(i = 0; i < 2; i++)
    {
        mask = 0x80;
        
        for(char k = 0; k < 8; k++)
        {
            // Сравниваем каждый бит с единицей
            if(data[i] & mask)
            {
                PORTB |= (1 << 0); // DATA 1
                PORTB |= (1 << 1); // CLK 1
                PORTB &= ~(1 <<1); // CLK 0
            }
            else
            {
                PORTB &= ~(1 << 0); // DATA 0
                PORTB |= (1 << 1); // CLK 1
                PORTB &= ~(1 << 1); // CLK 0
            }
            mask = mask >> 1; // Сдвигаем биты
        }
    }
    // Защелкиваем регистр
    PORTB |= (1 << 2);
    PORTB &= ~(1 << 2);
}



ISR (TIMER1_COMPA_vect)
{
    
    dig4=dig[z % 10000 / 1000];
    dig3=dig[z % 1000 / 100];
    dig2=dig[z % 100 / 10];
    dig1=dig[z % 10];
    
    display[0] =  razr[3];
    display[1] = ~ dig4;
    write_display(display);
    
    display[0] =  razr[3];
    display[1] =  dig[10];
    write_display(display);
    
    
    display[0] =  razr[2];
    display[1] = ~ dig3;
    write_display(display);
    
    display[0] =  razr[2];
    display[1] =  dig[10];
    write_display(display);
    
    display[0] =  razr[1];
    display[1] =  ~dig2;
    write_display(display);
    
    display[0] =  razr[1];
    display[1] =  dig[10];
    write_display(display);

    display[0] =razr[0];    // в крайний левый символ
    display[1] =~ dig1;        // выводится цифра
    write_display(display);
    
    display[0] =  razr[0];    // в крайний левый символ
    display[1] =  dig[10];        // выводится цифра
    write_display(display); // и посылается на 74hc595
    
}
/*
*/
int main(void)
{
    DDRB  = 0xFF;
    PORTB = 0x00;
    DDRC  = 0xff;
    PORTC = 0x03;
    init_timer0();
    init_timer1();
    

    while (1)
    {
        if (a>10)
        {
            z++;
            PORTC^=1<<5;
            a=0;
        }
    }
}

 

Share this post


Link to post
Share on other sites
                     

Чип-резисторы Panasonic - технология мягких выводов и сертификация AEC-Q200

Технология мягких выводов чип-резисторов производства компании Panasonic. Обзор серий с оптимизированными параметрами: прецизионных тонкопленочных, токоизмерительных, антисерных, резисторов с повышенной стойкостью к статике и импульсным нагрузкам, резисторных сборок.

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

On 5/23/2020 at 10:21 PM, Alek_von_German said:

TCNT0=255;

Поставьте другое значение поменьше. При 255 вы не увидете на индикаторе ничего, значения будут меняться каждые 1.2 мс. Поставьте например TCNT0=10;

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

  • Сообщения

    • Я не рекомендую применять ручную электрическую дрель в качестве циркульной пилы. И на это несколько причин: 1 - крепление диска в патроне = самоубийцы! Второе: подшипник в дрели = далеко от диска . Всё это опасно. Для Вашего здоровья! Пилу можно купить буквально за 1000 - 1500 рублей. Дрель примерно столько же стоит. Делать самодельный станок имеет смысл только, если фабричные , настоящие стоят от 20 тыщ и более. 
    • Путают из за -навязанного не правильного понятия - либерализм , помет с телека с таким отвращением говорит - либерал-фу )) ,я то это понимаю как права и свободы человека - фу) а ктот и разбирать не будет -просто -либерал -знач -фу)))
    • Государства существуют не по документам, а по признанию их другими государствами. В противном случае каждый Вася Пупкин создал бы свое собственное государство.  
    • Собирал для гаража...ну и иногда для посиделок в компании. Нагрузка - 4-ре  АС двух полосных концертного варианта, 8-ми Омные, 12-ти дюймовые низы, верха - Кинап 1А-20, работают по 2 колонки на канал в параллель, следовательно, нагрузка 4-ре Ома на канал. Мощность выходную не мерял, но раскачивает АС по полной, думаю, ватт по 400 на канал усь выдает. Да, собран по классике, только напряжение стабилизатора относительно минуса сделал 15 вольт вместо 11,5.
    • Документально- он так и остался, если верить настоящим документам. И то, что вы называете государством фирму- меня просто выворачивает,корёжит. Нет такого государства как РФ- Россия. По документам- нет его.
    • Выложу фото печати - может интересна будет разводка , нет практически ни одной прямоугольной дороги ,силовые цепи утолщены и расположенны близко к источнику ,за счет распределения земли получилось намного сократить плату - по-моему они сперли здесь не только схему - но и печать))
×
×
  • Create New...