роботы робототехника микроконтроллеры


 Страниц (6): « 1 2 3 4 5 [6]   

> Без описания
Andrey 2004 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Дек. 2018  



Хорошо, спасибо, не знал.
 
 Top
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1307
Дата рег-ции: Июль 2012  



опыт приходит сразу после того, как был нужен.
 
 Top
Andrey 2004 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Дек. 2018  



Действительно Улыбка .
 
 Top
Andrey 2004 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Дек. 2018  



Здравствуйте, тут для того чтобы доделать мой проект, желателен MCP4013T-103E/CH, Цифровой потенциометр, может есть у кого нибудь какие-нибудь наработки по нему?
Работал кто-нибудь с ним? Зашел в даташит-ничего не понял(
Если работали, то буду очень признателен если сможете скинуть мне кусок кода с настройкой. Мне бы посмотреть пример, а потом сам напишу этот код под себя, ну а если код не найдете, то буду благодарен за любые разъяснения, (желательно на пальцах).В интернете инфы про него мало, а та инфа которая есть, на языке ардуино.

(Отредактировано автором: 14 Апреля, 2019 - 18:45:24)

 
 Top
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1307
Дата рег-ции: Июль 2012  



две ноги: CS и U/D
CS - стоит в 1 (его естественное состояние)

Выставляете на U/D направление
Выставляете CS в 0
передергиваете U/D (0->1->0) столько раз, сколько нужно шагов.
Выставляете CS в 1.
 
 Top
Andrey 2004 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Дек. 2018  



Благодарю, будет время разберусь до конца.
А я тут опять "накодил" , написал я программу, проверил на железе, все работает.
Решил ее оптимизировать слегка, и вот что написал:

CODE:
#define F_CPU 1000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
int M,A,B,H,u,p,F;

// кнопка "меню"
ISR(INT1_vect)
{

PORTB|=(1<<0);
_delay_ms(50);
PORTB &=~(1<<0);

if (~PIND&(1<<3))// если кнопка"старт" нажато то флаг ставим в "1"
{

H=1;// сам флаг
u=0;// флаг устанавливаем в ноль чтобы обнуить Т1 и А
}
}
//------------------------------------------

// счетчик времени работы двигателя
ISR(TIMER1_OVF_vect)
{
A++;
TCNT1=32768;//тут надо подгадать под 10 сек.
}
//------------------------------------------

// кнопка "меню"
ISR(TIMER0_OVF_vect)
{
if (~PIND & (1<<1))
{


_delay_ms(250);

if (~PIND & (1<<1))
{
M++;
PORTB|=(1<<0);
_delay_ms(50);
PORTB&=~(1<<0);

}
if (M > 2)
{
M = 0;
}
}
}
//------------------------------------------

// кнопка"-" и "+"
ISR(TIMER2_OVF_vect)
{
//----------------------------------------

//-----------------------------------------
if (~PIND &(1<<2))
{
if (M==1)
{
if (B!=0)
{
PORTB|=(1<<0);
_delay_ms(50);
PORTB &=~(1<<0);
B--;
}
}

else if (M==2)
{
if (F!=0)
{
PORTB|=(1<<0);
_delay_ms(50);
PORTB &=~(1<<0);
F--;
}
}
}
//------------------------------------
if (~PIND &(1<<0))
{
if (M==1)
{
PORTB|=(1<<0);
_delay_ms(50);
PORTB &=~(1<<0);
B++;
}
else if (M==2)
{
PORTB|=(1<<0);
_delay_ms(50);
PORTB &=~(1<<0);
F++;
}
//-----------------------------------

//---------------------------------------------
}

}
//------------------------------------------
int main(void)
{
//-----------------------
DDRB=0xff;
PORTB=0x00;
DDRD=0x00;
//-----------------------
TCCR1B|=(1<<1);//Предделитель = 8
TCCR0|=(1<<0);//Предделитель = 1
TCCR2|=(1<<0);//Предделитель = 1

TIMSK|=(1<<TOIE0);//Разрешить прерывание по переполнению таймера 0
TIMSK|=(1<<TOIE1);//Разрешить прерывание по переполнению таймера 1
TIMSK|=(1<<TOIE2);//Разрешить прерывание по переполнению таймера 2

TCNT2=200;//Начальное значение таймера 2
TCNT0=200;//Начальное значение таймера 0
TCNT1=32768;//Начальное значение таймера 1
//------------------------------
sei();//Разрешить прерывания
//------------------------------
GICR |=(1<<7);// Разрешаем прерывание INT1
MCUCR =0b00000000;// Генерация сигнала при низком уровне на ножке PD3
//------------------------------
while(1)
{

if (H==1)// проверка: стоит ли флаг
{
if (u==0)// переменная которая обнуляет значен. Т1 и переменной А
{
TCNT1=0;//тут надо додгадать под 10 сек.
A=0;//обнуление
u=1;//ставим флаг в "1", теперь пока двиг. не остановится мы в этот код не попадем
}

if (A==B)// если А (переменная которая изменяется при переполнении Т1) сравняется с В (выставленная пользователем переменная) то двиг. остановится и мы обнулим флаг
{
PORTB &=~((1<<1)|(1<<2));// остан. двиг.
H=0;// т е если двигатель остановился то выходим из функции
u=0;// если
}
else
{
PORTB|=((1<<1)|(1<<2));// если А не равно В то крутим двиг.
}
}

}
}

(Добавление)
изначально у меня в этой программе опрос 3ей кнопки был в основном цикле:
CODE:
while(1)
{


if (~PIND&(1<<3))// если кнопка"старт" нажато то флаг ставим в "1"
{
PORTB|=(1<<0);
_delay_ms(50);
PORTB &=~(1<<0);
if (~PIND&(1<<3))
{
H=1;// сам флаг
u=0;// флаг устанавливаем в ноль чтобы обнуить Т1 и А
}
}

if (H==1)// проверка: стоит ли флаг
{
if (u==0)// переменная которая обнуляет значен. Т1 и переменной А
{
TCNT1=0;//тут надо додгадать под 10 сек.
A=0;//обнуление
u=1;//ставим флаг в "1", теперь пока двиг. не остановится мы в этот код не попадем
}

if (A==B)// если А (переменная которая изменяется при переполнении Т1) сравняется с В (выставленная пользователем переменная) то двиг. остановится и мы обнулим флаг
{
PORTB &=~((1<<1)|(1<<2));// остан. двиг.
H=0;// т е если двигатель остановился то выходим из функции
u=0;// если
}
else
{
PORTB|=((1<<1)|(1<<2));// если А не равно В то крутим двиг.
}
}

}

Но в процессе оптимизации решил что было бы неплохо перенести тот самый опрос кнопки во внешнее прерывание... Не покатило... Сижу мучаюсь, ничего понять не могу компилятор
говорит что все нормально... Вроде работаю в прерывании я только с переменными, че не так Замешательство
Может есть правило о котором я и не догадываюсь??
Надеюсь на вашу помощь. (в саму программу вникать не обязательно, тк даже я там путаюсь немного, главное дайте понять почему мой "оптимизированный" вариант с опросом кнопки в прерывании INT1 не работает).
 
 Top
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1307
Дата рег-ции: Июль 2012  



что-то я не понял вашей затеи с таймерами и кнопками.
можно-же по одному таймеру прочитать весь порт D, и разобрать какие там кнопки нажаты.
 
 Top
Andrey 2004 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Дек. 2018  



Спасибо за совет, честно говоря я это уже пытался делать - не получилось, но сейчас попробовал еще раз и все заработало) Спасибо еще раз)

