Страница 76 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср июн 02, 2010 05:09:02
AI_Disable
Upgrader, судя по тому, что вы приплели к таймеру обработчики внешних прерываний, вы не в курсе, что для каждого вектора есть свой обработчик. Например, для CTC T1:
interrupt [TIM1_COMPA] void ext_int0_isr(void) {}
Список векторов можно взять из хидера в папке \cvavr\inc\
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июн 03, 2010 18:52:30
Upgrader
Спасибо вам всем! Многое понял, теперь все работает!
А можно еще одну вещь уточнить?
AI_Disable писал(а):Так что, следует делать как говорил тов. ValBag, "отключать" ногу от таймера с помощью бита COM регистра TCCR.
В вашем случаи, это будет выглядеть как TCCR0A&=0x80; для выключения и TCCR0A|=0x80; для включения.
Как узнать это значение "0x80", откуда оно?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июн 03, 2010 19:09:04
AI_Disable
0x80 в 16-ричной системе = 10000000 в бинарной.
По даташиту 7-й бит регистра TCCR0A - COM0A1. Далее, смотрим его описание:

Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июн 03, 2010 19:40:45
ValBag
Для выключения: TCCR0A &= 0x7F;
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июн 03, 2010 20:02:06
Upgrader
Но все равно не понял, почему 0x80 (0b10000000) или почему 0x7F (0b1111111)?

В таблице даташита там всего одна цифра...

Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июн 03, 2010 20:07:50
ARV
Upgrader писал(а):Но все равно не понял, почему 0x80 (0b10000000) или почему 0x7F (0b1111111)?

В таблице даташита там всего одна цифра...

http://arv.radioliga.com/content/view/187/49/
http://arv.radioliga.com/content/view/188/49/
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июн 03, 2010 20:13:44
ValBag
Upgrader
Для выбранного вами режима работы таймера Т0 - неинвертированный ШИМ сигнал, значения битов в регистре TCCR0A должны быть как в таблице выше: COM0A1=1 COM0A0=0, а для выключения выхода таймера оба эти бита равны нулю. Значит, в данном случае, для включения или выключения выхода таймера можно изменять один бит - COM0A1
TCCR0A &= 0x7F; // Обнуляет бит 7 - выключает выход
TCCR0A |= 0x80; // Устанавливает бит 7 - включает выход.
Или так:
TCCR0A &= (~(1<<COM0A1)); // Выкл.
TCCR0A |= (1<<COM0A1); // Вкл.
Помощь была бы существеннее, если изложить задачу подробнее.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июн 03, 2010 21:13:27
nsl2004
Мне тоже объясняли, но я как дерево был, пока не допер.
Регистр TCCR0A это 8 битов. Нумеруются так 7 6 5 4 3 2 1 0
Каждый бит установкой нуля или единицы отвечает за включение какого то состояния регистра.
В даташет написаны навания каждого бита
Так вот Вам напИсали название 7 бита - COAM01A и если Вы в него пишете единицу то соответственно выбираете режим работы. Правда следует заметить что присутствует в настройках и COAM01A и необязательно он будет 6. Надо посмотреть в даташете - какой он по счету. И если внимательно посмотреть на таблицу будет видно, что комбинация нулей и единиц записанных в эти ячейки даст Вам нужный режим работы. А приписка со звездочкой означает что эти настройки верны для режима если включен FAST PWM.
И последний штрих - в регистр можно записывать нули и единицы также как и в порты. Это Вы уже умеете.
Т.е сделав запись TCCR0A = 0b1000000 вы установили COAM01A в единицу и так далее. Считаем с правой стороны и начинаем не с единицы а с нуля.
Посмотрите даташет там будут описаны все возможные состояния регистра. Посмотрел - это на 75 странице оригинального даташета на 2313 Тиню
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июн 03, 2010 21:23:57
ARV
я не знаю, как там в вашем CVAVR заведено, но вот в нормальных хидерах микроконтроллеров все имена битов всех регистров уже заданы, и если вместо 6 вы будете писать COAM01A, то думать о том, 6-й это бит или вдруг 5-й, вам не придется.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июн 03, 2010 21:29:20
nsl2004
Все равно надо смотреть за что и что отвечает. Но первоначально было не понять, пока не дошло, это как механический селектор режимов работы - включил выключил. Их еще на заре - конфигураторами называли. Вроде просто, но это надо знать. Так раньше режимы работы факсов конфигурировались, кучей микриков.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июн 03, 2010 22:04:02
ARV
смотреть надо, но использовать вместо номеров битов их символьные эквиваленты - это более правильно, ближе к идеалу

Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июн 03, 2010 22:13:27
Upgrader
Ага, почти понятно
Значит получается что в
Mega8 второго таймера (TCCR2) в том-же ШИМ режиме это будет 5-ый бит COM21, я правильно понимаю? Там названия другие, по этому не очень понятно.
ValBag писал(а):Помощь была бы существеннее, если изложить задачу подробнее.
Задача заключается в простом включении и выключении выхода ШИМ, не изменяя при этом состояния ШИМ-а.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июн 03, 2010 22:27:04
ValBag
Upgrader писал(а):в Mega8 второго таймера (TCCR2) в том-же ШИМ режиме это будет 5-ый бит COM21
Верно.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июн 03, 2010 22:42:53
nsl2004
Upgrader писал(а):Ага, почти понятно
Значит получается что в
Mega8 второго таймера (TCCR2) в том-же ШИМ режиме это будет 5-ый бит COM21, я правильно понимаю? Там названия другие, по этому не очень понятно.
ValBag писал(а):Помощь была бы существеннее, если изложить задачу подробнее.
Задача заключается в простом включении и выключении выхода ШИМ, не изменяя при этом состояния ШИМ-а.
Выходит что так. Но там три таблички, котрые зависат от конфигурации других битов, т.е выбранных режимов работы. Например если у Вас FAST PWM то для Вас табличка 44.
Вообщето надо разобратся. Если у Вас выставлен режим = 80 то это 0b10000000 Сопоставьте с рисунком на странице 117 вначале и увидете что у вас включено. Подозреваю совсем не то что нужно Вам.Т.к там простым английским языком

