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

По даташиту 7-й бит регистра TCCR0A - COM0A1. Далее, смотрим его описание:
- Вложения
-
- 11.GIF
- (13.6 КБ) 1854 скачивания
Re: CodeVision AVR в вопросах и ответах
Для выключения: TCCR0A &= 0x7F;
Re: CodeVision AVR в вопросах и ответах
Но все равно не понял, почему 0x80 (0b10000000) или почему 0x7F (0b1111111)? 
В таблице даташита там всего одна цифра...
В таблице даташита там всего одна цифра...

Не променяю медь на ржавую несгорайку!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Upgrader писал(а):Но все равно не понял, почему 0x80 (0b10000000) или почему 0x7F (0b1111111)?
В таблице даташита там всего одна цифра...
http://arv.radioliga.com/content/view/187/49/
http://arv.radioliga.com/content/view/188/49/
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
Upgrader
Для выбранного вами режима работы таймера Т0 - неинвертированный ШИМ сигнал, значения битов в регистре TCCR0A должны быть как в таблице выше: COM0A1=1 COM0A0=0, а для выключения выхода таймера оба эти бита равны нулю. Значит, в данном случае, для включения или выключения выхода таймера можно изменять один бит - COM0A1
TCCR0A &= 0x7F; // Обнуляет бит 7 - выключает выход
TCCR0A |= 0x80; // Устанавливает бит 7 - включает выход.
Или так:
TCCR0A &= (~(1<<COM0A1)); // Выкл.
TCCR0A |= (1<<COM0A1); // Вкл.
Помощь была бы существеннее, если изложить задачу подробнее.
Для выбранного вами режима работы таймера Т0 - неинвертированный ШИМ сигнал, значения битов в регистре TCCR0A должны быть как в таблице выше: COM0A1=1 COM0A0=0, а для выключения выхода таймера оба эти бита равны нулю. Значит, в данном случае, для включения или выключения выхода таймера можно изменять один бит - COM0A1
TCCR0A &= 0x7F; // Обнуляет бит 7 - выключает выход
TCCR0A |= 0x80; // Устанавливает бит 7 - включает выход.
Или так:
TCCR0A &= (~(1<<COM0A1)); // Выкл.
TCCR0A |= (1<<COM0A1); // Вкл.
Помощь была бы существеннее, если изложить задачу подробнее.
Последний раз редактировалось ValBag Чт июн 03, 2010 21:43:54, всего редактировалось 2 раза.
Re: CodeVision AVR в вопросах и ответах
Мне тоже объясняли, но я как дерево был, пока не допер.
Регистр TCCR0A это 8 битов. Нумеруются так 7 6 5 4 3 2 1 0
Каждый бит установкой нуля или единицы отвечает за включение какого то состояния регистра.
В даташет написаны навания каждого бита
Так вот Вам напИсали название 7 бита - COAM01A и если Вы в него пишете единицу то соответственно выбираете режим работы. Правда следует заметить что присутствует в настройках и COAM01A и необязательно он будет 6. Надо посмотреть в даташете - какой он по счету. И если внимательно посмотреть на таблицу будет видно, что комбинация нулей и единиц записанных в эти ячейки даст Вам нужный режим работы. А приписка со звездочкой означает что эти настройки верны для режима если включен FAST PWM.
И последний штрих - в регистр можно записывать нули и единицы также как и в порты. Это Вы уже умеете.
Т.е сделав запись TCCR0A = 0b1000000 вы установили COAM01A в единицу и так далее. Считаем с правой стороны и начинаем не с единицы а с нуля.
Посмотрите даташет там будут описаны все возможные состояния регистра. Посмотрел - это на 75 странице оригинального даташета на 2313 Тиню
Регистр TCCR0A это 8 битов. Нумеруются так 7 6 5 4 3 2 1 0
Каждый бит установкой нуля или единицы отвечает за включение какого то состояния регистра.
В даташет написаны навания каждого бита
Так вот Вам напИсали название 7 бита - COAM01A и если Вы в него пишете единицу то соответственно выбираете режим работы. Правда следует заметить что присутствует в настройках и COAM01A и необязательно он будет 6. Надо посмотреть в даташете - какой он по счету. И если внимательно посмотреть на таблицу будет видно, что комбинация нулей и единиц записанных в эти ячейки даст Вам нужный режим работы. А приписка со звездочкой означает что эти настройки верны для режима если включен FAST PWM.
И последний штрих - в регистр можно записывать нули и единицы также как и в порты. Это Вы уже умеете.
Т.е сделав запись TCCR0A = 0b1000000 вы установили COAM01A в единицу и так далее. Считаем с правой стороны и начинаем не с единицы а с нуля.
Посмотрите даташет там будут описаны все возможные состояния регистра. Посмотрел - это на 75 странице оригинального даташета на 2313 Тиню
Последний раз редактировалось nsl2004 Чт июн 03, 2010 21:29:55, всего редактировалось 2 раза.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
я не знаю, как там в вашем CVAVR заведено, но вот в нормальных хидерах микроконтроллеров все имена битов всех регистров уже заданы, и если вместо 6 вы будете писать COAM01A, то думать о том, 6-й это бит или вдруг 5-й, вам не придется.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
Все равно надо смотреть за что и что отвечает. Но первоначально было не понять, пока не дошло, это как механический селектор режимов работы - включил выключил. Их еще на заре - конфигураторами называли. Вроде просто, но это надо знать. Так раньше режимы работы факсов конфигурировались, кучей микриков.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
смотреть надо, но использовать вместо номеров битов их символьные эквиваленты - это более правильно, ближе к идеалу 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
Ага, почти понятно
Значит получается что в Mega8 второго таймера (TCCR2) в том-же ШИМ режиме это будет 5-ый бит COM21, я правильно понимаю? Там названия другие, по этому не очень понятно.
Значит получается что в Mega8 второго таймера (TCCR2) в том-же ШИМ режиме это будет 5-ый бит COM21, я правильно понимаю? Там названия другие, по этому не очень понятно.
Задача заключается в простом включении и выключении выхода ШИМ, не изменяя при этом состояния ШИМ-а.ValBag писал(а):Помощь была бы существеннее, если изложить задачу подробнее.
Не променяю медь на ржавую несгорайку!
Re: CodeVision AVR в вопросах и ответах
Верно.Upgrader писал(а):в Mega8 второго таймера (TCCR2) в том-же ШИМ режиме это будет 5-ый бит COM21
Последний раз редактировалось ValBag Чт июн 03, 2010 22:52:51, всего редактировалось 1 раз.
Re: CodeVision AVR в вопросах и ответах
Upgrader писал(а):Ага, почти понятно![]()
Значит получается что в Mega8 второго таймера (TCCR2) в том-же ШИМ режиме это будет 5-ый бит COM21, я правильно понимаю? Там названия другие, по этому не очень понятно.Задача заключается в простом включении и выключении выхода ШИМ, не изменяя при этом состояния ШИМ-а.ValBag писал(а):Помощь была бы существеннее, если изложить задачу подробнее.
Выходит что так. Но там три таблички, котрые зависат от конфигурации других битов, т.е выбранных режимов работы. Например если у Вас FAST PWM то для Вас табличка 44.
Вообщето надо разобратся. Если у Вас выставлен режим = 80 то это 0b10000000 Сопоставьте с рисунком на странице 117 вначале и увидете что у вас включено. Подозреваю совсем не то что нужно Вам.Т.к там простым английским языком
А так как я пока не въехал, зачем работающий шим с отключенной ногой. То и помочь не могу. Сам пока только разобрался КАК конфигурировать. А вот ЧТО - это зависит от задачи.
Re: CodeVision AVR в вопросах и ответах
Для специфических задач.nsl2004 писал(а):А так как я пока не въехал, зачем работающий шим с отключенной ногой.
Чтобы получить нечто такое (синим закрасил моменты когда на выходе ничего нет.):

