Свежие обсуждения
Микроконтроллеры

Могу ли я начать изучение микроконтроллеров используя PIC16F74?

1 9 10

Ок, огромное спасибо. Попробую.

Я пробовал вот так:
- - - - - - - - - - - - - - - - - - - -
#define LEDS PORTD
- - - - - - - - - - - - - - - - - - - -
LEDS = ADRES * 24/256;
- - - - - - - - - - - - - - - - - - - -
Но это как раз и дает мырганье на пороге.
Потом добавил перед выводом, задержку:
DelayS(0.15)
В принципе лучше, но скачки есть хоть и реже, да и граница порога становится уже.

 

AnSi: вы убираете младший бит, уменьшая точность замера в 2 раза и больше ничего.
Это почему же в два раза? С результатом можно обращяться считая что он 10 битный или 8 битный (смотря какие настройки). Просто в вычислениях не забывать что был сдвиг.

Или маскировать младший бит
value=read_adc();
value=value|1 //младший разряд будет всегда 1

 

kkol: Надо просто рабочий ход потенциометра разбить на 24 сектора или на 32

32 сектора = 5 бит
введите "гистерезис" на 2 бита

 

AnSi: введите "гистерезис" на 2 бита
Для меня пока это сложно......
Где то увидеть или почитать можно?

 

http://ru.wikipedia.org/wiki/Гистерезис - на картинке хорошо нарисовано(график)

 

например -
АЦП имеет 10 бит - это 1024 варианта результата
вам нужно 32 "сектора" -- 1024/32=32 отсчёта на сектор
в простейшем(вашем) варианте, пороги переключения: 32-64-96-128-.....
----
вы "моргаете" из-за нестабильности младшего бита(или двух), т.е. когда замер прыгает, например 32-33-31-32-33-31...
----

вариантов реализации может быть несколько
один из них -
ввести зону "нечувствительности" , например - при считывании с АЦП
0 - 28 -- 1
36 - 60 --2
68 - 92 -- 3
и т.д. .....
при попадании в диапазон 29-35, 61-67.... значение не меняется(сохраняется предыдущее)
т.е. при нахождении в диапазоне "1"(0-28), вы переключитесь в диапазон "2" при замере больше 35, а вернуться обратно в "1" сможете когда замер опустится ниже 29 - т.е. изменение замеров 29-35 не приведёт к переключению.
---
если попал в диапазон "нечувствительности"(положение резистора) при включении питания(неизвестно предыдущее состояние), то можно выставить ближайшее меньшее/большее значение (какое удобнее)

 

Спасибо. Что такое гистерезис я хорошо знаю, мне просто пока (надеюсь пока) сложно это выразить програмным способом.
Спасибо за варианты решения. Буду пробовать.

AnSi: если попал в диапазон "нечувствительности"(положение резистора) при включении питания(неизвестно предыдущее состояние), то можно выставить ближайшее меньшее/большее значение (какое удобнее)
О, это легко решается, если на входе емкость несколько Мф, при подаче питания и зарядке емкости, напруга поднимется плавно и захватит необходимый диапазон.

 

Привет Всем.
Ну вроде чего то получилось, хочу так сказать похвастаться.. На фотке видно что по порту D(зел.светодиоды), идет бинарное преобразование, а по порту B преобразование в 7 сегентный код.
То есть я сделал первую часть плана - PIC16F74 ЗАРАБОТАЛ !!! под МОЕЙ программой! Да и функции заработали те которые я хотел выполнить на куче логики.

Благодарю Всех за помощь. Особенно pomidor за инфу и rfc за помощь в работе с массивами в соседней теме.
И хоть вычисляю не минимальный элемент массива, а среднее значение, результат очень даже ничего.
Надо ещё учить и учить........................Чем дальше тем страшнее......................

Вот код программы который я наваял, чего сумел то сумел:

#include <htc.h>

#define DESIATKI RC1
#define EDINICY RC2

#define SAMPLES 90 // размер, в принципе если бы я понял как количество выборок увеличить
// результат был бы стабильнее на порядок, памяти не хватает

// #define _XTAL_FREQ 4000000 // типа пригодится на будушее

void sevenSEG(char znaki);

#define TMR0_2 (TMR0 & 12)

bank2 char smpl_U[SAMPLES];

// #define DelayS(T) {unsigned char i; for (i=0; iT*10; i++) __delay_ms(1);} // типа пригодится

void main()
{
int sum = 0;
int adc_znk;
char w;
TRISB = 0;
TRISC = 0;
TRISD = 0;

OPTION = 0b10000111; // повнимательнее

ADCON0 = 0b00000001;
ADCON1 = 0b00000000;

for (;;) {
for (w = 0; w < SAMPLES; w++) {
GODONE = 1;
while (GODONE) ;

sum += ADRES - smpl_U[w];
smpl_U[w] = ADRES;

adc_znk = (sum / SAMPLES) * 24/256;

PORTD = adc_znk;
// показываем 2.048 ms - надо по осцилу посмотреть
while (!TMR0_2) // ждём
;
sevenSEG(adc_znk / 10); // делим и десятки показываем
DESIATKI = 1; // показываем
while (TMR0_2) // ждём
;
// показываем 2.048 ms - надо по осцилу посмотреть
while (!TMR0_2) // ждем
;
sevenSEG(adc_znk % 10); // показываем единицы
EDINICY = 1; // включаем
while (TMR0_2) // опять ждем
;
}
}
}

void sevenSEG(char znaki)
{
const char sevenPat[10] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
PORTB = 0; // очищаем порты, иначе остаются старые данные
RC1 = 0;
RC2 = 0;
PORTB = sevenPat[znaki]; // Ну а это цифири.......
}

Приветствуются поправки, учитывая что я начал заниматься программированием в начале августа, они нужны.

В принципе, я подошел к моменту когда надо перейти на 887й PIC.
А так как там EEPROM, то грех не заменить резистор на валкодер.

Вот и вопрос: в митино купил нечто трещащее и похожее на потенциометр, подойдет для моих целей?

 

ну вот, зарделся как ник

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

если то, что вы купили похоже на http://www.platan.ru/cgi-bin/qwery.pl/id=708564372&group=32405 или на то, что можно выковырить из убитой более-менее современной автомагнитолы (где регуляторы крутятся с ощутимым дискретом) - то исходников для них тоже в сети вагончик. Хотя сам никогда ими не пользовался в своих поделках ( )
ps про массивы на си мне понравилось в книжке про http://www.smileymicros.com/index.php?module=pagemaster&PAGE_user_op=view_pa... (хоть и winavr, но си и в африке си, в сети лежит, если вдруг ее на вашем фтп нет)

 

kkol: В принципе, я подошел к моменту когда надо перейти на 887й PIC
Я как раз разбираю второй урок, шедший вместе с программатором по косточкам...