Помогите доработать программу

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
KillJoy
Открыл глаза
Сообщения: 60
Зарегистрирован: Пт окт 29, 2010 19:45:07

Помогите доработать программу

Сообщение KillJoy »

Помогите дописать код программы! Задача в следующем: есть ATTiny2313 и полоска светодиодов(15 штук). Согласно представленной ниже программе светодиоды "бегут" на встрече друг другу из разных концов полоски и встречаются посередине( на 8 светодиоде ). Необходимо доработать ее так, чтобы светодиоды не гасли, когда бегут, а оставались включенными, пока не достигнут цетрна послоски . Затем гаснут, и цикл повторяеться снова.

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

#include <avr/io.h>
#define speed 20000		

void pause (unsigned int a)	
{ unsigned int i;
  for (i=a;i>0;i--);
}
 
int main(void)
{ 
  unsigned char i;
  
  DDRB=0xff;		
  DDRD=0x7f;
  PORTB=0xff;
  PORTD=0x7f;
  

while(1){
 for (i=0;i<8;i++){
 
  PORTB=~_BV(i); 
   PORTD=~_BV(i);
    pause(speed);		   
                   }

 }
}
Реклама
kris95
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Ср янв 07, 2009 19:30:23

Re: Помогите доработать программу

Сообщение kris95 »

Не пользовался такими макросами, но возможно так получится:

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

#include <avr/io.h>
#define speed 20000      

void pause (unsigned int a)   
{ 
  unsigned int i;
  for (i=a;i>0;i--);
}

int main(void)
{ 
  unsigned char i;
  
  DDRB=0xff;      
  DDRD=0x7f;
  PORTB=0xff;
  PORTD=0x7f;
  

  while(1){
    for (i=0;i<8;i++)
    {
       PORTB=PORTB || ( ~_BV(i) );
       PORTD=PORTD || ( ~_BV(i) );
       pause(speed);         
    }
   PORTB=0xFF;
   PORTD=0xFF;
  }
}
Реклама
KillJoy
Открыл глаза
Сообщения: 60
Зарегистрирован: Пт окт 29, 2010 19:45:07

Re: Помогите доработать программу

Сообщение KillJoy »

Неа. Не работает. Светодиоды просто горят. Я сделал вот так:

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

while(1){
 for (n=0;n<10;n++)
 {
 for (i=0;i<9;i++){ //вперед
 PORTB &= ~(1<<i);
 PORTD &= ~(1<<i);
 pause(speed);
                   }
				   
for (i=8;i>0;i--) { //назад
  PORTB |= 1<<i;
  PORTD |= 1<<i;
  pause(speed);
                   }
				   }
KillJoy
Открыл глаза
Сообщения: 60
Зарегистрирован: Пт окт 29, 2010 19:45:07

Re: Помогите доработать программу

Сообщение KillJoy »

А вот как сделать, чтобы они расходились от центра в разные стороны, не могу)
Реклама
Эиком - электронные компоненты и радиодетали
kondor
Нашел транзистор. Понюхал.
Сообщения: 150
Зарегистрирован: Чт апр 29, 2010 10:32:32

Re: Помогите доработать программу

Сообщение kondor »

Хе, без схемы как то сложновато определить конфигурацию портов и светодиодов. Попробуйте :

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

while (1)
{

for (i=0;i<8;i++)
  {
      PORTB |= 1 << i;
      PORTD |= 1 << i;
      pause(speed);
  }

for (i=0;i<8;i++)
  {
      PORTB ^= ~(1 >> (7 - i));
      PORTD ^= ~(1 >> (7 - i));
      pause(speed);
  }

}

Реклама
KillJoy
Открыл глаза
Сообщения: 60
Зарегистрирован: Пт окт 29, 2010 19:45:07

Re: Помогите доработать программу

Сообщение KillJoy »

У меня полусается вот так :

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

for (i=8;i>0;i--) { 
  PORTB &= ~(1<<i);
 PORTD &= ~(1<<i);
  pause(speed);
                   } 
for (i=0;i<9;i++){   //вперед
 PORTB |= 1<<i;
  PORTD |= 1<<i;
 pause(speed);
                }
       }
Схема такая :
И вот еще- в протеусе все работает нормально, а на раельном МК не хочет запускаться! В чем может быть причина?
Вложения
fgbfdg.jpg
(96.99 КБ) 271 скачивание
Реклама
kondor
Нашел транзистор. Понюхал.
Сообщения: 150
Зарегистрирован: Чт апр 29, 2010 10:32:32

Re: Помогите доработать программу

Сообщение kondor »

а ну да, вижу ошибочку у себя .... Если ваш код в протеусе работает, значит дело за тиней.

У вас кварц то какой стоит ? Если вы ставите счетчик до 20000, то при хотя бы 1 МГц (если на внутреннем, если он есть) у вас получается около 50 переключений светодиодов в секунду. Светодиоды просто не успевают гаснуть. А если у вас кварц на 16 .....

