Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » Вопросы чайника

Страниц (17): В начало « ... 4 5 6 7 [8] 9 10 11 12 ... » В конец
 

106. alex91 - 12 Сентября, 2010 - 00:53:11 - перейти к сообщению
Вроде в сообщении расставил все запятые может теперь будет понятливее что я имею в виду Улыбка
107. nest - 12 Сентября, 2010 - 01:25:36 - перейти к сообщению
alex91, а попробуйте нарисовать диаграмму алгоритма. или описать словами, что в какой момент должно выполняться.
108. alex91 - 12 Сентября, 2010 - 01:46:31 - перейти к сообщению
Алгоритм будет такой:при включении он просто едет вперед и фото резистор при слабом освещении включает фары,а при возникновении препятствии он его объежает и едет дальше
Если есть сигнал от передатчика он переходит на выполнение этих команд и если в течении нескольких секунд нет команд от пульта он снова едет и объежает преграды
Хочу сделать в программе чтобы фоторезистор который при слабом
освещении включает фары работал независимо от остальной программы

Если надо я накалякаю схему своего аппарата
109. mihail - 12 Сентября, 2010 - 01:53:48 - перейти к сообщению
alex91, все таки стоило открыть другую тему.
alex91 пишет:
как сделать чтобы, одна операция в программе не мешала другой в работе ... что нужно чтобы они независимо работали

Независимо (параллельно) программы работать в микроконтроллере не могут. Решение всех проблем лежит на плечах программиста.
alex91 пишет:
хочу объединить три программы в одну
1 программу для объезда препятствий на 3 tcop-ах
2 радиоуправление
3 датчик света в пространстве

1 и 2 вроде писали. И вроде все работало Замешательство Добавили бы проверку ножки микроконтроллера к которой подключен датчик света и все.
110. alex91 - 12 Сентября, 2010 - 02:02:12 - перейти к сообщению
Доброй ночи Mihaih
я так и сделал, тсопы работают , реагируют, но радиоуправление не хочет работать и робот вообще не едет при включении как будто перегружен
Я уже несколько дней с этой прошивкой мучеюсь думал еще одно прерывание сделать чтобы выполнялась программа радиоуправление

а так радиоуправление и тсопы отдельно работают а как их вместе объединить не знаю
111. mihail - 12 Сентября, 2010 - 02:38:21 - перейти к сообщению
alex91, создайте новую тему. Там разместите все три работающие (проверенные) программы. Только, пусть программы будут с комментариями Улыбка Чем больше комментариев, тем лучше Улыбка А там, глядишь чего и придумаем Ухмылка
112. zatmenie - 21 Сентября, 2010 - 23:19:00 - перейти к сообщению
Михаил большое спасибо что научили делать задержку таймером. Теперь хочу найчится создавать ШИМ. Не поможете? Голливудская улыбка да и если можно то и с помощью CVAVR и таким методом как задержка
113. mihail - 22 Сентября, 2010 - 18:40:53 - перейти к сообщению
Достоинством приведенного ниже способа создания ШИМ (PWM) является то, что можно организовать ШИМ (PWM) практически на любой ножке микроконтроллера. А недостатком является то, что необходимо учитывать возможные конфликты прерываний.
CODE:

/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.8a Evaluation
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 22.09.2010
Author : Freeware, for evaluation and non-commercial use only
Company :
Comments:


Chip type : ATtiny2313
AVR Core Clock frequency: 4,000000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 32
*****************************************************/

#include <tiny2313.h>

/* прерывание при переполнении таймера/счетчика 0 */
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
/* PB7=0, PB6=0, PB5=0, PB4=0, PB3=0, PB2=0, PB1=1, PB0=1 */
PORTB = 0b00000011;
/* PD7=0, PD6=0, PD5=0, PD4=0, PD3=0, PD2=0, PD1=0, PD0=0 */
PORTD = 0b00000000;
}

/* прерывание при совпадении счетного регистра TCNT0 с регистром сравнения OCR0A таймера/счетчика 0 */
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
/* PD7=0, PD6=1, PD5=1, PD4=1, PD3=1, PD2=1, PD1=1, PD0=1 */
PORTD = 0b01111111;
}

/* прерывание при совпадении счетного регистра TCNT0 с регистром сравнения OCR0В таймера/счетчика 0 */
interrupt [TIM0_COMPB] void timer0_compb_isr(void)
{
/* PB7=0, PB6=0, PB5=0, PB4=0, PB3=1, PB2=1, PB1=0, PB0=0 */
PORTB = 0b00001100;
}