(Отредактировано автором: 21 Апреля, 2019 - 07:31:52)

 
 Top
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1307
Дата рег-ции: Июль 2012  



я понял, что у вас с таймерами: проверьте фьюзы, там по умолчанию делитель на 8 устанавливается.
 
 Top
Andrey 2004 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Дек. 2018  



Predator пишет:
я понял, что у вас с таймерами: проверьте фьюзы, там по умолчанию делитель на 8 устанавливается.
хм... ладно по изучаю фьюзы...спасибо)
(Добавление)
Я тут сделал программу. Сейчас устраняю всякие мелочные ошибки, среди которых непонятка с индикатором... Если ты подаешь на сигмент "+" то он загорается и работает как надо, но если я подаю на него "-" то какие то сигменты гаснут, а какие то начинают гореть в пол силы...
Таким образом нужно всматриваться в индикатор чтобы понять какая цифра на нем горит.
Скидывать программу которую написал не очень хочу из за ее размеров, поэтому скину программу которая покажет вам сам принцип по которому работает индикатор...
(Добавление)
CODE:
//-----------------------------***Семисигментный индикатор c массивом***-----------------------------//

# define F_CPU 1000000UL
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#define chislo PORTB
#define razriad PORTD
unsigned int razr1 = 0, razr2 = 0, razr3 = 0, razr4 = 0;
unsigned char LOL;
//----------------------------------------------------------------------------------------//
int chisla [10]=
{
~0b10111111,//0
~0b10000110,//1
~0b11011011,//2
~0b11001111,//3
~0b11100110,//4
~0b11101101,//5
~0b11111101,//6
~0b10000111,//7
~0b11111111,//8
~0b11101111,//9
};

