Без описания |
Поиск в теме | Версия для печати |
Andrey 2004 |
Отправлено: 14 Апреля, 2019 - 18:44:10
|
Капитан
Сообщений всего: 46
Дата рег-ции: Дек. 2018
|
Здравствуйте, тут для того чтобы доделать мой проект, желателен MCP4013T-103E/CH, Цифровой потенциометр, может есть у кого нибудь какие-нибудь наработки по нему?
Работал кто-нибудь с ним? Зашел в даташит-ничего не понял(
Если работали, то буду очень признателен если сможете скинуть мне кусок кода с настройкой. Мне бы посмотреть пример, а потом сам напишу этот код под себя, ну а если код не найдете, то буду благодарен за любые разъяснения, (желательно на пальцах).В интернете инфы про него мало, а та инфа которая есть, на языке ардуино.(Отредактировано автором: 14 Апреля, 2019 - 18:45:24) |
|
|
Andrey 2004 |
Отправлено: 18 Апреля, 2019 - 14:24:14
|
Капитан
Сообщений всего: 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 не работает). |
|
|
Andrey 2004 |
Отправлено: 17 Мая, 2019 - 14:19:44
|
Капитан
Сообщений всего: 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);
}
}
(Добавление)
кстати индикатор у меня с общим анодом, оттуда и подобные символы "~" |
|
|
Andrey 2004 |
Отправлено: 19 Мая, 2019 - 15:27:45
|
Капитан
Сообщений всего: 46
Дата рег-ции: Дек. 2018
|
Predator пишет:думаю, что тут дело не в программе, посмотрите внимательно на токи:
- какой необходим для подсвечивания сегмента
- какой может выдать нога в + состоянии
- какой может выдать нога в - состоянии
- какие реально у вас протекают.
Вероятнее всего нога общего анода банально не тянет ток 7 сегментов.
надо это запомнить, в будущем может пригодится. А проблема оказалась вот в чем программа мерцала светодиодами с такой скоростью что они не успевали гаснуть, поэтому и получалось такое зрелище.)
(Добавление)
сегодня начал практиковаться с EEPROMом. На теории вроде все ясно, но когда перешел на практику то столкнулся с некорректным поведением МК, посидел, подумал и почему то мои подозрения упали на фьюзы, наверняка там есть какой нибудь фьюз для работы с EEPROM, не так ли? Если я прав, то значит жизнь дает понять что без них никуда... |
|
|
|
Поиск в теме | Версия для печати |
Страниц (6): « 1 2 3 4 5 [6] |
« С чего начать? » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|