void main(void)
{

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

/* все выводы порта B сконфигурировать как выходы */
DDRB = 0b11111111;
PORTB = 0b00000000;

/* все выводы порта D сконфигурировать как выходы */
DDRD = 0b11111111;
PORTD = 0b00000000;

/* Timer/Counter 0 Control Register A */
/* регистр управления таймером/счетчиком 0 А */
/* биты регистра:
COM0A1 COM0A0 COM0B1 COM0B0 Reserved Reserved WGM01 WGM00 */
TCCR0A = 0b00000000;

/* Timer/Counter 0 Control Register B */
/* регистр управления таймером/счетчиком 0 В */
/* биты регистра:
FOC0A FOC0B Reserved Reserved WGM02 CS02 CS01 CS00 */
TCCR0B = 0b00000011;

/* Timer/Counter 0 */
/* счётный регистр таймера/счетчика 0 */
TCNT0 = 0;

/* Output Compare Register А */
/* регистр сравнения таймера/счетчика 0 А */
OCR0A = 100;

/* Output Compare Register В */
/* регистр сравнения таймера/счетчика 0 В */
OCR0B = 200;

/* Timer/Counter Interrapt Mask Register */
/* регистр маски прерываний таймеров/счетчиков */
/* биты регистра:
TOIE1 OCIE1A OCIE1B Reserved ICIE1 OCIE0B TOIE0 OCIE0A */
TIMSK = 0b00000111;

/* глобальное разрешение прерываний */
#asm("sei")

while (1)
{
/* *******************************************
Изменяя значение регистров сравнения можно менять значение ШИМ (PWM)
Так как таймер/счетчик 0 является восьмиразрядным, то значения регистров сравнения должны быть от 0 (0b00000000 или 0x00) до 255 (0b11111111 или 0xFF)
******************************************* */
OCR0A = 128;
/* *******************************************
ШИМ (PWM) на всех ножках порта D составляет около 50%
******************************************* */
OCR0B = 64;
/* *******************************************
ШИМ (PWM) на PB1 и PB0 составляет около 25%
ШИМ (PWM) на PB3 и PB2 составляет около 75%
******************************************* */
}
}

В этой программе для Вас не должно быть ничего нового. Простой ШИМ (PWM) организован на ножках порта D. Более интересен вариант на ножках порта B. Увеличение ШИМ (PWM) на PB1 и PB0 приводит к пропорциональному уменьшению ШИМ (PWM) на PB3 и PB2. И наоборот.
114. nest - 22 Сентября, 2010 - 19:11:15 - перейти к сообщению
mihail пишет:
организовать ШИМ (PWM) практически на любой ножке микроконтроллера. А недостатком является то, что необходимо учитывать возможные конфликты прерываний.

а ещё на максимальной частоте ШИМ и в крайних положениях будут проблемы.
так что ШИМ лучше брать пределах от 10 до 245 ... что бы хоть пару тактов на основную программу осталось, а то так и будет прыгать по прерываниям.

В остальном - вполне рабочий подход.
115. mihail - 22 Сентября, 2010 - 19:26:34 - перейти к сообщению
Это ценные замечания. Спасибо!
И еще. Делая ШИМ (PWM) необходимо учитывать возможности аппаратуры которой придется работать с этим ШИМ (PWM). Не все может работать с большой частотой ШИМ (PWM). Регулируется частота, в данном случае, предделителем таймера/счетчика и подбором тактовой частоты микроконтроллера.
116. nest - 22 Сентября, 2010 - 20:34:54 - перейти к сообщению
mihail пишет:
Регулируется частота, в данном случае, предделителем таймера/счетчика и подбором тактовой частоты микроконтроллера.
более точно можно её "подрихтовать" задержкой в прерывании (переполнения и/или сравнения).
Хотя это уже изврат :)
117. zatmenie - 23 Сентября, 2010 - 20:46:58 - перейти к сообщению
Очередной раз спасибо Вам Михаил и всем кто помогает и советует, будем сидеть и разбираться.
118. zatmenie - 17 Октября, 2010 - 23:12:13 - перейти к сообщению
Всем привет. вот вопрос появился. Можно ли соединить 2 мк так что бы в случае какого либо сбоя один мк перепрограммировал другой?
119. Белый Волк - 18 Октября, 2010 - 09:01:08 - перейти к сообщению
zatmenie
Многие микроконтроллеры AVR имеют возможность перепрограммировать себя сами при помощи bootloader. Однако, не ясна поставленная Вами задача: о каком сбое идёт речь, если после него требуется перепрограммирование?
120. zatmenie - 18 Октября, 2010 - 16:36:12 - перейти к сообщению
Белый Волк пишет:
Однако, не ясна поставленная Вами задача: о каком сбое идёт речь, если после него требуется перепрограммирование?

ну я не знаю, просто было интересно. может быть нужно будет не перепрограммировать мк а изменить программу. может быть можно сделать так: в мк записана какая то программа, так же к мк подключена какая нибудь память(например флэш) и подключен радиоприемник, нужно изменить программу на расстоянии, я передаю новую программу по радиоканалу, мк её принимает и записывает в подключенную память а потом перепрограммирует себя или каким то другим образом изменяет свою программу. фуф, вот надеюсь понятно написал предполагаемую задачу.
да и где можно найти подробную информацию о bootloader на русском? как оно вообще устроено?