Не променяю медь на ржавую несгорайку!
Re: CodeVision AVR в вопросах и ответах
Интересная задачка. Но я не помогу. Надо эксперименты ставить. Я тоже сейчас с ШИМ разбираюсь, но у меня другая задача, которая сильно отличается от Вашей.
- ssvd
- Нашел транзистор. Понюхал.
- Сообщения: 167
- Зарегистрирован: Ср ноя 04, 2009 18:00:56
- Откуда: Алтайский край
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
вот тоже нужна помошь по поводу ШИМ на 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);
}
}
};
}
http://abro-nsk.ru
Re: CodeVision AVR в вопросах и ответах
2ssvd
Надо прикрутить управление ШИМАми их у Тини 4 как раз должно Вам хватить.
Я прикладываю код там для управления двумя шимами, по аналогии попробуйте сделать для четыех, подставляя соответствующие регистры. А управление ШИМами сделайте от своего управляющего блока заменив мою кнопку. Думаю все получится.
Надо прикрутить управление ШИМАми их у Тини 4 как раз должно Вам хватить.
Я прикладываю код там для управления двумя шимами, по аналогии попробуйте сделать для четыех, подставляя соответствующие регистры. А управление ШИМами сделайте от своего управляющего блока заменив мою кнопку. Думаю все получится.
- Вложения
-
- ledINT0+PWM.zip
- (2.22 КБ) 256 скачиваний
- ssvd
- Нашел транзистор. Понюхал.
- Сообщения: 167
- Зарегистрирован: Ср ноя 04, 2009 18:00:56
- Откуда: Алтайский край
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
nsl2004 писал(а):2ssvd
Надо прикрутить управление ШИМАми их у Тини 4 как раз должно Вам хватить.
Я прикладываю код там для управления двумя шимами, по аналогии попробуйте сделать для четыех, подставляя соответствующие регистры. А управление ШИМами сделайте от своего управляющего блока заменив мою кнопку. Думаю все получится.
спасибо! буду разбираться! )))
http://abro-nsk.ru
Re: CodeVision AVR в вопросах и ответах
подскажите, если запрещаешь прерывания в это время произходит прерывание, потом разрешаешь прерывание - это прерывание потеряно? или после разрешения прерываний оно обработается?
Код: Выделить всё
#asm("cli")Код: Выделить всё
#asm("sei")