Страница 107 из 132

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Ср авг 08, 2012 17:46:13
zero648
И текст проги будет не лишним, посмотреть что с кнопками твориться

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Ср авг 08, 2012 17:52:44
x8973
Спойлер

Код: Выделить всё

#include <avr/io.h> //Библиотека ввода/вывода

//Подпрограма задержки
void pause (unsigned int a)
{ 
        unsigned int i;
        for (i=a; i>0; i--);
}

//Подпрограмма инициализации ШИМ
void pwm_init(void)
{
	TCCR0A = (1<<WGM01)|(1<<WGM00); //Режим FastPWM
   	TCCR1A = (1<<WGM10);//Режим FastPWM 8 bit
   	TCCR1B = (1<<WGM12);//Режим FastPWM 8 bit

   	TCCR0A = TCCR0A|(1<<COM0A1)|(1<<COM0A0); //Инвертированный выход
   	TCCR1A = TCCR1A|(1<<COM1A1)|(1<<COM1A0);
   	TCCR1A = TCCR1A|(1<<COM1B1)|(1<<COM1B0);
   
   	TCCR0B = TCCR0B|(1<<CS00);   //Предделители
   	TCCR1B = TCCR1B|(1<<CS10);

   	OCR0A = 0x00; //Начальная яркость нулевая
   	OCR1AL = 0x00;
   	OCR1BL = 0x00;
}

//Основная подпрограмма
int main(void)
{
	unsigned char i;

	DDRB=PB2+PB3+PB4; //Инициализация порта

	pwm_init();
 
	while (1)
	{ 
		for (i=0; i<255; i++) //Плавно повышаем яркость
		{
			OCR0A++;
			pause(1000);
		}
	        for (i=0; i<255; i++) //Плавно понижаем яркость
		{
			OCR0A--;
		  	pause(1000);
		}
	} 
 	return 1;
}
Даже такой простой пример не хочет работать. Канал на OC1A зажигается сразу после инициализации ШИМ, проверено комментированием кода внутри бесконечного цикла.

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Ср авг 08, 2012 21:57:07
zero648
Инициализация порта была кривая, нужно складывать не арифметически, а логически. OCRам присвоил 0xff, так лучше, потому, что "Update of
OCRx at TOP" ТОР=0xff .
Пауза почему то не работает, попробуй по другому сделать.
Спойлер

Код: Выделить всё

#include <avr/io.h> //Библиотека ввода/вывода

//Подпрограма задержки
void pause ( int a)
{ 
        unsigned int i;
        for (i=a; i>0; i--);
}

//Подпрограмма инициализации ШИМ
void pwm_init(void)
{
   TCCR0A = (1<<WGM01)|(1<<WGM00); //Режим FastPWM
      TCCR1A = (1<<WGM10);//Режим FastPWM 8 bit
      TCCR1B = (1<<WGM12);//Режим FastPWM 8 bit

      TCCR0A = TCCR0A|(1<<COM0A1)|(1<<COM0A0); //Инвертированный выход
      TCCR1A = TCCR1A|(1<<COM1A1)|(1<<COM1A0);
      TCCR1A = TCCR1A|(1<<COM1B1)|(1<<COM1B0);
   
      TCCR0B = TCCR0B|(1<<CS00);   //Предделители
      TCCR1B = TCCR1B|(1<<CS10);

      OCR0A = 0xff; //Начальная яркость нулевая
      OCR1AL = 0xff;
      OCR1BL = 0xff;
}

//Основная подпрограмма
int main(void)
{
   unsigned int j;

   DDRB=PB4|PB3|PB2; //Инициализация порта

   pwm_init();
 
   while (1)
   { 
      for (j=0; j<255; j++) //Плавно повышаем яркость
      {
         OCR0A++;
         pause(250);
      }
           for (j=0; j<255; j++) //Плавно понижаем яркость
      {
         OCR0A--;
           pause(250);
      }
   } 
    return 1;
}

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Ср авг 08, 2012 22:08:45
x8973
zero648 писал(а):Инициализация порта была кривая, нужно складывать не арифметически, а логически.
Странно, на сколько я помню, MSP допускала и такое сложение... Хотя, может быть различия в платформе...
Благодарствую) Ловите плюс в репу)

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Чт авг 09, 2012 04:13:00
zero648
Поймал :music: . Компилил через AVR Studio 4.

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Чт авг 09, 2012 04:40:56
zero648
Подключил delay, так работает лучше.
Спойлер

Код: Выделить всё

