Магия таймеров attiny25

nik182
Offline
Зарегистрирован: 04.05.2015

Задача была выдавать на двух ногах по очереди 36кГц на двух других 56 кГц по очереди по 10 импульсов того и другого. Зарядил таймеры и в прерываниях сделал логику вывода, всё работает. Магия в том, что если закомментировать  строку 4 с совершенно левым, никак не используемым оператором, то таймер 1 перестает работать и запустить его ни как не получается. Кто нибудь знает почему таймер отваливается?

volatile byte c1,c2,s1,s2;

void setup() {
   pinMode(5,OUTPUT);
    DDRB = 0x1f;
    TCCR1 = 0;
    TCNT1 = 0;
    OCR1C = 71;
    TCCR1 = 0x81;    

    TCCR0A = 0;
    TCCR0B = 0;
    TCCR0A = (1 << WGM01);
    OCR0A = 111;
    TCCR0B = (1 << CS00);
    
    TIMSK = (1 << TOIE1) | (1 << OCIE0A);   
    sei();
    while(1);
}

void loop() {
}

ISR(TIM1_OVF_vect) {
 c2++;
  switch (s2)
  {
    case 0: PINB = 0x8; if ( c2 > 19) s2=1; break;
    case 1: if ( c2 > 25) s2=2; break;
    case 2: PINB = 0x10; if ( c2 > 45) s2=3; break;
    case 3: if ( c2 > 50) {s2=0;c2=0;}; break;    
  } 
}
ISR(TIM0_COMPA_vect) {
 c1++;
  switch (s1)
  {
    case 0: PINB = 0x1; if ( c1 > 19) s1=1; break;
    case 1: if ( c1 > 25) s1=2; break;
    case 2: PINB = 0x2; if ( c1 > 45) s1=3; break;
    case 3: if ( c1 > 50) {s1=0;c1=0;}; break;    
  } 
}

   

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

nik182, речь про строчку pinMode(5,OUTPUT) ????   Явно нехватает команды cli() перед настройкой таймера. Ну и совсем на всякий случай  не помешает отчистить регистор флагов TIFR=0xFF

nik182
Offline
Зарегистрирован: 04.05.2015

cli() пробовал, не помогло. Обычно для остановки  TCCR1 = 0; хватало. Флаги тоже поставил на сброс. Переехал в Атмел студию. Теже  проблемы. Но вот какой командой запустить таймер 1 не знаю. Работает только нулевой. 

Дошёл до алгоритм билдера. В симуляторе всё работает. В кристале только нулевой таймер. Попробовал три кристалла из разных партий. Те жи грабли. Что же четвёртая строка делает то,а?    

nik182
Offline
Зарегистрирован: 04.05.2015

Вот так работает. Но это другое прерывание.

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

volatile unsigned char c1,c2,s1,s2;

int main(void)
{
    /* Replace with your application code */

	    DDRB = 0x1f;
        cli();
		TIFR=0xFF;
	    GTCCR = 0;
		TCCR1 = 0;
	    TCNT1 = 0;
	    OCR1C = 71;
		OCR1A = 70;
	    TCCR1 = 0x81;

	    TCCR0A = 0;
	    TCCR0B = 0;
	    TCCR0A = (1 << WGM01);
	    OCR0A = 111;
	    TCCR0B = (1 << CS00);
	    
	    TIMSK =  (1 << OCIE0A) | (1 << OCIE1A);
	    sei();
    while (1) 
    {
    }
}

ISR(TIMER1_COMPA_vect) {
	c2++;
	switch (s2)
	{
		case 0: PINB = 0x8; if ( c2 > 19) s2=1; break;
		case 1: if ( c2 > 25) s2=2; break;
		case 2: PINB = 0x10; if ( c2 > 45) s2=3; break;
		case 3: if ( c2 > 50) {s2=0;c2=0;}; break;
	}
}
ISR(TIM0_COMPA_vect) {
	c1++;
	switch (s1)
	{
		case 0: PINB = 0x1; if ( c1 > 19) s1=1; break;
		case 1: if ( c1 > 25) s1=2; break;
		case 2: PINB = 0x2; if ( c1 > 45) s1=3; break;
		case 3: if ( c1 > 50) {s1=0;c1=0;}; break;
	}
}

 

alex_r61
Offline
Зарегистрирован: 20.06.2012

PINB =

это что? PINx только для чтения состояния ножек порта. И в первом скетче замените OCR1C = 71; на OCR1A = 71;

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

nick182, кажется разобрался. С командой PinMode так же запускается и GTCCR=1<<PWM1B;  Соответссно без пинмоде таймер стоит.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alex_r61 пишет:

PINB =

это что? PINx только для чтения состояния ножек порта.

Не только.

В некоторых АVR'ках (в той же Tiny 25/45/85 о которой топик, а также в ATmega328, ATmega2561 и многих других, но не во всех) запись 1 в этот порт инвертирует соответствующий пин. Если ещё раз записать - снова инвертирует. См. стр. 53, третий абзац сверху даташита на 25-ую.

alex_r61
Offline
Зарегистрирован: 20.06.2012

ЕвгенийП пишет:

Не только.

В некоторых АVR'ках (в той же Tiny 25/45/85 о которой топик, а также в ATmega328, ATmega2561 и многих других, но не во всех) запись 1 в этот порт инвертирует соответствующий пин. Если ещё раз записать - снова инвертирует. См. стр. 53, третий абзац сверху даташита на 25-ую.

"The Port Input Pins I/O location is read only, while the Data Register and the Data Direction Register are read/write. " А дальше просто описано что будет если некоторые ..... будут туда что то писать.  Но я не из их числа :)

nik182
Offline
Зарегистрирован: 04.05.2015

Зря,зря батенька! В одно касание перевернуть порт - дорогого стоит. The Port Input Pins I/O location is read only, while the Data Register and the Data Direction Register are read/write. However, writing a logic one to a bit in the PINx Register, will result in a toggle in the corresponding bit in the Data Register.

alex_r61
Offline
Зарегистрирован: 20.06.2012

nik182 пишет:

Зря,зря батенька! В одно касание перевернуть порт - дорогого стоит.

А это сколько касаний PORTB ^= (1<<led); ???

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alex_r61 пишет:
Но я не из их числа :)

Ваше право. Есть люди, которые не пользуются goto, потому что слово состоит из четырёх букв, есть люди, которые не пользуются операцией отрицания, потому что она богомерзкая (стр. 15). Ну, вот, оказывается, что есть люди, отказывающиеся переворачивать пин за один такт, потому что ... а почему, кстати? Тоже что-то с религией?

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

nik182
Offline
Зарегистрирован: 04.05.2015

Как минимум прочитать,перевернуть бит, записать.

alex_r61
Offline
Зарегистрирован: 20.06.2012

ЕвгенийП пишет:

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

Я ничего не утверждаю, если в даташите написано read only, то так тому и быть. Я в первую очередь смотрю в даташиты производителей и выполняю их рекомендации, а уже потом изучаю опыт других. Странно, но у меня ничего не горит, не глючит, нет и большинства проблем с китайским железом, которыми весь форум забит. Хотя "каждый сходит с ума по своему".

P.S. "Свобода это не только возможность выбора но и ответственность за него"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, вот на этой замечательной фразе и остановимся :)

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Китайское железо горит и глючит не у тех, кто читает даташит и спорит о том, как понимать его отдельные места (как вы тут), а у тех, кто не знает что такое даташит, а все знания черпает из "видео на ютубе". Так что расслабьтесь, мужики.