Страница 195 из 421

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 16:03:39
vitalik_1984
*Trigger* писал(а):Из PORTx ничего не прочитать, там всегда нули.
это откуда вы взяли?
а как же вы тогда применяете конструкцию

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

PORTB =PORTB|(1 << PB1);  
по вашим словам можно решить что это выражение всегда приводит к одному результату,независимо от того что было в регистре.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 16:31:45
*Trigger*
Значит, в этой строке ошибка. Дайте весь код - станет понятнее.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 17:15:15
Volgol_555
/*** Управление RGB светодиодом. Программный ШИМ ***/

#include <avr/interrput.h>
#include <avr/io.h>

volatile char pwm_counter,pwm_r,pwm_g,pwm_b;

/*** прерывание по переполнению Т0 ***/
ISR (TIMER0_OVF_vect)
{
if (pwm_counter++ > 163)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter>pwm_r)
PORTB |= (1 << PB1);
if (pwm_counter>pwm_g)
PORTB |= (1 << PB2);
if (pwm_counter>pwm_b)
PORTB |= (1 << PB3);
}

/*** процедура задержки в микросекундах ***/
void delay_us(unsigned char time_us)
{ register unsigned char i;

for(i = 0; i<time_us; i++) // 4 цикла
{ asm (" PUSH R0 "); // 2 цикла
asm (" POP R0 "); // 2 цикла
// 8 циклов = 1 us для 8MHz
}
}

/*** процедура задержки в миллисекундах ***/
void delay_ms(unsigned inttime_ms)
{ register unsigned inti;

for(i = 0; i<time_ms; i++)
{ delay_us(250);
delay_us(250);
delay_us(250);
delay_us(250);
}
}

/*** красныйцвет ***/
void red (unsigned int time)
{
for (char a = 0; a<165; a++)
{
pwm_r = 164 - a; //увеличение
pwm_g = 164;
pwm_b = 164;
delay_ms(time);
}
for (char a = 0; a<165; a++)
{
pwm_r = a; //уменьшение
pwm_g = 164;
pwm_b = 164;
delay_ms(time);
}
}

/*** зеленыйцвет ***/
void green (unsigned int time)
{
for (char a = 0; a<165; a++)
{
pwm_r = 164;
pwm_g = 164 - a;
pwm_b = 164;
delay_ms(time);
}

for (char a = 0; a<165; a++)
{
pwm_r = 164;
pwm_g = a;
pwm_b = 164;
delay_ms(time);
}
}

/*** синийцвет ***/
void blue (unsigned int time)
{
for (char a = 0; a<165; a++)
{
pwm_r = 164;
pwm_g = 164;
pwm_b = 164 - a;
delay_ms(time);
}
for (char a = 0; a<165; a++)
{
pwm_r = 164;
pwm_g = 164;
pwm_b = a;
delay_ms(time);
}
}

/*** белыйцвет ***/
void white (unsigned int time)
{
for (char a = 0; a<165; a++)
{
pwm_r = 164 - a;
pwm_g = 164 - a;
pwm_b = 164 - a;
delay_ms(time);
}

for (char a = 0; a<165; a++)
{
pwm_r = a;
pwm_g = a;
pwm_b = a;
delay_ms(time);
}
}

/*** переходцветa ***/
void rgb (unsigned int time)
{
for (char a = 0; a<165; a++)
{
pwm_r = a;
pwm_b = 164 - a;
delay_ms(time);
}

for (char a = 0; a<165; a++)
{
pwm_b = a;
pwm_g = 164 - a;
delay_ms(time);
}

for (char a = 0; a<165; a++)
{
pwm_g = a;
pwm_r = 164 - a;
delay_ms(time);
}
}

int main (void)
{
DDRB = (1 << PB3)|(1 << PB2)|(1 << PB1);
// PB3,2,1 - выходы
TIMSK |= (1 << TOIE0);
// разрешениепрерывания
TCCR0 |= (0 << CS02)|(0 << CS01)|(1 << CS00);
// без предделителя
sei();// глобальное разрешение прерываний

while(1)
{
red(5);
green(5);
blue(5);
white(10);
for(;;)
{rgb(100);}
}
}
Вот весь код. Я все переработал под себя, но не понимаю, как делается ШИМ на прерывании таймера с использованием вышеприведенных строчек)

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 17:54:24
*Trigger*
Строка с обнулением выполняется только тогда, когда pwm_counter больше 163. Так же как и в динамической индикации.
Строки

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

PORTB |= (1 << PB1);

PORTB |= (1 << PB2);

PORTB |= (1 << PB3);

при определённых условиях устанавливают в "1" определённые биты порта, не изменяя значение остальных битов.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 17:59:43
Volgol_555
Это конечно ясно. Но дело вот в чем. Когда pwm_counter станет=163 все порты B в 0. Тогда как дальше будет выставляться 1 с помощью PORTB |= (1 << PB1);??? это неясно становится и возникает вопрос....как разработчик задал такое условие выставления 1 на определенном порту, когда я лично вообще здесь логики не вижу((. и это условие не будет ли вот таким:
PORTB.1!=PORTB.1?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 18:20:13
Valek3306
Посмотрите пожалуйста на код моей программы и объясните мне почему она не работает и что надо исправить?
В смысле не работает сканф.
Код
Помогите пожалуйста!

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 18:31:49
*Trigger*
Volgol_555 писал(а):Это конечно ясно. Но дело вот в чем. Когда pwm_counter станет=163 все порты B в 0. Тогда как дальше будет выставляться 1 с помощью PORTB |= (1 << PB1);??? это неясно становится и возникает вопрос....как разработчик задал такое условие выставления 1 на определенном порту, когда я лично вообще здесь логики не вижу((. и это условие не будет ли вот таким:
PORTB.1!=PORTB.1?
На самом деле, если PB1 - не опечатка, то это просто число 1. PB0=0, PB1=1, PB2=2 и т. д. Кстати, с этими PBx код в CVAVR, скорее всего, не будет скомпилирован.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 18:46:26
Volgol_555
Интересно, где же это должно компилироваться. В общем вопрос в целом исчерпан - неясно где автор писал и что имел ввиду. Большое спасибо за старание)

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 18:53:18
*Trigger*
Попробуйте скомпилировать и посмотрите, работает ли.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 19:06:58
Volgol_555
Уже перепробовал все основные варианты. Ничего не получается

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 19:48:53
foxghost
Здравствуйте, только осваиваю прошивание МК.
Есть фьюзы из Пони (ATMega8A)
Fise8мгц.jpg
(25.71 КБ) 323 скачивания
на частоту 8 МГц
Как правильно их выставить в AVRStudio
1.jpg
(95.05 КБ) 314 скачиваний
2.jpg
(110.98 КБ) 333 скачивания
или на крайний случай AVRdude
3.jpg
(94.02 КБ) 304 скачивания
а то на win7 другого не дано (наверное).

PS Сильно не ругайте если ошибся веткой, читая форум запорол по не знанию 3 мк, остался последний мк(шанс).
А востанавливать еще не научился с тактированием. Спасибо.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 20:15:48
Valek3306
Valek3306 писал(а):Посмотрите пожалуйста на код моей программы и объясните мне почему она не работает и что надо исправить?
В смысле не работает сканф.
Код
Помогите пожалуйста!
Совсем забыл указать, компилятор CVAVR

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 20:17:07
Volgol_555
Есть калькулятор фьюзов
http://avr.roboforum.ru/
Там выберешь настройки, что были в какой-либо проге и увидишь флажки необходимые для CV

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 20:57:36
foxghost
Volgol_555 писал(а):Есть калькулятор фьюзов
http://avr.roboforum.ru/
Там выберешь настройки, что были в какой-либо проге и увидишь флажки необходимые для CV
но я не понимаю как данными калькуляторами пользаваться, объясните пожалуйста на моем примере.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 21:03:16
vitalik_1984
foxghost писал(а): PS Сильно не ругайте если ошибся веткой, читая форум запорол по не знанию 3 мк, остался последний мк(шанс).
А востанавливать еще не научился с тактированием. Спасибо.
Вообще не понимаю людей, у которых возникает вопрос по фьюзам в программе AVR studio
Ветка по фьюзам.
Volgol_555 писал(а):как разработчик задал такое условие выставления 1 на определенном порту, когда я лично вообще здесь логики не вижу((. и это условие не будет ли вот таким:
Вот вам логика :

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

/*** прерывание по переполнению Т0 ***/
ISR (TIMER0_OVF_vect)
{
if (pwm_counter++ > 163) //конец зоны дискретизации шим
{
PORTB = 0x00;//тушим все при достижении конца зоны
pwm_counter = 0;//обнуляем счетчик
}
if (pwm_counter>pwm_r) Если счетчик стал больше, чем число красного
PORTB |= (1 << PB1); //зажигаем красный свд
if (pwm_counter>pwm_g)// аналогично красному для других диодов
PORTB |= (1 << PB2);
if (pwm_counter>pwm_b)
PORTB |= (1 << PB3);    
}
/*** красныйцвет ***/
void red (unsigned int time)
{
for (char a = 0; a<165; a++) //цикл увеличения числа а
{
pwm_r = 164 - a; // тут получается чем Больше значение а тем Раньше зажигаем светодиод
pwm_g = 164;//// тут получается значение а = 0,значит свд не горит.
pwm_b = 164;
delay_ms(time);
} 
 
Чего непонятно то?Частота прерываний таймера /163 это получается частота шим.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 21:12:51
MS24
Ребят, подскажите почему не работает элементарнейший код!
Диод тупо моргает один раз и все!


#include <mega128.h>
#include <delay.h>
void main( void )
{
DDRE = 0b11111111;
PORTE = 0b11111110;

while(1)
{
PORTE.1 = 0;
delay_ms (1000);
PORTE.1 = 1;
delay_ms (1000);

}
}

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 21:24:52
pyzhman
Ошибок нет, смотри железо.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 21:36:19
*Trigger*
Точно на третью ногу МК светодиод подключен?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 21:40:38
MS24
Точно, шьется без проблем, ноги менял так же история, питание в норме.
Напряжение 5в через 200 ом резистор.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт мар 29, 2012 22:14:30
FreshMan
при попытке откомпилировать проэкт программа указывает на ошибку в этой строке

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

void mathematics(unsigned char sec, min)
что сдесь может быть не так ?