ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
И текст проги будет не лишним, посмотреть что с кнопками твориться
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Спойлер
Код: Выделить всё
#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
Инициализация порта была кривая, нужно складывать не арифметически, а логически. OCRам присвоил 0xff, так лучше, потому, что "Update of
OCRx at TOP" ТОР=0xff .
Пауза почему то не работает, попробуй по другому сделать.
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
zero648 писал(а):Инициализация порта была кривая, нужно складывать не арифметически, а логически.
Странно, на сколько я помню, MSP допускала и такое сложение... Хотя, может быть различия в платформе...
Благодарствую) Ловите плюс в репу)
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Поймал
. Компилил через AVR Studio 4.
. Компилил через AVR Studio 4.- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Подключил 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
Я на С только тренируюсь
, поэтому тоже спотыкаюсь кое где, вот так ничтяк работат
DDRB=(1<<PB4)|(1<<PB3)|(1<<PB2); //Инициализация порта
DDRB=(1<<PB4)|(1<<PB3)|(1<<PB2); //Инициализация порта
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
zero648 писал(а):Я на С только тренируюсь, поэтому тоже спотыкаюсь кое где, вот так ничтяк работат
DDRB=(1<<PB4)|(1<<PB3)|(1<<PB2); //Инициализация порта
За это отдельное спасибо) Вчера полвечера промучался, пытаясь реализовать алгоритм непрерывного спектра. Не мог вывести OC1AL и OC1BL на максимальную яркость. Исправил инициализацию порта - все работает)
А вот с задержками проблема - моя функция паузы прекрасно работает, а предложенную Вами не может проглотить программатор: говорит, что адрес 0x0810 выходит за границы flash-памяти. Прошиваю через USBASP и Khazama.
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
В том то и дело, с вашим вариантом pause(n) вообще никак, ставлю любое значение и никак не реагирует, что с паузой что без паузы, результат один, а с _delay как надо пашет. Скорей всего в этом причина, что не мог сделать спектр плавный, неуправляемый ШИМ, OCRn увеличиваем, но счетчик тоже не стоит и убегает
, и вот когда OCRn его все таки поймает в нужный момент, тогда и происходит переключение логического уровня на выходе. Может попробовать задержку на асме написать, но я не знаю как в С делать вставку на асме, на форуме гдето видел, не могу найти.
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Попробуй этот код скомпилить:
Спойлер
Код: Выделить всё
#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
Попробую, но в чем смысл?) АНС прекрасно работает, плюс еще один эффект я уже прикрутил... Осталось разобраться с прерываниями, чтобы можно было кнопки заюзать и переключать ими эффекты...
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Получен пульсирующий OC1BL, горящий в полнакала OC0A и еле тлеющий OC1AL. При изменении величины задержки скорость пульсаций меняется.
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
С программированием прерывания INT1, вроде как, разобрался. Но теперь "внимание, вопрос". Можно ли использовать для управления кнопками ноги T0 и T1(OC0B)? А то я по незнанию две кнопки из трех на них развел...
- Сериг
- Это не хвост, это антенна
- Сообщения: 1451
- Зарегистрирован: Пт фев 19, 2010 19:39:28
- Откуда: Москва
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
если кнопки будут работать не по внешнему прерыванию,то конечно можно.
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Смотрю вот http://avrlab.com/node/87 список прерываний Тини2313 и не могу придумать, какое НЕвнешнее прерывание можно использовать. Кроме PCInt ничего в голову не идет, но оно относится к порту B, а T0 и T1 относятся к порту D.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Можно делать опрос кнопки, а не прерывание от её нажатия.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Хмм... Странно, что я сам до этого не додумался) В MSP ведь только так кнопки и обрабатывал)
- shadivl
- Открыл глаза
- Сообщения: 76
- Зарегистрирован: Пт май 28, 2010 13:41:16
- Откуда: Мариинск, Томск
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Помогите с решением проблемы. Начал осваивать микроконтроллеры. Приобрёл ATTiny2313. Немного разобрался. Стал писать программку, чтобы при нажатии кнопки на порте PD0 загорались\гаснули светодиоды на PortB. Написал, зашил. А он начал тарабанить без передышки, как будто кнопки и нет. Пробовал резистор ставить ( 10 кОм ), так он встанет в одном положении и на кнопку тоже не реагирует. Попробовал чужую прошивку залить, так там кнопки нормально работают. Так что я не так делаю?
- Вложения
-
- Proba.asm
- (1.1 КБ) 347 скачиваний
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
А так
Код: Выделить всё
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
shadivl писал(а):Помогите с решением проблемы. Начал осваивать микроконтроллеры. Приобрёл ATTiny2313. Немного разобрался. Стал писать программку, чтобы при нажатии кнопки на порте PD0 загорались\гаснули светодиоды на PortB. Написал, зашил. А он начал тарабанить без передышки, как будто кнопки и нет. Пробовал резистор ставить ( 10 кОм ), так он встанет в одном положении и на кнопку тоже не реагирует. Попробовал чужую прошивку залить, так там кнопки нормально работают. Так что я не так делаю?
Принципиально на PD0 кнопку нужно? , а то можно прерывания внешние запарить PD2,PD3,PD6