ISR(TIMER0_OVF_vect)
{
if (LOL == 1) {razriad = 0b00000001; chislo = chisla [razr1];}
if (LOL == 2) {razriad = 0b00000010; chislo = chisla [razr2];}
if (LOL == 3) {razriad = 0b00000100; chislo = chisla [razr3];}
if (LOL == 4) {razriad = 0b00001000; chislo = chisla [razr4];}
LOL++;
if( LOL > 4 ) LOL = 0;
}



void vse_chislo (unsigned int razbivka_chisla)
{
razr1 = razbivka_chisla/1000;//тысячи
razr2 = razbivka_chisla%1000/100;//сотни
razr3 = razbivka_chisla%100/10;//десятки
razr4 = razbivka_chisla%10;//еденицы
}
int main(void)
{
DDRB=0xFF;
PORTB=0x00;
DDRD=0xFF;
PORTD=0x00;
TCCR0|=(1<<1); TCCR0&= ~ ((1<<0)|(1<<2));
TIMSK|=(1<<0);
TCNT0 = 0;
sei();
//----------------------------------------------------------------------------------------//
razriad=0b00000001;
chislo=0b00111111;

while(1)
{
vse_chislo (1234);
}

}

(Добавление)
кстати индикатор у меня с общим анодом, оттуда и подобные символы "~"
 
 Top
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1307
Дата рег-ции: Июль 2012  



думаю, что тут дело не в программе, посмотрите внимательно на токи:
- какой необходим для подсвечивания сегмента
- какой может выдать нога в + состоянии
- какой может выдать нога в - состоянии
- какие реально у вас протекают.
Вероятнее всего нога общего анода банально не тянет ток 7 сегментов.
 
 Top
Andrey 2004 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Дек. 2018  



Predator пишет:
думаю, что тут дело не в программе, посмотрите внимательно на токи:
- какой необходим для подсвечивания сегмента
- какой может выдать нога в + состоянии
- какой может выдать нога в - состоянии
- какие реально у вас протекают.
Вероятнее всего нога общего анода банально не тянет ток 7 сегментов.

надо это запомнить, в будущем может пригодится. А проблема оказалась вот в чем программа мерцала светодиодами с такой скоростью что они не успевали гаснуть, поэтому и получалось такое зрелище.)
(Добавление)
сегодня начал практиковаться с EEPROMом. На теории вроде все ясно, но когда перешел на практику то столкнулся с некорректным поведением МК, посидел, подумал и почему то мои подозрения упали на фьюзы, наверняка там есть какой нибудь фьюз для работы с EEPROM, не так ли? Если я прав, то значит жизнь дает понять что без них никуда...
 
 Top
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1307
Дата рег-ции: Июль 2012  



фьюзы - это обычный регистр, который прописывается программатором, а не в "рантайме" ничего сложного в них нет, и честно говоря работу надо начинать с них...
на тему EEPROM - да, биты защиты есть, возможно правда не во фьзах, а в другом каком- регистре (я-то с АВРами не работал почти)
 
 Top
Страниц (6): « 1 2 3 4 5 [6]
« С чего начать? »


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





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru