Страница 195 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт мар 29, 2012 16:03:39
vitalik_1984
*Trigger* писал(а):Из PORTx ничего не прочитать, там всегда нули.
это откуда вы взяли?
а как же вы тогда применяете конструкцию
по вашим словам можно решить что это выражение всегда приводит к одному результату,независимо от того что было в регистре.
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)
на частоту 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
при попытке откомпилировать проэкт программа указывает на ошибку в этой строке
что сдесь может быть не так ?