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

;tv

Members
  • Постов

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

  • Посещение

Весь контент ;tv

  1. Генадий и DrobyshevAlex, спасибо большое! И всем кто уделил внимание! Реально ошибка была в игнорировании состояния OCF2.
  2. С бумажкой в стране напряженка и поэтому разберу код в соответствии моих знаний/незнаний, тут! В настройках таймера прописаны комментарии, откуда следует что таймер в режиме СТС-(WGM-21),число для срабатывания по совпадению указана в OCR2,=50 делитель частоты установлен в максимум -1024, общие прерывания разрешены (sei). Условия работы таймера прописаны, и осталось только запустить его. В бесконечном цикле кодом while(PIND&_BV(PD0)){}; обусловливается точка запуска таймера, т.е. после завершения данного условия включается таймер TIMSK|=(1<<OCIE2);. при условии TCNT2=0; , т.к. На графике протеуса она отражается контрольной точкой КТ-6. В момент совпадения OCR2 и TCNT2, код уходит в прерывание и тут и должна сработать КТ-7, НО!!! На графике протеуса, КТ-7 срабатывает еще и сразу после TIMSK|=(1<<OCIE2);. С КАКОГО ПЕРЕПУГУ??? Постоялец ruhi, пишите: смотрите внимательно, там вроде было что то, когда прерывание сравнения срабатывает и по переполнению или сравнение меняет направление счета счетчика таймера. Там хороший таймер - много настроек ! Поясните пожалуйста что зашифровано в вашем послании? Сторожил Генадий, спасибо за подсказку! Мне говорили что протеус это протез, (как вы упомянули), но как и у всех, неверие до своих шишек! После сообщения Генадий, с позитивным настроем собрался просмотреть работу кода в осциллографе, и вот господа, оказывается "протез" не совсем протез! Скрин говорит сам за себя! Желтый график КТ6, зелный КТ7. КТ-7 как и в протеусе срабатывает 16-раз, а по коду в прерывание по совпадению должен уходить 8-рас. В чем ошибка?
  3. ;tv

    Atmega8_ TC2 .

    Приветствую вас! С целью разобраться таймером, прописал самый простой код, но так и не смог понять причину появления одного действия микроконтроллера. Задача: в теле обработчика прерывания, сканировать уровень лог. уровень входящего от генератора сигнала. Начало отсчета OCR2, спадающий фронт П-образного колебания. При совпадений OCR2 c TCNT2, программа уходит в прерывание и там при желании и можно сделать замер лог.уровня. Все вроде очень просто, но по неизвестной мне причине, программа заходит в тело прерывания по совпадению не только в момент OCR2 =TCNT2, а еще и при спадающем фронте сигнала. Как от этого входа в тело прерывания избавиться и почему это происходит, никак не пойму. Извращался над кодом всяко разно, но никак!! Знаю все просто, но когда знаешь! Подскажите чтоб знал! Спасибо, с уважением к вам! P.S. код и протеус (фото) прилогаеться.1.c1.c
  4. Приветствую! Если F_CPU от внешнего RC генератора, fuse low byte равно 0xC8;
  5. Здравствуйте! Зашел на вашу тему чтоб набраться опыта, и не претендую на осознания всего вашего кода, но с моей колокольни бросается в глаза обозначение частоты кварца, F_CPU 1200000LU. Для меня сочетание LU ново, может это то чего я еще не знаю, но обычно в просматриваемых мной кодах частота обозначается (в вашем случае), F_CPU 1200000UL.
  6. ОПЕЧАТКА PORTB&=0B00001000;-НЕ ПРАВИЛЬНО. PORTB&=0b00000001;-ПРАВИЛЬНО!
  7. Задача такая: считать с PINC1, лог. уровень в момент обусловленный оператором "for". Это в коде видно с условия PORTC&=0b00000010; Эта запись значит: PORTC = 0b000000x0; чтоб вычислить значение "х" пользуемся свойством оператора "&"а именно 1&1=1. & 0b00000010; --------------------------------------------- 0b000000Y0 где Y =X следовательно "А" =Y (0 или1) т.е. его надо не прописать а вычислить и прописать сигнал "код" подается на PINC1. а на PIND2 подается сигнал для управления прерыванием int0 которое нужно для старта таймера отсчитывающего "for".
  8. Спасибо за информацию! Да, я знаю, есть LMххх, который при настройке пассивных элементов создает шифратор/дешифратор. НО! Главная задача для меня не решить вопрос с беспроводным звонком, в конце концов ее можно и купить, а в том что у меня есть желание поэтапно изучить программирование микроконтроллеров. По этому, я не ищу пути как обойти проблему с кодом, а пытаюсь с помощью и подсказки форумчан изучить вопрос и тем самым сделать шаг вперед! По поводу манчестерского кодирования я слышал и UART-ом скоро займусь, но если я не смогу решить такую простую задачу как УСТАНОВИТЬ ЛОГ. УРОВЕНЬ В N-ТОЧКЕ, значить нефиг дальше шагать!!! Реально ведь это так просто; PORTB&=0b00001000; и вот мы знаем что записано в пин В0. Но я не справился с такой простой задачей. Код вроде логичный, но чего то я еще не знаю! По этому и обращаюсь: Господа профессионалы ... Может и найдется такой и подскажет как блоху подковывать!
  9. Здравствуйте! Задача следующая; Имеется ФМ модуль(китайсткий 433кгц), приемник и передатчик. Нужно собрать беспроводной эл.звонок. В целях исключения случайного срабатывания реле приемника по причине эфирных помех, срабатывание реле приемника планируется при получении кода(байта) от кнопки вызова(генератора кода-байта). Соответственно нужно создать программу для чтения кода с последующим сравнением принятого кода с эталоном(ключом) прописанным в EEPROM. Для симуляции условия "максимально приближенного к боевым" я в протеусе собрал такую схему: (АТМЕГА8) Там генератор на PIND2/ на 17кгц, а на PINC1 на 10кгц. PINC0 контрольная точка тестового режима для наглядного наблюдения за точкой замера. в коде прописано //PORTC|=(1<<0); тестовое условие... Думаю ответил на все ваши вопросы, слово за вами! В чем ошибка в моем коде и какое решение задачи предложите. (Купить в магазине звонок- ОТКЛОНЯЕТСЯ) типа шутка!
  10. A=PORTC; означает, что численное значения байта, которую представляет PORTC, а именно 0b00000010; .т.е. число"2", записывается в глобальной переменной "А". Оператор "for" там за тем, что замер лог.уровня PINC0 должно произойти в то время когда это нужно тебе, а когда это нужно тебе, нужно прописать в условиях кода. Как? Включаем инкримент, и когда "for" досчитает до 115, (в моем случае i<=115;) т,е, пройдет определенное вами время, программа выйдет из "for", и следующим шагом сделает замер с использованием "&". PORTC&=0b00000010; Вы наверно не обратили внимание на пояснения ниже кода. Там прописано что на PINC1 подается П-образное колебание с частотой отличной от подаваемой на PIND2 т.е. INT0 PINC1 является входом и именно лог. уровень входящего сигнала и нужно измерить в нужное время которое и определяет "for". По поводу того что "for" в прерывании плохо, я не знал. Где можно прочитать по этому поводу? Я "тело" прерывания воспринимал как обычную функцию в которой можно приписать нужны код без ограничений. Подскажите пожалуйста, где прописаны условия ограничения в коде при записи в "ISR(){}". И если вы знаете, пропишите пожалуйста вариант кода где в прерывании INT0, в НУЖНЫЙ МОМЕНТ возможно замерить лог.уровень N-пина. Или это не возможно?
  11. ;tv

    Определение лог. уровня

    Господа профессионалы! Приветствую вас! Подскажите пожалуйста, где в представленном ниже коде ошибка, которая не позволяет отразить лог. уровень переменной "А". на ПОРТ.В Код самый простой, вроде и логика присутствует, но видимо она не совпадает с логикой камня. Но почему? камень атмега8, среда атмел студио 6. язык: "С". #define F_CPU8000000UL #include <avr/io.h> #include <avr/interrupt.h> unsigned char A; // обявление глобальной переменной void int0_set(void) { MCUCR &= ~( (1<<ISC11)|(1<<ISC10)|(1<<ISC01)|(1<<ISC00) ); //сбрасываем все биты ISCxx MCUCR |= (1<<ISC01); //настраиваем на срабатывание INT0 по спадающему фронту GICR |= (1<<INT0); //активируем прерывание по INT0; } ISR(INT0_vect) { for (unsigned char i=0;i<=115;i++){} // инициализируем и запускаем счетчик (частоту "тиков" определяет F_CPU;) //PORTC|=(1<<0); // тестовое условие -для наглядности результата срабатывания "for". //PORTC&=~(1<<0); // тестовое условие PORTC&=0b00000010; // определяем лог.состояние ПИНС.1 в точке по условию"for". A=PORTC; // присваивае результат переменной "А". switch (A) // тестовое условие для определения лог.величины "А" -активируем оператор "switch". { case 2: PORTB|=(1<<0); // условие при состоянии лог."1" переменной "А". break; case 0: PORTB&=~(1<<0); // условие при состоянии лог."0" переменной "А" break; } } int main(void) { DDRD&=0x00; //все пины на вход, в том числе и пин на котором прерывание PORTD&=0x04; DDRB|=0xFF; PORTB&=0x00; DDRC|=0xFD; //ПИНС.1 установлен на вход ?-правильно? PORTC&=0x00; int0_set(); //запустили инициализацию прерывания. sei(); //глобально разрешили прерывания while(1) { } } На PIND.2 подаются П-образные импульсы создающие условие для срабатывания прерывания INT0. На PINC1 тоже подаются П-образные импульсы но с отличным от подающего на PIND2 частотой. Соответственно при замере лог. уровня в "точке" определяющем условием "if", результаты должны быть то "0", то "1". Соответственно "А" должно быть или "0" или "2". Условием "switch" состояние PORTB должно реагировать на"А", но этого не происходит. А жаль! А почему?
  12. ;tv

    Приветствую вас DM37!     Говорите код у вас сработал???  Я обращаюсь к вам с просьбой, подскажите в чем ошибка в моем коде? Однозначно вы что-то скоректировали иначе и у меня она бы заработала. Просмотрите пожалуйста еще раз код, обратите внимание на комментарии и подскажите отличие от вашего рабочего кода.

     

    /*
     * Atmega8_decoder_zvonok.c
     *
     * Created: 14.09.2016 21:42:57
     *  Author: SUN 
     */ 

    #define F_CPU8000000UL                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
    #include <avr/io.h>
    #include <avr/interrupt.h>

    //**********************************************************************8                                                      
                                          
                                            
    void int0_set(void)
    {
    MCUCR &= ~( (1<<ISC11)|(1<<ISC10)|(1<<ISC01)|(1<<ISC00) );   //сбрасываем все биты ISCxx
    MCUCR |= (1<<ISC01)|(1<<ISC00);                              //настраиваем на срабатывание INT0 по переднему фронту
    GICR |= (1<<INT0);                                           //разрешаем глобальное прерывание 
    GIFR|=(1<<INTF0);                                            //опрос вектора на разрешения запрета прерывания
                                                         
    }

    void pauza_set (void)
    {
        TCNT2=50;                    //число/старт отсчета до числа OCR2
        TIMSK|=(1<<OCIE2);          // по совпадению
        OCR2=150;                   // число по совпадению TCNT2=OCR2
        TCCR2|=(1<<WGM21);          // режим CTC;
        TCCR2|=(1<<CS20);           // prescaler                             
    }

     void puls_set(void)
     {
        
        TCNT2=0;                    //число/старт отсчета до числа OCR2    
        TIMSK|=(1<<OCIE2);          // по совпадению
        OCR2=200;                   // число по совпадению TCNT2=OCR2
        TCCR2|=(1<<WGM21);          // режим CTC;
        TCCR2|=(1<<CS20);           // prescaler    
     }
                                                 
    ISR( INT0_vect )
    {                     
        pauza_set ();                   // инициировали и запустили условия pauza_set();        
    }
     
     ISR(TIMER2_COMP_vect)               //при pauza_set=0; т.е. по истечении времени обусловленного pauza_set();
     {
        PORTC|=(1<<1);                   // тестовый импульс на ПИНС0 для контроля срабатывания INT0 (на форуме высказали сомнение)
        PORTC&=~(1<<1);                     //"------------------------------------------------------------------------------------"
        unsigned char pauza;             // инициализация локалной переменной  (иначе ругается)!
        if (!pauza)                      // если pauza=0
        {
            PORTC|=(1<<0);               // лог"1"
            pauza++;                     // pauza=1;
            puls_set();                     // запускаем условия puls_set; (отсчитав обусловленное время, возврашается к условию if)
        } 
        else
        {
            PORTC&=~(1<<0);              // проверив условие if, т.к.pauza=1, сработает условие else. (НЕ СРАБАТЫВАЕТ!!!!)        
        }    
          TCCR2=0;                         
          TIMSK=0;                                                                       
     }
          
    int main(void)
    {  
        DDRD&=0x00;                                       //0;//все пины на вход, в том числе и пин на котором прерывание
        PORTD&=0x00;
        PORTD|=(1<<2);                                    //подтягивоющий резистор.
        DDRB|=0xFF;
        PORTB&=0x00;
        DDRC|=0xFF;
        PORTC&=0x00;
        int0_set();                                         //запустили инициализацию прерывания.
        sei();                                             //глобально разрешили прерывания
        
        while(1)
        {            
                asm("nop");
        }
        
    }
     

     Тут ниже для наглядности картинка с протеуса. INT0-работает, pauza_set(); отрабатывает свое время(ПИНС.1)

     

     

    Снимок.PNG

    1. dm37

      dm37

      Привет,

      ну что сразу бросилось в глаза это

       unsigned char pauza;             // инициализация локалной переменной  (иначе ругается)!

      эта переменная должна определятся как глобальная, т.е. должна быть здесь

       /*
       * Atmega8_decoder_zvonok.c
       *
       * Created: 14.09.2016 21:42:57
       *  Author: SUN 
       */ 
      #define F_CPU8000000UL                                                                                                                             #include <avr/io.h>
      #include <avr/interrupt.h>
      
      //**********************************************************************8                                                      
      volatile unsigned char pausa;

      надо поставить volatile, чтобы компилятор не выбросил операции с этой переменной из кода после оптимизации (так надо поступать со всеми переменными, которые меняются в прерываниях). Когда вы объявили переменную внутри прерывания, да ещё и не присвоили ей значение вы при сравнении в переменной pausa, в лучшем случае будет всегда получать 0, а обычно там разный мусор (т.к. для локальных переменных компилятор старается использовать регистры, которые при этом не инициализирует). Глобальные переменные, по умолчанию, всегда инициализируются 0.

      Попробуйте сначала изменить это, потом дальше посмотрим

      можно немного оптимизировать функции pauza_set() и pulse_set():
      вынести настройку режима CTC (выполнять только один раз в main()), а оставить только настройку задержек, т.е.
      - останавливаем таймер (prescaler = 0)
      - устанавливаем новое значение задержки
      - запускаем таймер

  13. ;tv

    Работа с T/C2

    Он установлен!
  14. Виктор здравствуйте! Извините за беспокойства, но видимо без вашей  подсказки моя задача не разрешится решением. Думал вы выскажите свое обоснованное, как всегда, мнение, но так и не дождался. Надеюсь у вас все хорошо и вас не слышно по причине занятости! В общем, если найдете пару минут, просмотрите мою тему "Работа с T/C2", и скажите пару слов, которых ждет народ!:acute:

     

  15. ;tv

    Работа с T/C2

    DM37, спасибо за вариант, но он у меня все равно не заработал. Может я не так перевел? Вот вариант перевода: /* * _8_zvinok_2.c * * Created: 20.09.2016 19:19:28 * Author: SUN */ #define F_CPU1000000UL #include <avr/io.h> #include <avr/interrupt.h> volatile unsigned char pause; void int0_set(void) { MCUCR &= ~((1<<ISC11)|(1<<ISC10)|(1<<ISC01)|(1<<ISC00)); //сбрасываем все биты ISCxx MCUCR |= (1<<ISC01)|(1<<ISC00); //настраиваем на срабатывание INT0 по переднему фронту GICR |= (1<<INT0); //разрешаем глобальное прерывание GIFR |= (1<<INTF0); // Сбросить флаг } void pauza_set(void) { TCCR2 = 0; TCCR2 |= (1<<WGM21) | (0<<WGM20); // режим CTC; TCCR2 |= (0<<CS22) | (1<<CS21) | (0<<CS20); // prescaler TIMSK |= (1<<OCIE2); // по совпадению OCR2 = 250; // число по совпадению TCNT2=OCR2 TIFR=(1<<OCF2); } void puls_set(void) { TCCR2 = 0; TCCR2 |= (1<<WGM21) | (0<<WGM20); // режим CTC; TCCR2 |= (0<<CS22) | (1<<CS21) | (0<<CS20); // prescaler TIMSK |= (1<<OCIE2); // по совпадению OCR2 = 150; // число по совпадению TCNT2=OCR2 TIFR |=(1<<OCF2); } ISR(INT0_vect) { PORTC &= ~(1<<0); // установили ПИНС0 в лог"0" pauza_set(); // инициировали и запустили условия pauza_set(); } ISR(TIMER2_COMP_vect) { if(!pause) { PORTC |= (1<<0); // начало импульса / старт лог"1" pause++; puls_set(); // инициализация и запуск условия puls_set (); !!!!!!!!!!!!!!! НЕ ЗАПУСКАЕТСЯ !!!!!!!!!!!!!!!!!!!!!!!!! } else { /* * _8_zvinok_2.c * * Created: 20.09.2016 19:19:28 * Author: SUN */ #define F_CPU1000000UL #include <avr/io.h> #include <avr/interrupt.h> volatile unsigned char pause; void int0_set(void) { MCUCR &= ~((1<<ISC11)|(1<<ISC10)|(1<<ISC01)|(1<<ISC00)); //сбрасываем все биты ISCxx MCUCR |= (1<<ISC01)|(1<<ISC00); //настраиваем на срабатывание INT0 по переднему фронту GICR |= (1<<INT0); //разрешаем глобальное прерывание GIFR |= (1<<INTF0); // Сбросить флаг } void pauza_set(void) { TCCR2 = 0; TCCR2 |= (1<<WGM21) | (0<<WGM20); // режим CTC; TCCR2 |= (0<<CS22) | (1<<CS21) | (0<<CS20); // prescaler TIMSK |= (1<<OCIE2); // по совпадению OCR2 = 250; // число по совпадению TCNT2=OCR2 TIFR=(1<<OCF2); } void puls_set(void) { TCCR2 = 0; TCCR2 |= (1<<WGM21) | (0<<WGM20); // режим CTC; TCCR2 |= (0<<CS22) | (1<<CS21) | (0<<CS20); // prescaler TIMSK |= (1<<OCIE2); // по совпадению OCR2 = 150; // число по совпадению TCNT2=OCR2 TIFR |=(1<<OCF2); } ISR(INT0_vect) { PORTC &= ~(1<<0); // установили ПИНС0 в лог"0" pauza_set(); // инициировали и запустили условия pauza_set(); } ISR(TIMER2_COMP_vect) { if(!pause) { PORTC |= (1<<0); // начало импульса / старт лог"1" pause++; puls_set(); // инициализация и запуск условия puls_set (); !!!!!!!!!!!!!!! НЕ ЗАПУСКАЕТСЯ !!!!!!!!!!!!!!!!!!!!!!!!! } else { PORTC &= ~(1<<0); // конец импульса /лог"0" TCCR2 = 0; // TIMSK = 0; // } } int main(void) { DDRD = 0x00; //0;//все пины на вход, в том числе и пин на котором прерывание PORTD = (1<<2); //подтягивоющий резистор. DDRB = 0xFF; PORTB = 0x00; DDRC = 0xFF; PORTC = 0x00; int0_set(); //запустили инициализацию прерывания. sei(); while(1) { asm("nop"); } } // } } int main(void) { DDRD = 0x00; //0;//все пины на вход, в том числе и пин на котором прерывание PORTD = (1<<2); //подтягивоющий резистор. DDRB = 0xFF; PORTB = 0x00; DDRC = 0xFF; PORTC = 0x00; int0_set(); //запустили инициализацию прерывания. sei(); while(1) { asm("nop"); } } В таком варианте, ПИНС0 при INT0 уходит в лог "0" и там остается. Тут мне не понятна смысл логики функции " if ". Я прочитал ее так: if(!pauza), -pauza по умолчанию "0", и условие значит: если пауза истина, т.е. (=1) выполнится часть "тела" PORTC &= ~(1<<0); // конец импульса /лог"0" TCCR2 = 0; // TIMSK = 0; и далее условие в " if ()" никак не поменяется. В результате и получается лог"0" по условию ISR(TIMER2_COMP_vect). Надеюсь кто поправит мое понимание кода или подскажет правильное решение!!! PS. код второпях прописал дважды, надеюсь не создаст больших проблем! Пардон!
  16. ;tv

    Работа с T/C2

    Приветствую вас! В вышеуказанный код внес подсказанные DmitryS коррективы, задача все равно не решилось! Для наглядности задачи предлагаю посмотреть два графика работы кода. С протеуса реальный график, в paint-е запланированный, но не выполняемый выше представленным кодом. P.S. DmitryS благодарю за помощь.
  17. ;tv

    Работа с T/C2

    Приветствую вас! Пытаюсь подружиться с таймером, не поддается . Для примера поставил себе задачу, при прерывании INT0 сделать паузу, т.е. установить лог"0" на ПИНС0, при прерывании по совпадению (TCNT=OCR) установить ПИНС0 в лог "1", и сохранять ее до следующего прерывания по совпадению. Код не работает в части инициализации установки и сохранения лог"1". Подскажите пожалуйста ошибку! Среда ATMEL STUDIO 6. Камень Atmega8 Язык "СИ". /* * Atmega8_decoder_zvonok.c * * Created: 14.09.2016 21:42:57 * Author: SUN */ #define F_CPU1000000UL #include <avr/io.h> #include <avr/interrupt.h> volatile unsigned char zero,one; //**********************************************************************8 void int_set(void) { MCUCR &= ~( (1<<ISC11)|(1<<ISC10)|(1<<ISC01)|(1<<ISC00) ); //сбрасываем все биты ISCxx MCUCR |= (1<<ISC01)|(1<<ISC00); //настраиваем на срабатывание INT0 по переднему фронту GICR |= (1<<INT0); //разрешаем глобальное прерывание } ISR( INT0_vect ) { PORTC&=~(1<<0); // установили ПИНС0 в лог"0" pauza_set (); // инициировали и запустили условия pauza_set(); } void pauza_set (void) { zero=5; // условие для истины в if TCNT2=0; //число/старт отсчета до числа OCR2 TCCR2|=(1<<WGM21); // режим CTC; TCCR2|=(1<<CS20); // prescaler TIMSK|=(1<<OCIE2); // по совпадению OCR2=250; // число по совпадению TCNT2=OCR2 asm("sei"); // глобальное прерывание } void puls_set(void) { one=5; // условие для истины в if TCNT2=0; //число/старт отсчета до числа OCR2 TCCR2|=(1<<WGM21); // режим CTC; TCCR2|=(1<<CS20); // prescaler TIMSK|=(1<<OCIE2); // по совпадению OCR2=250; // число по совпадению TCNT2=OCR2 asm("sei"); // глобальное прерывание } ISR(TIMER2_COMP_vect) { if (zero==5) // условие истины при котором запускается условие void pauza_set (void) { TCCR2=0; // TIMSK=0; // puls_set (); // инициализация и запуск условия puls_set (); !!!!!!!!!!!!!!! НЕ ЗАПУСКАЕТСЯ !!!!!!!!!!!!!!!!!!!!!!!!! PORTC|=(1<<0); // начало импульса / старт лог"1" } if (one==5); // условие истины при котором запускается условие void puls_set (void) { TCCR2=0; // TIMSK=0; // PORTC&=~(1<<0); // конец импульса /лог"0" } } int main(void) { DDRD&=0x00; //0;//все пины на вход, в том числе и пин на котором прерывание PORTD&=0x00; PORTD|=(1<<2); //подтягивоющий резистор. DDRB|=0xFF; PORTB&=0x00; DDRC|=0xFF; PORTC&=0x00; int_set(); //запустили инициализацию прерывания. sei(); //глобально разрешили прерывания while(1) { asm("nop"); } }
  18. Приветствую вас! Столкнулся с проблемой. При установке #define F_CPU XXXXXXX; если пользоваться паузой через _delay_ms(); компилятор выдает ошибку; Error 1 expected ')' before ';' token. Если закрыть F_CPU XXXXXXX, то результат компилятора чист, но такой вариант не дает возможности установить частоту камня по своему усмотрению. Подскажите пожалуйста, в чем ошибка.? P.S. Среда ATMEL STUDIO 6, Библиотека #include <util/delay.h>
  19. ;tv

    Int0+Timer/counter2

    А как же язык учить, если ни с "камнем" не разговаривать? Я каждый шаг вперед буквально выкавыриваю с инета. А в книгах так расплывчато все прописано, что это не самоучитель, а учебное пособие, каждую главу которого, кто-то должен прояснять. Жесть!!! Даже с этим Протеусом, раз 20 скачивал. В текстовом файле указывают пошаговую инструкцию, типа нажми сюда, птичка вылетит, жму, а там крокодил в засаде! Полное несоответствие! Порой думаю, может у меня комп заколдованный!?
  20. ;tv

    Int0+Timer/counter2

    Приветствую вас! Извините, не сочтите за тормоз, но я никак не могу найти местоположение тегов, куда нужно записать [\CODE] и
  21. ;tv

    Int0+Timer/counter2

    Ну спасибо, хоть обнадежили, ато уже думал все безнадежно! Но хочу заметить, что по сути описанной мной задачи-то подсказок никаких. А задача остается. Тут я упростил код чтоб с таймером2 подружиться, но никак он меня не признает. Скину код, и если найдете свободное время, оцените ее вашим опытным взглядом и подскажите, почему при пошаговом контроле в ATMEL STUDIO, курсор не заходит в код ISR(TIMER2_COMP_vect){};. т.е. не выполняется то что прописано { здесь }. Если кто подскажет со стороны, буду благодарен!
  22. ;tv

    Int0+Timer/counter2

    Работу с оператором ветвления " if ", я изучил из видео урока, ( ), где все очень четко и ясно поясняется. Следуя уроку, в условии оператора, проверяется его истинность, и в зависимости от результата определяется дальнейшее направление чтения кода. А вы предлагаете мне, начинающему изучать тему, сразу разобраться в макросах и константах. Все проясниться по ходу пьесы! Не обязательно разбираться в яйце на молекулярном уровне, если нужно только лишь поджарить ее! А то что меня интересует на данном этапе, это азы! А где я меняю PINC-? Я его именно опрашиваю в операторе ветвления на соответствие с лог. уровнем! Где что не так?
  23. ;tv

    Int0+Timer/counter2

    Извините не понял. Вы пишите что вектор таймера не указан, а счиал что в коде ISR(TIMER2_COMP_vect){код} указывается что происходит ПРЕРЫВАНИЕ ПО СОВПАДЕНИЮ,(COMP), ТАЙМЕРА 2(TIMER2). Если не затруднит, укажите пожалуйста место, где пропущена цифра указывающая что действие происходит с таймером2. Спасибо.
  24. ;tv

    Int0+Timer/counter2

    Атмел Ктудио 6, новая версия! А что за камень? Совпадают ли PB2 и INT0? так делать бесполезно, PINC0 и т.п. это константы а не адреса портов. Делать вот так тоже бесполезно, вдруг остальные выводы в другом состоянии, лучше проверять конкретный бит. Может, PORTC1? А то PINC предназначен для чтения, а PINC1 это вообще константа, ее не изменить. Так и приведите код, а не картинку. Думаете, у нас есть неодолимое желание перепечатывать ваше творчество? Приветствую вас! 1)Замечание принял, перепрограммировал на "STUDIO" . 2)Камень ATmega8. PD2(INT0); 3)Насколько я понимаю PINC0, это нулевой бит порта С.и запись PINC0 в коде используется в операторе " if ". так проверяется состояние конкретного бита.Это не так? Подскажите как надо. 4)Ваш комментарий к "3)При совпадении OCR2 c TCNT установить PINC0 в лог"1".", мне, извините, вообще не понятен. Эта запись относится к плану создания кода, а в самом коде работа идет не с пином, а с портом. ISR(TIMER2_COMP_vect){...PORTC|=(1<<0);...} 5) Да, я понимаю что перепечатывать код никто не будет. Я пытался прикрепить код к теме в другом формате, но мне прописали что у меня нет права отправлять файл в таком формате. Может я что-то не так загрузил? Если не трудно, подскажите как загрузить код правильно. Спасибо.
  25. ;tv

    Int0+Timer/counter2

    Приветствую! Вообще-то я знаю что ошибаюсь и по этому обращаюсь к знающим тему! Жду совета а не признания того что все это бред! Ну да ладно, сам виноват! По теме, Я знаю что СТС это сброс при совпадении. Как я понял из пояснений в инете, при активации ISR(TIMER_COMP_vect){код} начинается отсчет до совпадения OCR2 c TCNT2.а пока идет отсчет, выполняется код прописанный в {код}. Тут и устанавливается в коде порт С нулевой пин в лог"1". (PORTC|=(1<<0); Если я что-то не так понял, подскажите!
×
×
  • Создать...