С чего начать программировать микроконтроллеры?
- Сообщения: 3459
- Зарегистрирован: Ср сен 27, 2006 16:18:57
- Реклама
Я пробовал подавать на них т 0 и 1 (+5В) через резистор (ом на 300).
Кстати, в Вашей проге срабатывало почемуто на 0.
Кстати, в Вашей проге срабатывало почемуто на 0.
- Сообщения: 3459
- Зарегистрирован: Ср сен 27, 2006 16:18:57
- Сообщения: 3459
- Зарегистрирован: Ср сен 27, 2006 16:18:57
В смысле, входы PINB.2 и PINB.3 висят в воздухе? Если это так, то они ловят помехи, из-за чего переменная i может принимать значения 2, 4, 6, 8, 10, 12, 14 . А вы пытаетесь отслеживать значение i равное 2. И, естественно, пролетаете мимо. Я же не просто так написал строчку:
i = i & 0b00001110; // маскируем разряды, которые нам не нужны
Это побитовая операция "И". В тех разрядах, где нули, всегда будут нули, а те разряды, где единицы, будут иметь значение, зависящее от состояния входов.
Чтобы на значение i влияли только PINB.1 PINB.2 и PINB.3, а остальне были нулями. Вот они, собаки, и влияют.
В моей программе, если получаете 6, 10, 12, 14, то попадаете под оператор "default:" под которым нет никаких команд.
Короче, надо PINB.1 PINB.2 и PINB.3 посадить через резисторы на землю.
i = i & 0b00001110; // маскируем разряды, которые нам не нужны
Это побитовая операция "И". В тех разрядах, где нули, всегда будут нули, а те разряды, где единицы, будут иметь значение, зависящее от состояния входов.
Чтобы на значение i влияли только PINB.1 PINB.2 и PINB.3, а остальне были нулями. Вот они, собаки, и влияют.
В моей программе, если получаете 6, 10, 12, 14, то попадаете под оператор "default:" под которым нет никаких команд.
Короче, надо PINB.1 PINB.2 и PINB.3 посадить через резисторы на землю.
- Реклама
А если мне надо подавать на вход лог 0, то входы надо посадить через резистор на +5В?
P.S. Ага, сейчас нормально работает

