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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

И текст проги будет не лишним, посмотреть что с кнопками твориться
x8973
Встал на лапы
Сообщения: 99
Зарегистрирован: Чт мар 08, 2012 18:05:49
Откуда: Пермь

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

Сообщение 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 зажигается сразу после инициализации ШИМ, проверено комментированием кода внутри бесконечного цикла.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение 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;
}
x8973
Встал на лапы
Сообщения: 99
Зарегистрирован: Чт мар 08, 2012 18:05:49
Откуда: Пермь

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

Сообщение x8973 »

zero648 писал(а):Инициализация порта была кривая, нужно складывать не арифметически, а логически.

Странно, на сколько я помню, MSP допускала и такое сложение... Хотя, может быть различия в платформе...
Благодарствую) Ловите плюс в репу)
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Поймал :music: . Компилил через AVR Studio 4.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение 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;
}
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Я на С только тренируюсь :))) , поэтому тоже спотыкаюсь кое где, вот так ничтяк работат
DDRB=(1<<PB4)|(1<<PB3)|(1<<PB2); //Инициализация порта
x8973
Встал на лапы
Сообщения: 99
Зарегистрирован: Чт мар 08, 2012 18:05:49
Откуда: Пермь

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

Сообщение x8973 »

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

За это отдельное спасибо) Вчера полвечера промучался, пытаясь реализовать алгоритм непрерывного спектра. Не мог вывести OC1AL и OC1BL на максимальную яркость. Исправил инициализацию порта - все работает)
А вот с задержками проблема - моя функция паузы прекрасно работает, а предложенную Вами не может проглотить программатор: говорит, что адрес 0x0810 выходит за границы flash-памяти. Прошиваю через USBASP и Khazama.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

В том то и дело, с вашим вариантом pause(n) вообще никак, ставлю любое значение и никак не реагирует, что с паузой что без паузы, результат один, а с _delay как надо пашет. Скорей всего в этом причина, что не мог сделать спектр плавный, неуправляемый ШИМ, OCRn увеличиваем, но счетчик тоже не стоит и убегает :))) , и вот когда OCRn его все таки поймает в нужный момент, тогда и происходит переключение логического уровня на выходе. Может попробовать задержку на асме написать, но я не знаю как в С делать вставку на асме, на форуме гдето видел, не могу найти.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение 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;
}
x8973
Встал на лапы
Сообщения: 99
Зарегистрирован: Чт мар 08, 2012 18:05:49
Откуда: Пермь

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

Сообщение x8973 »

Попробую, но в чем смысл?) АНС прекрасно работает, плюс еще один эффект я уже прикрутил... Осталось разобраться с прерываниями, чтобы можно было кнопки заюзать и переключать ими эффекты...
x8973
Встал на лапы
Сообщения: 99
Зарегистрирован: Чт мар 08, 2012 18:05:49
Откуда: Пермь

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

Сообщение x8973 »

Получен пульсирующий OC1BL, горящий в полнакала OC0A и еле тлеющий OC1AL. При изменении величины задержки скорость пульсаций меняется.
x8973
Встал на лапы
Сообщения: 99
Зарегистрирован: Чт мар 08, 2012 18:05:49
Откуда: Пермь

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

Сообщение x8973 »

С программированием прерывания INT1, вроде как, разобрался. Но теперь "внимание, вопрос". Можно ли использовать для управления кнопками ноги T0 и T1(OC0B)? А то я по незнанию две кнопки из трех на них развел...
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

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

Сообщение Сериг »

если кнопки будут работать не по внешнему прерыванию,то конечно можно.
x8973
Встал на лапы
Сообщения: 99
Зарегистрирован: Чт мар 08, 2012 18:05:49
Откуда: Пермь

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

Сообщение x8973 »

Смотрю вот http://avrlab.com/node/87 список прерываний Тини2313 и не могу придумать, какое НЕвнешнее прерывание можно использовать. Кроме PCInt ничего в голову не идет, но оно относится к порту B, а T0 и T1 относятся к порту D.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Можно делать опрос кнопки, а не прерывание от её нажатия.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
x8973
Встал на лапы
Сообщения: 99
Зарегистрирован: Чт мар 08, 2012 18:05:49
Откуда: Пермь

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

Сообщение x8973 »

Хмм... Странно, что я сам до этого не додумался) В MSP ведь только так кнопки и обрабатывал)
Аватара пользователя
shadivl
Открыл глаза
Сообщения: 76
Зарегистрирован: Пт май 28, 2010 13:41:16
Откуда: Мариинск, Томск

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

Сообщение shadivl »

Помогите с решением проблемы. Начал осваивать микроконтроллеры. Приобрёл ATTiny2313. Немного разобрался. Стал писать программку, чтобы при нажатии кнопки на порте PD0 загорались\гаснули светодиоды на PortB. Написал, зашил. А он начал тарабанить без передышки, как будто кнопки и нет. Пробовал резистор ставить ( 10 кОм ), так он встанет в одном положении и на кнопку тоже не реагирует. Попробовал чужую прошивку залить, так там кнопки нормально работают. Так что я не так делаю?
Вложения
Proba.asm
(1.1 КБ) 347 скачиваний
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение 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
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

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

Принципиально на PD0 кнопку нужно? , а то можно прерывания внешние запарить PD2,PD3,PD6 :)))
Ответить

Вернуться в «AVR»