Мелкие вопросы по МК и ПЛИС.
Re: Различные мелкие вопросы
ну какой 1А? ток коллектора самого транзистора 100мА, в пике 200мА. (BC850 smd).
- Engineer_Keen
- Друг Кота
- Сообщения: 3868
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Различные мелкие вопросы
Я потому и спросил
Тут надо 7-8 килоом (для максимального тока). А когда я управлял светодиодами (соответственно 10-20мА), я вообще 36к ставил (правда у меня транзисторы были BC848C, у них Hfe=400-800)
Re: Различные мелкие вопросы
Чтобы ножку МК подтянуть на лог. "0", можно ли просто подсоединить резистор 1к на эту ножку, и другой вывод резистора - на - питания?
Не много ли будет 1к?
или в самый раз?

Не много ли будет 1к?
или в самый раз?
Не умеешь - не берись, но не взявшись не научишься...
Re: Различные мелкие вопросы
а что планируется, на вход или выход?
на вход в Z-состоянии должен быть вывод, и сажай на плюс или минус. лучше резистором в 30к.
на вход в Z-состоянии должен быть вывод, и сажай на плюс или минус. лучше резистором в 30к.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Различные мелкие вопросы
GP1 писал(а):Резистор нужен по-любому - иначе кердык
R=(Voh-Vbesat)*h21e/2Ik
R- резистор в цепи базы
Vоh - напряжение на выходе мк при высоком лог.уровне
Vbesat - напряжение насыщения Б-Э
h21e (он же hfe) - коэф.передачи в схеме с ОЭ
2 -
ну и наконец...
Ik - требуемый ток коллектора.
Re: Различные мелкие вопросы
Alexeus писал(а):а что планируется, на вход или выход?
на вход в Z-состоянии должен быть вывод, и сажай на плюс или минус. лучше резистором в 30к.
на вход.
Да уже поздно, заказал 1к
да и как то на обычной логике применял резисторы в 1к.
Да, кстати, МК AVR.
Не умеешь - не берись, но не взявшись не научишься...
Re: Различные мелкие вопросы
Можете подсказать литературу реализации регуляторов (ПИ\ПИД\ПД) на микроконтроллерах? Желательно на AVR, хотя можно и без программного кода, хотя бы сам принцип, подводные камни итд.
А то что-то в сети никак не могу найти книжек на данную тему.
А то что-то в сети никак не могу найти книжек на данную тему.
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Re: Различные мелкие вопросы
Непосредственно ПИД на МК хорошо описаны Фрунзами в 4-м томе "Микроконтроллеры это же просто".
Единственный "недостаток" - ориентирование на ядро 8051.
В целом достаточно разобраться и тогда весь процесс станет "платформонезависимым".
Единственный "недостаток" - ориентирование на ядро 8051.
В целом достаточно разобраться и тогда весь процесс станет "платформонезависимым".
Последний раз редактировалось Meteor Чт апр 29, 2010 22:31:16, всего редактировалось 1 раз.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Re: Различные мелкие вопросы
добрый день
может ли один таймер/счетчик (Т1) давать два прерывания, одно по совпадению с A с обнулением(режим СТС), второе по совпадению с В без обнуления. ???
может ли один таймер/счетчик (Т1) давать два прерывания, одно по совпадению с A с обнулением(режим СТС), второе по совпадению с В без обнуления. ???
Re: Различные мелкие вопросы
Ну видимо нет. как только совпадает с А, то обнуляется и заново тикает до А, до В так и не дойдет никогда.
Можно сделать таймер по переполнению. настроить, к примеру, что бы 1раз в миллисекунду происходило переполнение, а в самом прерывании по переполнению прописать переменную с увеличением на 1 в каждое прерывание. Происходит прерывание, в переменную +1, через миллисекунду происходит второе прерывание, в переменную еще +1, и того там уже 2 и т.д., а в теле самой программы проверять: если переменная дотикала до 20, значит прошло 20мС, делаем то-то... если переменная дотикала до 40, делаем то-то... и если нужно обнуляем переменную и она снова будет тикать по +1 каждое прерывание. а таймер так и будет бесконечно молотить с прерыванием по переполнению с периодом 1мС. Можно несколько переменных в прерывание прописать, тогда можно обнулять каждую из них по усмотрению алгоритма... Надеюсь смысл ясен?
Можно сделать таймер по переполнению. настроить, к примеру, что бы 1раз в миллисекунду происходило переполнение, а в самом прерывании по переполнению прописать переменную с увеличением на 1 в каждое прерывание. Происходит прерывание, в переменную +1, через миллисекунду происходит второе прерывание, в переменную еще +1, и того там уже 2 и т.д., а в теле самой программы проверять: если переменная дотикала до 20, значит прошло 20мС, делаем то-то... если переменная дотикала до 40, делаем то-то... и если нужно обнуляем переменную и она снова будет тикать по +1 каждое прерывание. а таймер так и будет бесконечно молотить с прерыванием по переполнению с периодом 1мС. Можно несколько переменных в прерывание прописать, тогда можно обнулять каждую из них по усмотрению алгоритма... Надеюсь смысл ясен?
Re: Различные мелкие вопросы
neon-f писал(а):добрый день
может ли один таймер/счетчик (Т1) давать два прерывания, одно по совпадению с A с обнулением(режим СТС), второе по совпадению с В без обнуления. ???
Может, если B<A.
Re: Различные мелкие вопросы
neon-f писал(а):добрый день
может ли один таймер/счетчик (Т1) давать два прерывания, одно по совпадению с A с обнулением(режим СТС), второе по совпадению с В без обнуления. ???
Только если B меньше A. Ну и в железе попробовать надо, тестовую прогу написать.
Re: Различные мелкие вопросы
"В" у меня меньше чем "А". В принципе разобрался, срабатывают два прерывания.
Теперь вот в чем загвоздка.
на таймер\счетчик1 я подаю частоту 31250гц. в регистр А записываю 31249(7А11)и таким образом получаю секундный импульс. а вот внутри этого секундного импульса мне нужно получить еще 500-600 прерываний для динамической индикации (число должно быть кратно 6, т.е. 600, 594,588 .....) я выбрал 558 (из-за наименьшего остатка) теперь 31250/558=56,003.... значит прерывание по совпадению с В должны произходить каждые 56 (0x38) тактов. Когда наступают прерывания по совпадению с В, я в обработчике этого прерывания увеличиваю В на 56 (OCR1BL=OCR1BL+0x38;). но когда ВOCR1BL переполняется, то старший разряд не переносится в OCR1BH.
Как это правильно сделать?? Может завести переменную, её увеличивать на 56, а потом уже из неё извлекать старший и младший байт и присваивать ВOCR1BL и OCR1BH.
вот кусок кода
//---------- данных на матрицу, прерывание по совпадению В------------------------------
interrupt [TIM1_COMPB] void timer1_compb_isr(void)
{
for (x2=0; x2<24; x2++)
{
PORTD.0 = (matrix[x2] & x1) ? (1) : (0);
PORTD.1=1; PORTD.1=0;
}
PORTC=0xFF;
PORTD.2=0xFF; PORTD.2=0x00;
PORTC=x1^0xFF;
x1>>= 1; if (x1==0b00000000) {x1=0b00100000;}
OCR1BL=OCR1BL+0x38; // увеличиваю OCR1BL на 56 для след прерывания
}
//---------- секунды прерыванию по совпадению А------------------------------------
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
sec++; if (sec==86400) {sec=0;} // считаю секунды
OCR1BH=0x00;// задаю начальное значение
OCR1BL=0x38;// для регистра В
}
Теперь вот в чем загвоздка.
на таймер\счетчик1 я подаю частоту 31250гц. в регистр А записываю 31249(7А11)и таким образом получаю секундный импульс. а вот внутри этого секундного импульса мне нужно получить еще 500-600 прерываний для динамической индикации (число должно быть кратно 6, т.е. 600, 594,588 .....) я выбрал 558 (из-за наименьшего остатка) теперь 31250/558=56,003.... значит прерывание по совпадению с В должны произходить каждые 56 (0x38) тактов. Когда наступают прерывания по совпадению с В, я в обработчике этого прерывания увеличиваю В на 56 (OCR1BL=OCR1BL+0x38;). но когда ВOCR1BL переполняется, то старший разряд не переносится в OCR1BH.
Как это правильно сделать?? Может завести переменную, её увеличивать на 56, а потом уже из неё извлекать старший и младший байт и присваивать ВOCR1BL и OCR1BH.
вот кусок кода
//---------- данных на матрицу, прерывание по совпадению В------------------------------
interrupt [TIM1_COMPB] void timer1_compb_isr(void)
{
for (x2=0; x2<24; x2++)
{
PORTD.0 = (matrix[x2] & x1) ? (1) : (0);
PORTD.1=1; PORTD.1=0;
}
PORTC=0xFF;
PORTD.2=0xFF; PORTD.2=0x00;
PORTC=x1^0xFF;
x1>>= 1; if (x1==0b00000000) {x1=0b00100000;}
OCR1BL=OCR1BL+0x38; // увеличиваю OCR1BL на 56 для след прерывания
}
//---------- секунды прерыванию по совпадению А------------------------------------
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
sec++; if (sec==86400) {sec=0;} // считаю секунды
OCR1BH=0x00;// задаю начальное значение
OCR1BL=0x38;// для регистра В
}
Последний раз редактировалось neon-f Сб май 01, 2010 01:52:15, всего редактировалось 1 раз.
Re: Различные мелкие вопросы
но когда ВOCR1BL переполняется, то старший разряд не переносится в OCR1BH.
Как это правильно сделать?? Может завести переменную, её увеличивать на 56, а потом уже из неё извлекать старший и младший байт и присваивать ВOCR1BL и OCR1BH.
Правильно. Видимо, всемогущий ЯВУ не может такое. На ассемблере будет так
Как это правильно сделать?? Может завести переменную, её увеличивать на 56, а потом уже из неё извлекать старший и младший байт и присваивать ВOCR1BL и OCR1BH.
Правильно. Видимо, всемогущий ЯВУ не может такое. На ассемблере будет так
Код: Выделить всё
IN YL,OCR1BL
IN YH,OCR1BH
ADIW YL,56
OUT OCR1BH,YH
OUT OCR1BL,YLRe: Различные мелкие вопросы
Вообще удивительно, как новичкам удается притянуть грабли туда где их изначально быть не должно, а потом ещё и наступать на них.......
Вместо того чтоб просто написать OCR1B=OCR1B+56; я начал "городить огород", разложил регистр на части (OCR1BН и OCR1BL) а потом пытался их связать
Короче - читайте книжки !!!
Вместо того чтоб просто написать OCR1B=OCR1B+56; я начал "городить огород", разложил регистр на части (OCR1BН и OCR1BL) а потом пытался их связать
Короче - читайте книжки !!!
-
C0oo1D
- Первый раз сказал Мяу!
- Сообщения: 38
- Зарегистрирован: Пн дек 29, 2008 14:23:35
- Откуда: Донецк, Украина
Re: Различные мелкие вопросы
<сообщение перенесено>
Последний раз редактировалось C0oo1D Вс май 02, 2010 22:16:20, всего редактировалось 1 раз.
Re: Различные мелкие вопросы
пользую CvAVR. Можно ли объявить без знаковую переменную равную, например 96, что бы инкриминировать переменную до максимального значения (96), а при переполнении что бы сбрасывалось в "0" и снова продолжала инкриминироваться?
нужно для массива с 96 элементами. по нажатию кнопки переменная будет увеличиваться, затем ее значение я подставляю в функцию, которая извлекает из массива элемент, равный значению переменной, а так как массив 96 элементов, то мне как то нужно ограничить инкриминацию переменной только до 95.
подскажите пожалуйста как лучше сделать.
нужно для массива с 96 элементами. по нажатию кнопки переменная будет увеличиваться, затем ее значение я подставляю в функцию, которая извлекает из массива элемент, равный значению переменной, а так как массив 96 элементов, то мне как то нужно ограничить инкриминацию переменной только до 95.
подскажите пожалуйста как лучше сделать.
-
C0oo1D
- Первый раз сказал Мяу!
- Сообщения: 38
- Зарегистрирован: Пн дек 29, 2008 14:23:35
- Откуда: Донецк, Украина
Re: Различные мелкие вопросы
Alexeus писал(а):пользую CvAVR. Можно ли объявить без знаковую переменную равную, например 96, что бы инкриминировать переменную до максимального значения (96), а при переполнении что бы сбрасывалось в "0" и снова продолжала инкриминироваться?
мм, если это так как я понял - то нет
Alexeus писал(а):нужно для массива с 96 элементами. по нажатию кнопки переменная будет увеличиваться, затем ее значение я подставляю в функцию, которая извлекает из массива элемент, равный значению переменной, а так как массив 96 элементов, то мне как то нужно ограничить инкриминацию переменной только до 95.
подскажите пожалуйста как лучше сделать.
Код: Выделить всё
char array;
//... куча кода
array++; //инкремент
if (array>95){array=0;} //проверка
а в массив идет например "name_of_array[array];"
Re: Различные мелкие вопросы
да, спасибо, я тоже сделал с проверкой и обнулением если больше 95.
Re: Различные мелкие вопросы
Здравствуйте. У меня такой вопрос: решил освоить микроконтроллеры, взял самый простой (как мне показалось) ATtiny13v. Преодолев трудности написания программы я остановился на процессе прошивки. При использовании AVR Studio 4 программатор автоматически определяется, но tiny не видится, выдается сообщение об ошибке "A problem occurred when executing the command...". Использую программатор (написано на нем AVR Atmel, похоже это модель AVRISP с COM портом), переходник ISP10->DIP8 паял сам, напряжение 3,6V
Т.к. один раз перепутал полярность при подключении питания к tiny, возникло предположение, что я все делаю правильно, но микроконтроллер нерабочий. Как проверить его работоспособность?
Т.к. один раз перепутал полярность при подключении питания к tiny, возникло предположение, что я все делаю правильно, но микроконтроллер нерабочий. Как проверить его работоспособность?
