реклама на сайте
подробности

 
 
> tiny13 не выходит из idle по прерыванию
Arvenen
сообщение Jun 1 2008, 17:15
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 1-06-08
Пользователь №: 37 963



Tiny13 не выходит из idle режима по прерыванию от компаратора таймера, хотя в документации сказано, что он должен выходитьиз него по любому внутреннему или внешнему прерыванию. Подобная проблема у меня была с mega16, но там она как-то сама собой решилась... Компилятор WinAVR... Да, я пишу на Си... Знаю, для микроконтроллеров со столь малым размером памяти программы это не очень хорошо, но ассемблер я не знаю вовсе, так что буду оптимизировать программу, пока она не поместится в память. Вот программа:

Код
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

#define ADC_VREF_TYPE 0x00

// Вектор прерывания компаратора таймера:
ISR(TIM0_COMPA_vect)
{
    TCNT0 = 0x0;
    
    // Мигание лампочки:
    PORTB ^= 0b00001000;
}

int main(void)
{
    // Начальная инициализация, сгенерирована CodeVisionAVR
    
    // Input/Output Ports initialization
    // Port B initialization
    // Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
    // State5=T State4=T State3=0 State2=T State1=T State0=T
    PORTB=0x00;
    DDRB=0x08;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 150,000 kHz
    // Mode: Normal top=FFh
    // OC0A output: Disconnected
    // OC0B output: Disconnected
    TCCR0A=0x00;
    TCCR0B=0x03;
    TCNT0=0x00;
    OCR0A=0x99;
    OCR0B=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // Interrupt on any change on pins PCINT0-5: Off
    GIMSK=0x00;
    MCUCR=0x00;

    // Timer/Counter 0 Interrupt(s) initialization
    TIMSK0=0x04;

    // Analog Comparator initialization
    // Analog Comparator: Off
    ACSR=0x80;
    ADCSRB=0x00;

    // ADC initialization
    // ADC Clock frequency: 75,000 kHz
    // ADC Bandgap Voltage Reference: Off
    // ADC Auto Trigger Source: None
    // Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
    DIDR0&=0x03;
    DIDR0|=0x00;
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x8F;

    sei();

    while (1)
    {
        //строки, переводящие контроллер в idle режим
        
        //set_sleep_mode(SLEEP_MODE_IDLE);
        //sleep_mode();    
        
    }
    
    return 0;
}


Так все нормально, лампочка на PB3 начинает подавать признаки жизни, но если раскомментировать строки, переводящие контроллер в idle, то лампочка не загорается... Скажите, пожалуйста, что я делаю не так?

На всякий случай:
Код
Fuses:
  OSCCAL = 5D, 5C
  EESAVE = 1
  WDTON = 1
  CKDIV = 1
  SUT = 2
  CKSEL = 2
  SELFPRGEN = 1
  DWEN = 1
  BODLEVEL = 3
  RSTDISBL = 1
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 01:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01356 секунд с 7
ELECTRONIX ©2004-2016