P.S. Ага, сейчас нормально работает
Последний раз редактировалось SeregaT Вт фев 17, 2009 19:23:50, всего редактировалось 1 раз.
- Сообщения: 3459
- Зарегистрирован: Ср сен 27, 2006 16:18:57
Да. Или можно включить внутренние подтягивающие резисторы. Они подтягивают уровень на + питания контроллера. Но они довольно большие - десятки килоом.
Микроконтроллерная система это тесное взаимодействие двух частей - аппаратной и программной. Если какая-то из них с ошибкой, то система просто не работает. Поэтому надо относиться к обеим частям с максимальной аккуратностью. Если в аппаратной части косяк, то искать ошибку в программе - бесполезная трата времени. И наоборот.
Микроконтроллерная система это тесное взаимодействие двух частей - аппаратной и программной. Если какая-то из них с ошибкой, то система просто не работает. Поэтому надо относиться к обеим частям с максимальной аккуратностью. Если в аппаратной части косяк, то искать ошибку в программе - бесполезная трата времени. И наоборот.
Последний раз редактировалось Барсик Вт фев 17, 2009 19:34:00, всего редактировалось 1 раз.
А как кстати включаются эти встроеные резисторы? Фьюзами?
- Сообщения: 3459
- Зарегистрирован: Ср сен 27, 2006 16:18:57
Нет. Вывод программируется на вход и в него записывается лог. 1, как будто он выход. Тогда включается внутренний резистор. Или наоборот, сначала записывается 1, а потом он конфигурируется на вход - точно не помню. Надо в даташит глянуть.
Но можно сделать проще. В CodeVisionAVR в автоматическом генераторе указать чтобы резисторы были включены. На закладке конфигурирования портов есть столбец под названием Pullup/Output Value. Если в этом столбце против порта кликнуть мышом и поставить букву P, то подтягивающий резистор будет включён.
Но можно сделать проще. В CodeVisionAVR в автоматическом генераторе указать чтобы резисторы были включены. На закладке конфигурирования портов есть столбец под названием Pullup/Output Value. Если в этом столбце против порта кликнуть мышом и поставить букву P, то подтягивающий резистор будет включён.
Да, видел. Еще спросить собирался, для чего это.Барсик писал(а):На закладке конфигурирования портов есть столбец под названием Pullup/Output Value. Если в этом столбце против порта кликнуть мышом и поставить букву P, то подтягивающий резистор будет включён.
И снова бегущие огни 
Например вот такое:
Например вот такое:
можно сделать как-то короче? Ну типа как массивы на ассемблере, или просто написать задержку 1 раз и чтобы она использовалась во всём цикле?PORTD = 0b00000001;
delay_ms (200);
PORTD = 0b00000011;
delay_ms (200);
PORTD = 0b00000111;
delay_ms (200);
PORTD = 0b00001111;
delay_ms (200);
PORTD = 0b00011111;
delay_ms (200);
PORTD = 0b00111111;
delay_ms (200);
PORTD = 0b01111111;
delay_ms (200);
PORTD = 0b11111111;
delay_ms (200);
PORTD = 0b11111110;
delay_ms (200);
PORTD = 0b11111100;
delay_ms (200);
PORTD = 0b11111000;
delay_ms (200);
PORTD = 0b11110000;
delay_ms (200);
PORTD = 0b11100000;
delay_ms (200);
PORTD = 0b11000000;
delay_ms (200);
PORTD = 0b10000000;
delay_ms (200);
PORTD = 0b00000000;
delay_ms (200);
- Сообщения: 4673
- Зарегистрирован: Вс июн 01, 2008 00:17:35
- Откуда: Я всего лишь плод вашего воображения...
- Сообщения: 3459
- Зарегистрирован: Ср сен 27, 2006 16:18:57
Можно попробовать сделать со сдвигом, но мне кажется, что то, чем мигать, лучше задать в виде таблицы (массива). Тогда содержание этого массива можно задавать, как угодно.
Код: Выделить всё
void main(void)
{
// определяем массив, чем будем мигать
unsigned char migalka[] = { 0b00000001, 0b00000011, 0b00000111, 0b00001111
, 0b00011111, 0b00111111, 0b01111111, 0b11111111
, 0b11111110, 0b11111100, 0b11111000, 0b11110000
, 0b11100000, 0b11000000, 0b10000000, 0b00000000 };
unsigned char i = 0;
while (1)
{
// ну и мигаем себе в цикле
for (i=0; i<16; i++)
{
PORTD = migalka[i];
delay_ms (200);
}
};
}
- Сообщения: 4673
- Зарегистрирован: Вс июн 01, 2008 00:17:35
- Откуда: Я всего лишь плод вашего воображения...
Да, это как раз то, что нужно.Барсик писал(а):но мне кажется, что то, чем мигать, лучше задать в виде таблицы (массива).
А вот расскажите про АЦП. Как его использовать? Я понимаю, что эта штука преобразует аналоговые величины в цифровые, но как это работает? Можно ли (чисто для примера) поставить на вход АЦП переменный резистор, и чтобы в зависимости от напряжения на входе, загоралось определённое количество светодиодов (например от 1 до 8 )?
Как это можно реализовать программно?
Как это можно реализовать программно?
Последний раз редактировалось SeregaT Вт фев 24, 2009 11:54:47, всего редактировалось 1 раз.
http://radiokot.ru/articles/21/SeregaT писал(а):А вот расскажите про АЦП. Как его использовать? Я понимаю, что эта штука преобразует аналоговые величины в цифровые, но как это работает? Можно ли (чисто для примера) поставить на вход АЦП переменный резистор, и чтобы в зависимости от напряжения на входе, загоралось определённое количество светодиодов (например от 1 до?
Как это можно реализовать программно?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
О, отлично! То что нужно. Есть даже ответы на некоторые мои следующие вопросы.
Спасибо
Спасибо
Подскажите плиз вот такой момент:
Вот есть фрагмент
Вот как при (!PINB.1) прервать этот цикл и продолжить дальше (например PORTD.1=1)?
Как я понимаю, надо написать что-то наподобие
Но вот что-то не правильно и я не могу понять что именно... Уже по всякому пробовал.
Вот есть фрагмент
unsigned char i = 0;
void main(void)
{
PORTD=0x00; //Выставляем все выходы порта D на 0, то есть, выключаем весь порт D
DDRD=0xFF; //Делаем порт D, как выход, чтобы на выходах порта было напряжение 5В
while (1)
{
unsigned char migalka = { 0b00000001, 0b00000011, 0b00000111, 0b00001111
, 0b00011111, 0b00111111, 0b01111111, 0b11111111
, 0b11111110, 0b11111100, 0b11111000, 0b11110000
, 0b11100000, 0b11000000, 0b10000000, 0b00000000
for (i=0; i<16 ; i++)
}
Вот как при (!PINB.1) прервать этот цикл и продолжить дальше (например PORTD.1=1)?
Как я понимаю, надо написать что-то наподобие
if (!PINB.1)
break;
PORTD.1=1;
Но вот что-то не правильно и я не могу понять что именно... Уже по всякому пробовал.
- Сообщения: 3459
- Зарегистрирован: Ср сен 27, 2006 16:18:57
А с какой это радости у Вас массив migalka определятся внутри главного цикла? И определяется как то странно. Такая прнография получилась из-за неправильного цитирования? При цитировании текста программы используйте кнопочки "Code". Или помещайте текст программы в присоединённый файл. А то трудно проверять Вашу программу.


