roboforum.ru

Технический форум по робототехнике.


del pls

Блоги посетителей.
Правила форума
В данном разделе каждый может иметь не более одной темы. Тема должна начинаться с логина (ника) робофорума.

del pls

Сообщение d3xr » 23 июн 2011, 22:47

del pls
Вложения
2.png
Последний раз редактировалось d3xr 18 мар 2016, 12:39, всего редактировалось 4 раз(а).
Аватара пользователя
d3xr
 
Сообщения: 201
Зарегистрирован: 01 июн 2010, 08:04
Откуда: Казань

Re: [d3xr] - На пути совершенствования всего и вся!

Сообщение Vovan » 09 июл 2011, 14:25

Это не сложнее, но по аналогии: руки привязать к телу, вложить в них молоток и заставить забивать гвоздики (установленные) - можно забить? Можно. А можно: одной рукой забивать гвоздь (даже не гвоздик!), а второй рукой чесать за ухом (и не только), например. :)
_________
Sincerely,
Vovan
Аватара пользователя
Vovan
 
Сообщения: 3340
Зарегистрирован: 05 окт 2005, 12:03
Откуда: Литва
прог. языки: asm

Re: [d3xr] - На пути совершенствования всего и вся!

Сообщение galex1981 » 09 июл 2011, 21:42

Программный ШИМ и можно реализовывать и это ничуть не сложно, но программный ШИМ загружает МК сильно, и если требуется процессорное время на другие более важные задачи, то лучше организовывать аппаратный ШИМ. А вообще нужно бы в традицию ввести, что если что есть аппаратное в МК, прежде всего нужно его юзать, а лишь потом если не хватает аппаратного программный делать
if(!Operate) Read(pDatasheet);
Аватара пользователя
galex1981
 
Сообщения: 4358
Зарегистрирован: 04 дек 2008, 22:44
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович

Re: [d3xr] - На пути совершенствования всего и вся!

Сообщение boez » 10 июл 2011, 22:21

У программного ШИМ точность ниже. И требования к остальному коду строже (не сидеть подолгу в прерываниях и т.п.).
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: [d3xr] - На пути совершенствования всего и вся!

Сообщение d3xr » 08 авг 2011, 00:58

Поставил AVR Studio 5. До этого Code Vision AVR мучал. Перенес проект, он не компилится. Ругается например на такую простую вещь как PORTA.5 = 0

Почему? Как эму написать нужно?
Аватара пользователя
d3xr
 
Сообщения: 201
Зарегистрирован: 01 июн 2010, 08:04
Откуда: Казань

Re: [d3xr] - На пути совершенствования всего и вся!

Сообщение dccharacter » 08 авг 2011, 01:01

Посмтреть в заголовочный файл (недавно обсуждали - PORTA.5 - это фишка компилятора, вообще имя переменной - поле структуры PORTA - не может начинаться с цифры).
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: [d3xr] - На пути совершенствования всего и вся!

Сообщение d3xr » 08 авг 2011, 01:13

Простите, куда посмотреть? оО

Нашел ответ сам! В студии подобная операция обозначается PORTA |= (1 << 0);
Аватара пользователя
d3xr
 
Сообщения: 201
Зарегистрирован: 01 июн 2010, 08:04
Откуда: Казань

Re: [d3xr] - И никаких гвоздей! оО

Сообщение d3xr » 16 авг 2011, 21:50

Разобрался с прерываниями почти.

Код: Выделить всёРазвернуть
#include <mega16.h> 
#include <delay.h>

unsigned char segment[10]=

{ 0x40,0x76,0xC,0x24,0x32,0x21,0x1,0x74,0x0,0x20 },

data[4]= {0,0,0,0};
int i=0;             
     

     void cifra(int z)

    PORTC=0xFF;   
    PORTC = segment[z];
    delay_ms(4);
   
}
   
   void print(int n)
{

data[0]=n%10; n = n/10;   
data[1]=n%10; n = n/10;   
data[2]=n%10; n = n/10;     
data[3]=n%10;

}