#include <avr/io.h> //Библиотека ввода/вывода
#include <util/delay.h> // Задержка

//Подпрограмма инициализации ШИМ
void pwm_init(void)
{
      TCCR0A = (1<<WGM01)|(1<<WGM00); //Режим FastPWM
      TCCR1A = (1<<WGM10);//Режим FastPWM 8 bit
      TCCR1B = (1<<WGM12);//Режим FastPWM 8 bit

      TCCR0A = TCCR0A|(1<<COM0A1)|(1<<COM0A0); //Инвертированный выход
      TCCR1A = TCCR1A|(1<<COM1A1)|(0<<COM1A0);
      TCCR1A = TCCR1A|(1<<COM1B1)|(1<<COM1B0);
   
      TCCR0B = TCCR0B|(1<<CS00);   //Предделители
      TCCR1B = TCCR1B|(1<<CS10);

      OCR0A = 0xff; //Начальная яркость нулевая
      OCR1AL = 0xff;
      OCR1BL = 0xff;
}

//Основная подпрограмма
int main(void)
{
   unsigned int j;

   DDRB=PB4|PB3|PB2; //Инициализация порта

   pwm_init();
 
   while (1)
   { 
      for (j=0; j<255; j++) //Плавно повышаем яркость
      {
         OCR0A++;
         _delay_us(1000);
      }
           for (j=0; j<255; j++) //Плавно понижаем яркость
      {
         OCR0A--;
         _delay_us(1000);
      }
   } 
    return 1;
}

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Чт авг 09, 2012 06:53:48
zero648
Я на С только тренируюсь :))) , поэтому тоже спотыкаюсь кое где, вот так ничтяк работат
DDRB=(1<<PB4)|(1<<PB3)|(1<<PB2); //Инициализация порта

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Чт авг 09, 2012 07:19:34
x8973
zero648 писал(а):Я на С только тренируюсь :))) , поэтому тоже спотыкаюсь кое где, вот так ничтяк работат
DDRB=(1<<PB4)|(1<<PB3)|(1<<PB2); //Инициализация порта
За это отдельное спасибо) Вчера полвечера промучался, пытаясь реализовать алгоритм непрерывного спектра. Не мог вывести OC1AL и OC1BL на максимальную яркость. Исправил инициализацию порта - все работает)
А вот с задержками проблема - моя функция паузы прекрасно работает, а предложенную Вами не может проглотить программатор: говорит, что адрес 0x0810 выходит за границы flash-памяти. Прошиваю через USBASP и Khazama.

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Чт авг 09, 2012 08:30:54
zero648
В том то и дело, с вашим вариантом pause(n) вообще никак, ставлю любое значение и никак не реагирует, что с паузой что без паузы, результат один, а с _delay как надо пашет. Скорей всего в этом причина, что не мог сделать спектр плавный, неуправляемый ШИМ, OCRn увеличиваем, но счетчик тоже не стоит и убегает :))) , и вот когда OCRn его все таки поймает в нужный момент, тогда и происходит переключение логического уровня на выходе. Может попробовать задержку на асме написать, но я не знаю как в С делать вставку на асме, на форуме гдето видел, не могу найти.

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Чт авг 09, 2012 09:59:08
zero648
Попробуй этот код скомпилить:
Спойлер

Код: Выделить всё

#include <avr/io.h> //Библиотека ввода/вывода
#include <util/delay.h> // Задержка

//Подпрограма задержки
void pause (unsigned int a)
{ 
        unsigned int i;
        for (i=a; i>0; i--)
        {
      asm volatile(
            "\n"
            "nop"       "\n\t"
      ::);
        }
}

//Подпрограмма инициализации ШИМ
void pwm_init(void)
{
      TCCR0A = (1<<WGM01)|(1<<WGM00); //Режим FastPWM
      TCCR1A = (1<<WGM10);//Режим FastPWM 8 bit
      TCCR1B = (1<<WGM12);//Режим FastPWM 8 bit

      TCCR0A = TCCR0A|(1<<COM0A1)|(1<<COM0A0); //Инвертированный выход
      TCCR1A = TCCR1A|(1<<COM1A1)|(1<<COM1A0);
      TCCR1A = TCCR1A|(1<<COM1B1)|(1<<COM1B0);
   
      TCCR0B = TCCR0B|(1<<CS00);   //Предделители
      TCCR1B = TCCR1B|(1<<CS10);

      OCR0A = 0xff; //Начальная яркость нулевая
      OCR1AL = 0xff;
      OCR1BL = 0xff;
}

//Основная подпрограмма
int main(void)
{
   unsigned int j;

   DDRB=(1<<PB4)|(1<<PB3)|(1<<PB2); //Инициализация порта

   pwm_init();
 
   while (1)
   { 
      for (j=0; j!=254; j++) //Плавно повышаем яркость
      {
         OCR0A=j;
      OCR1AL=j;
      OCR1BL=j;
      pause(50);
      }
      for (j=254; j!=0; j--) //Плавно понижаем яркость
      {
         OCR0A=j;
      OCR1AL=j;
      OCR1BL=j;
      pause(50);
      }
   } 
    return 1;
}

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Чт авг 09, 2012 10:09:02
x8973
Попробую, но в чем смысл?) АНС прекрасно работает, плюс еще один эффект я уже прикрутил... Осталось разобраться с прерываниями, чтобы можно было кнопки заюзать и переключать ими эффекты...

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Чт авг 09, 2012 10:16:34
x8973
Получен пульсирующий OC1BL, горящий в полнакала OC0A и еле тлеющий OC1AL. При изменении величины задержки скорость пульсаций меняется.

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Чт авг 09, 2012 12:48:15
x8973
С программированием прерывания INT1, вроде как, разобрался. Но теперь "внимание, вопрос". Можно ли использовать для управления кнопками ноги T0 и T1(OC0B)? А то я по незнанию две кнопки из трех на них развел...

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Чт авг 09, 2012 14:43:34
Сериг
если кнопки будут работать не по внешнему прерыванию,то конечно можно.

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Чт авг 09, 2012 15:12:05
x8973
Смотрю вот http://avrlab.com/node/87 список прерываний Тини2313 и не могу придумать, какое НЕвнешнее прерывание можно использовать. Кроме PCInt ничего в голову не идет, но оно относится к порту B, а T0 и T1 относятся к порту D.

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Чт авг 09, 2012 15:19:54
Gudd-Head
Можно делать опрос кнопки, а не прерывание от её нажатия.

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Чт авг 09, 2012 15:58:15
x8973
Хмм... Странно, что я сам до этого не додумался) В MSP ведь только так кнопки и обрабатывал)

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Чт авг 09, 2012 19:08:05
shadivl
Помогите с решением проблемы. Начал осваивать микроконтроллеры. Приобрёл ATTiny2313. Немного разобрался. Стал писать программку, чтобы при нажатии кнопки на порте PD0 загорались\гаснули светодиоды на PortB. Написал, зашил. А он начал тарабанить без передышки, как будто кнопки и нет. Пробовал резистор ставить ( 10 кОм ), так он встанет в одном положении и на кнопку тоже не реагирует. Попробовал чужую прошивку залить, так там кнопки нормально работают. Так что я не так делаю?

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Чт авг 09, 2012 20:30:57
ILYAUL
А так

Код: Выделить всё

Reset:
ldi inf,ramend
out spl,inf

ldi inf, 0b11111111
out DDRB, inf

ldi inf, 0b11111111
out PortB, inf

ldi inf, 0b0000000
out DDRD, inf
ldi inf,0b0000001
out PortD, inf

Invert: in inf, PortB
        cpi inf, 0b11111111
        breq Izmena	

		ldi inf, 0b11111111
		out PortB,inf
		rjmp Zadergka

Proverka: in inf, PinD
          andi inf,0b0000001
       cpi inf, 0b0000001
	   brne Invert

          ldi r18,0b00000000
          ldi r19,0b00000000
		  ldi r20,0b00000010

Zadergka: dec r18
          brne Zadergka
		  
		  dec r19 
	      brne Zadergka

	   rjmp Proverka

Izmena:	ldi inf,0b00000000
        out PortB,inf
		rjmp Zadergka

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Добавлено: Чт авг 09, 2012 22:53:20
zero648
shadivl писал(а):Помогите с решением проблемы. Начал осваивать микроконтроллеры. Приобрёл ATTiny2313. Немного разобрался. Стал писать программку, чтобы при нажатии кнопки на порте PD0 загорались\гаснули светодиоды на PortB. Написал, зашил. А он начал тарабанить без передышки, как будто кнопки и нет. Пробовал резистор ставить ( 10 кОм ), так он встанет в одном положении и на кнопку тоже не реагирует. Попробовал чужую прошивку залить, так там кнопки нормально работают. Так что я не так делаю?
Принципиально на PD0 кнопку нужно? , а то можно прерывания внешние запарить PD2,PD3,PD6 :)))