написано, что этот бит активен только когда используется NON PWM режим.
А так как я пока не въехал, зачем работающий шим с отключенной ногой. То и помочь не могу. Сам пока только разобрался КАК конфигурировать. А вот ЧТО - это зависит от задачи.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июн 03, 2010 23:37:35
Upgrader
nsl2004 писал(а):А так как я пока не въехал, зачем работающий шим с отключенной ногой.
Для специфических задач.
Чтобы получить нечто такое (синим закрасил моменты когда на выходе ничего нет.):

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт июн 04, 2010 13:31:11
nsl2004
Интересная задачка. Но я не помогу. Надо эксперименты ставить. Я тоже сейчас с ШИМ разбираюсь, но у меня другая задача, которая сильно отличается от Вашей.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт июн 08, 2010 10:06:37
ssvd
вот тоже нужна помошь по поводу ШИМ на attiny2313.
есть проект, типа управление елочной гирляндой, хочу сделать, что бы лампочки не просто гасли и зажигались, а делали это плавно!
Вот код который работает, подскажите как на основе его сделать плавное мигание...
Код: Выделить всё
#include <tiny2313.h>
#include <delay.h>
#include <STDLIB.H>
int i,select_speed,select_prog,t_select_prog,revers_flag;
void __init(void){
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=P State0=P
PORTB=0x03;
DDRB=0x00;
// Port D initialization
// Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0x0F;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 3,906 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0D;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x0f;
OCR1AL=0x42;
OCR1BH=0x00;
OCR1BL=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void){
if(select_speed>=6)select_speed=1;
if(select_prog>=11)select_prog=1;
if(t_select_prog!=select_prog){
i=1;
}
switch(select_speed){
case 1:{
OCR1AH=0x04;
OCR1AL=0xa1;
break;};
case 2:{
OCR1AH=0x07;
OCR1AL=0xa1;
break;};
case 3:{
OCR1AH=0x0f;
OCR1AL=0x42;
break;};
case 4:{
OCR1AH=0x1e;
OCR1AL=0x84;
break;};
case 5:{
OCR1AH=0x4c;
OCR1AL=0x4b;
break;};
}
switch(select_prog) {
case 1:{ //бежит один огонек зажженным +
if(i==1)PORTD=0b00000001;
if(i==2)PORTD=0b00000010;
if(i==3)PORTD=0b00000100;
if(i==4)PORTD=0b00001000;
i++;
if(i==5)i=1;
break;
};
case 2:{ //бежит потухший огонек +
if(i==1)PORTD=0b00001110;
if(i==2)PORTD=0b00001101;
if(i==3)PORTD=0b00001011;
if(i==4)PORTD=0b00000111;
i++;
if(i==5)i=1;
break;
};
case 3:{ // бежит один огонек зажженным до конца и возвращается +
if(t_select_prog!=select_prog){
revers_flag=0;
}
if(i==1)PORTD=0b00000001;
if(i==2)PORTD=0b00000010;
if(i==3)PORTD=0b00000100;
if(i==4)PORTD=0b00001000;
if(revers_flag==0)i++;
if(revers_flag==1)i--;
if(i==5){revers_flag=1;i=4;}
if(i==0){revers_flag=0;i=1;}
break;
};
case 4:{ // все горят +
if(t_select_prog!=select_prog){
PORTD=0b00001111;
}
break;
};
case 5:{ //перекрючаются по переменки через одного +
if(i==1){PORTD=0x0A; i=2;}else{PORTD=0x05; i=1;};
break;
};
case 6:{ //дорошкой загорается и потом дорожкой тухнет +
if (i==1)PORTD=0b00000001;
if (i==2)PORTD=0b00000011;
if (i==3)PORTD=0b00000111;
if (i==4)PORTD=0b00001111;
if (i==5)PORTD=0b00001110;
if (i==6)PORTD=0b00001100;
if (i==7)PORTD=0b00001000;
if (i==8)PORTD=0b00000000;
i++;
if(i==9)i=1;
break;
};
case 7:{ //то загораются, то гаснут +
if(i==1)
{PORTD=0b00001111; i=2;}
else
{PORTD=0b00000000; i=1;};
break;
};
case 8:{ //то загораются, то гаснут +
if (i==1)PORTD=0b00000001;
if (i==2)PORTD=0b00000011;
if (i==3)PORTD=0b00000111;
if (i==4)PORTD=0b00001111;
if (i==5)PORTD=0b00001110;
if (i==6)PORTD=0b00001100;
if (i==7)PORTD=0b00001000;
if (i==8)PORTD=0b00000000;
if (i==9) PORTD=0b00001000;
if (i==10)PORTD=0b00001100;
if (i==11)PORTD=0b00001110;
if (i==12)PORTD=0b00001111;
if (i==13)PORTD=0b00000111;
if (i==14)PORTD=0b00000011;
if (i==15)PORTD=0b00000001;
if (i==16)PORTD=0b00000000;
i++;
if(i==17)i=1;
break;
};
case 9:{ //прыгает ))) +
if(i==1)PORTD=0b00000001;
if(i==2)PORTD=0b00000100;
if(i==3)PORTD=0b00000010;
if(i==4)PORTD=0b00001000;
i++;
if(i==5)i=1;
break;
};
case 10:{ //все потухли +
PORTD=0b00000000;
break;
};
};
t_select_prog=select_prog;
}
void main(void)
{
__init();
t_select_prog=0;
select_prog=1;
select_speed=1;
#asm("sei")
while (1){
if((PINB.0)==0){
delay_ms(20);
if((PINB.0)==0){
select_prog++;
delay_ms(150);
}
}
if((PINB.1)==0){
delay_ms(20);
if((PINB.1)==0){
select_speed++;
delay_ms(150);
}
}
if((PINB.1==0)&&(PINB.0==0)){
delay_ms(20);
if((PINB.1==0)&&(PINB.0==0)){
select_prog=10;
delay_ms(150);
}
}
};
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт июн 08, 2010 13:22:05
nsl2004
2ssvd
Надо прикрутить управление ШИМАми их у Тини 4 как раз должно Вам хватить.
Я прикладываю код там для управления двумя шимами, по аналогии попробуйте сделать для четыех, подставляя соответствующие регистры. А управление ШИМами сделайте от своего управляющего блока заменив мою кнопку. Думаю все получится.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт июн 08, 2010 13:42:14
ssvd
nsl2004 писал(а):2ssvd
Надо прикрутить управление ШИМАми их у Тини 4 как раз должно Вам хватить.
Я прикладываю код там для управления двумя шимами, по аналогии попробуйте сделать для четыех, подставляя соответствующие регистры. А управление ШИМами сделайте от своего управляющего блока заменив мою кнопку. Думаю все получится.
спасибо! буду разбираться! )))
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт июн 08, 2010 14:42:12
neon-f
подскажите, если запрещаешь прерывания
в это время произходит прерывание, потом разрешаешь прерывание
- это прерывание потеряно? или после разрешения прерываний оно обработается?