void beep(int z)
    { 
   
    for(i=0;i<z;i++)
        {
        PORTD.7=0;
        delay_ms(50);
        PORTD.7=1;
        delay_ms(50);
        PORTD.7=0;
        }
    }
   
void initialization()
{

PORTA=0xF0;
DDRA=0xFD;             

PORTC=0xFF;
DDRC=0xFF; 

PORTD=0x00;
DDRD=0x80;

TCCR0=0x03;
TCNT0=0x00;
OCR0=0x00;

ASSR=0x00;
TCCR2=0x04;
TCNT2=0x00;
OCR2=0x00;

TIMSK=0x41;   

#asm("sei")



}
 

void main(void)
{

initialization(); 

while (1)
      { 
       
      print(1478);       
     
      };
}         


interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{         

PORTA=0x10; cifra(data[0]);
PORTA=0x20; cifra(data[1]);
PORTA=0x40; cifra(data[2]);
PORTA=0x80; cifra(data[3]);

}


interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{

if (PINA.1==0) beep(1);

}


Только вот проблема, при срабатывании 2го прерывания (зажал кнопку на PD7) начинает выполняться процедура beep и индикатор на время зажатия кнопки отваливается. Можно как нибудь разграничить прерывания?

Или еще идея, в теле beep запретить преывания, а при выходе разрешить... Будет работать?
Аватара пользователя
d3xr
 
Сообщения: 201
Зарегистрирован: 01 июн 2010, 08:04
Откуда: Казань

Re: [d3xr] - И никаких гвоздей! оО

Сообщение MiBBiM » 16 авг 2011, 22:06

убрать задержки в теле beep, перенести их в прерывание от таймера.
т.е. примерно так:
Код: Выделить всёРазвернуть
volatile char rest = 0, cnt = 0;

inline void process_beep() {
  if (rest >= 0) {
    speaker = cnt & 1;
    rest--;
  } else speaker = 0;
}

tmr_int_ovf() {
  cnt++;
  process_beep();
  if (button_is_pressed) rest = 50;
}
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: [d3xr] - И никаких гвоздей! оО

Сообщение d3xr » 16 авг 2011, 22:32

Причесал немного код, убрал задержки. Теперь при нажатии кнопки высоким уровнем заставляем пищать пьезоэлемент, при отпускании опять прибиваем к земле. Во время нажатия индикатор по прежнему бездействует.

Код: Выделить всёРазвернуть
#include <mega16.h> 
#include <delay.h>

unsigned char segment[10]=

{ 0x40,0x76,0xC,0x24,0x32,0x21,0x1,0x74,0x0,0x20 },     //symbols of 7-segment indicator
//   0    1    2   3    4    5   6    7   8    9 

data[4]= {0,0,0,0};                                     //4 symbols in 4 indicators
           
     
   void print(unsigned char n)                          //processing data,
{

data[0]=n%10; n = n/10;                               //calculating   
data[1]=n%10; n = n/10;   
data[2]=n%10; n = n/10;     
data[3]=n%10;

}

void beep()
    {
        PORTD.7=1;       
    }
   
void initialization()
{

PORTA=0xF0;
DDRA=0xFD;             

PORTC=0xFF;
DDRC=0xFF; 

PORTD=0x00;
DDRD=0x80;

TCCR0=0x03;
TCNT0=0x00;
OCR0=0x00;

ASSR=0x00;
TCCR2=0x04;
TCNT2=0x00;
OCR2=0x00;

TIMSK=0x41;   

#asm("sei")

}
 

void main(void)
{

initialization(); 

while (1)
      { 
       
      print(1478);       
       
      };
}         


interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{         

PORTC=0xFF; PORTA=0x10; PORTC = segment[data[0]]; delay_ms(5);
PORTC=0xFF; PORTA=0x20; PORTC = segment[data[1]]; delay_ms(5);
PORTC=0xFF; PORTA=0x40; PORTC = segment[data[2]]; delay_ms(5);
PORTC=0xFF; PORTA=0x80; PORTC = segment[data[3]]; delay_ms(5);

}


interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{

if (PINA.1==0)
{
beep();
delay_ms(50);
PORTD.7=0;
}

}


Насколько я понял, на прерывание от 0 таймера просто не хватает времени, поэтому и пусто. #asm("cli") #asm("sei") не особо помогли, все так же...
Аватара пользователя
d3xr
 
Сообщения: 201
Зарегистрирован: 01 июн 2010, 08:04
Откуда: Казань

Re: [d3xr] - И никаких гвоздей! оО

Сообщение MiBBiM » 16 авг 2011, 22:36

вы просто перенесли задержки из ф-ии beep в обработчик таймера, а смысл в том, чтобы убрать задержки в прерываниях.
иначе говоря, можно настроить срабатывание таймера каждые 50мс, и включать/отключать динамик, обрабатывать кнопку.
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: [d3xr] - И никаких гвоздей! оО

Сообщение d3xr » 16 авг 2011, 22:49

Такой вариант заработал
Код: Выделить всёРазвернуть
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
#asm("sei")

if (PINA.1==0)
{
  PORTD.7=1;
  delay_ms(50);
  PORTD.7=0;
}

}

А каким способом можно настроить срабатывание, не используя задержек?
Аватара пользователя
d3xr
 
Сообщения: 201
Зарегистрирован: 01 июн 2010, 08:04
Откуда: Казань

Re: [d3xr] - И никаких гвоздей! оО

Сообщение MiBBiM » 16 авг 2011, 23:03

вот закомментировал код, который написал выше.
Код: Выделить всёРазвернуть
volatile char rest = 0, cnt = 0;
// rest - количество "тиков", которые осталось совершить. нужно чтобы динамик еще чуть-чуть покричал после отпускания кнопки
// cnt - просто вспомогательный счетчик

inline void process_beep() {
  if (rest > 0) {
    speaker = cnt & 1;    // cnt&1 эквивалентно cnt%2, т.е. на ножке будет четность cnt
    rest--;
  } else speaker = 0;
}

tmr_int_ovf() {     // это прерывание срабатывает раз в 50мс
  cnt++;            // cnt++ изменяет четность cnt
  process_beep();
  if (button_is_pressed) rest = 50;
}

как настроить срабатывание на нужный интервал - http://easyelectronics.ru/avr-uchebnyj- ... jmery.html
алго: если после нажатия кнопки прошло менее 50 тиков == 50*50мс, то каждые 50мс переключаем канал динамика.
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: [d3xr] - И никаких гвоздей! оО

Сообщение d3xr » 17 авг 2011, 18:16

Спасибо большое, теперь понятно!
Аватара пользователя
d3xr
 
Сообщения: 201
Зарегистрирован: 01 июн 2010, 08:04
Откуда: Казань

Re: [d3xr] - И никаких гвоздей! оО

Сообщение d3xr » 26 авг 2011, 23:42

Задача. Разработать шасси для полноразмерной роботизированной платформы (с человеческий рост). 2 ведущих колеса, 1 подруливающее. Переносимый вес - около 80кг (в идеале 150). Требуемая скорость - 5 км/ч. Бюждет НЕ ОГРАНИЧЕН. С чего начать, в какую сторону копать?
Аватара пользователя
d3xr
 
Сообщения: 201
Зарегистрирован: 01 июн 2010, 08:04
Откуда: Казань

Re: [d3xr] - И никаких гвоздей! оО

Сообщение dccharacter » 27 авг 2011, 10:40

d3xr писал(а):Задача. Разработать шасси для полноразмерной роботизированной платформы (с человеческий рост). 2 ведущих колеса, 1 подруливающее. Переносимый вес - около 80кг (в идеале 150). Требуемая скорость - 5 км/ч. Бюждет НЕ ОГРАНИЧЕН. С чего начать, в какую сторону копать?


С размещения этого объявления в разделе "предложение работы"
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Пред.След.

Вернуться в Блоги

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Mail.ru counter