И вообще, если вам нужна просто задержка, почему бы не юзать стандартную в либах (пример для gcc):

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

#include <util\delay.h>

.....

_delay_us(50);  // ничего не делать 50 микросекунд
_delay_ms(500); // ничего не делать полсекунды
Компилятор сам рассчитает все циклы относительно заданного в проге кварца...
KillJoy
Открыл глаза
Сообщения: 60
Зарегистрирован: Пт окт 29, 2010 19:45:07

Re: Помогите доработать программу

Сообщение KillJoy »

А какие настройки нужно произвести, чтобы схема работала от внутреннего генератора( если это возможно), а не от внешнего кварца?? Я пишу в WinAVR . И я не совсем понял про частоту - какую частоту выбирать( и как ее вообще выбирать), чтобы светодиоды загорались с нормальной частотой?
kondor
Нашел транзистор. Понюхал.
Сообщения: 150
Зарегистрирован: Чт апр 29, 2010 10:32:32

Re: Помогите доработать программу

Сообщение kondor »

в мейкфайле строчка типа (пример на 2 МГц):
F_CPU = 2000000

Если кварц не стоит то работает либо 4 Мгц, либо 8 Мгц, уж не знаю что у нее стандартно выставлено. Если кварц есть, то можно его частоту попробовать выставить. Чтобы изменить, нужно ковыряться во фьюзах, подробности в даташите в разделе system clock.
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: Помогите доработать программу

Сообщение phanis »

Можно массив написать для эффектов.. и читать с него в порт.
KillJoy
Открыл глаза
Сообщения: 60
Зарегистрирован: Пт окт 29, 2010 19:45:07

Re: Помогите доработать программу

Сообщение KillJoy »

Массивы для меня еще слишком сложные , я ведь только начал программировать под контроллеры.
KillJoy
Открыл глаза
Сообщения: 60
Зарегистрирован: Пт окт 29, 2010 19:45:07

Re: Помогите доработать программу

Сообщение KillJoy »

А как на Mega8 установить все порты как выходы? Так?

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

DDRB = 0xff;
DDRD = 0xff;
DDRC = 0x7f;

PORTB = 0xff;
PORTD = 0Xff;
PORTC = 0x7f;
Аватара пользователя
DimanVIP
Мучитель микросхем
Сообщения: 474
Зарегистрирован: Вт июн 01, 2010 22:12:07
Откуда: Тольятти
Контактная информация:

Re: Помогите доработать программу

Сообщение DimanVIP »

Да, именно так.
[img]http://nekuru.com/images/DimanVIP/t2.png[/img]
Аватара пользователя
DimanVIP
Мучитель микросхем
Сообщения: 474
Зарегистрирован: Вт июн 01, 2010 22:12:07
Откуда: Тольятти
Контактная информация:

Re: Помогите доработать программу

Сообщение DimanVIP »

Все порты на выход:

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

DDRB = 0xff;
DDRD = 0xff;
DDRC = 0x7f;
На всех портах 1:

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

PORTB = 0xff;
PORTD = 0Xff;
PORTC = 0x7f;
[img]http://nekuru.com/images/DimanVIP/t2.png[/img]
KillJoy
Открыл глаза
Сообщения: 60
Зарегистрирован: Пт окт 29, 2010 19:45:07

Re: Помогите доработать программу

Сообщение KillJoy »

А можно на Mega8 Reset сделать входом? И как, если это возможно? На одну из ножек(желательно на RESET) нужно повесить кнопку, при нажатии которой переменная N будет увеличиваться (N++) . Вот как это сделать?
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Помогите доработать программу

Сообщение Engineer_Keen »

KillJoy писал(а):А можно на Mega8 Reset сделать входом?
Да
KillJoy писал(а): И как, если это возможно?
Вы хоть даташит на мегу читали? За ногу RESET отвечает фьюз RSTDISBL. Но если вы его запрограммируете, то дальнейшее программирование возможно только параллельным программатором. Он у вас есть?
KillJoy
Открыл глаза
Сообщения: 60
Зарегистрирован: Пт окт 29, 2010 19:45:07

Re: Помогите доработать программу

Сообщение KillJoy »

Ага
KillJoy
Открыл глаза
Сообщения: 60
Зарегистрирован: Пт окт 29, 2010 19:45:07

Re: Помогите доработать программу

Сообщение KillJoy »

А можно ли каким-нибудь образом регулировать напряжение на выходах МК?
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: Помогите доработать программу

Сообщение phanis »

Да, в не больших пределах, изменением напряжения питания мк.
KillJoy
Открыл глаза
Сообщения: 60
Зарегистрирован: Пт окт 29, 2010 19:45:07

Re: Помогите доработать программу

Сообщение KillJoy »

Ясно. Порекомендуйте, пожалуйста, самоучить по программированию AVR , рассчитанный на начинающих.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»