С чего начать программировать микроконтроллеры?
В смысле, входы 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 посадить через резисторы на землю.
- SeregaT
- Генеральный секретарь МЯУ
- Сообщения: 18852
- Зарегистрирован: Пн сен 03, 2007 18:24:27
- Откуда: Россия. Омск.
- Контактная информация:
А если мне надо подавать на вход лог 0, то входы надо посадить через резистор на +5В?
P.S. Ага, сейчас нормально работает

P.S. Ага, сейчас нормально работает
Последний раз редактировалось SeregaT Вт фев 17, 2009 19:23:50, всего редактировалось 1 раз.
Да. Или можно включить внутренние подтягивающие резисторы. Они подтягивают уровень на + питания контроллера. Но они довольно большие - десятки килоом.
Микроконтроллерная система это тесное взаимодействие двух частей - аппаратной и программной. Если какая-то из них с ошибкой, то система просто не работает. Поэтому надо относиться к обеим частям с максимальной аккуратностью. Если в аппаратной части косяк, то искать ошибку в программе - бесполезная трата времени. И наоборот.
Микроконтроллерная система это тесное взаимодействие двух частей - аппаратной и программной. Если какая-то из них с ошибкой, то система просто не работает. Поэтому надо относиться к обеим частям с максимальной аккуратностью. Если в аппаратной части косяк, то искать ошибку в программе - бесполезная трата времени. И наоборот.
Последний раз редактировалось Барсик Вт фев 17, 2009 19:34:00, всего редактировалось 1 раз.
Нет. Вывод программируется на вход и в него записывается лог. 1, как будто он выход. Тогда включается внутренний резистор. Или наоборот, сначала записывается 1, а потом он конфигурируется на вход - точно не помню. Надо в даташит глянуть.
Но можно сделать проще. В CodeVisionAVR в автоматическом генераторе указать чтобы резисторы были включены. На закладке конфигурирования портов есть столбец под названием Pullup/Output Value. Если в этом столбце против порта кликнуть мышом и поставить букву P, то подтягивающий резистор будет включён.
Но можно сделать проще. В CodeVisionAVR в автоматическом генераторе указать чтобы резисторы были включены. На закладке конфигурирования портов есть столбец под названием Pullup/Output Value. Если в этом столбце против порта кликнуть мышом и поставить букву P, то подтягивающий резистор будет включён.
- SeregaT
- Генеральный секретарь МЯУ
- Сообщения: 18852
- Зарегистрирован: Пн сен 03, 2007 18:24:27
- Откуда: Россия. Омск.
- Контактная информация:
И снова бегущие огни
Например вот такое:
можно сделать как-то короче? Ну типа как массивы на ассемблере, или просто написать задержку 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);
можно сделать как-то короче? Ну типа как массивы на ассемблере, или просто написать задержку 1 раз и чтобы она использовалась во всём цикле?
Можно попробовать сделать со сдвигом, но мне кажется, что то, чем мигать, лучше задать в виде таблицы (массива). Тогда содержание этого массива можно задавать, как угодно.
Код: Выделить всё
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);
}
};
}
- SeregaT
- Генеральный секретарь МЯУ
- Сообщения: 18852
- Зарегистрирован: Пн сен 03, 2007 18:24:27
- Откуда: Россия. Омск.
- Контактная информация:
А вот расскажите про АЦП. Как его использовать? Я понимаю, что эта штука преобразует аналоговые величины в цифровые, но как это работает? Можно ли (чисто для примера) поставить на вход АЦП переменный резистор, и чтобы в зависимости от напряжения на входе, загоралось определённое количество светодиодов (например от 1 до 8 )?
Как это можно реализовать программно?
Как это можно реализовать программно?
Последний раз редактировалось SeregaT Вт фев 24, 2009 11:54:47, всего редактировалось 1 раз.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
http://radiokot.ru/articles/21/SeregaT писал(а):А вот расскажите про АЦП. Как его использовать? Я понимаю, что эта штука преобразует аналоговые величины в цифровые, но как это работает? Можно ли (чисто для примера) поставить на вход АЦП переменный резистор, и чтобы в зависимости от напряжения на входе, загоралось определённое количество светодиодов (например от 1 до?
Как это можно реализовать программно?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- SeregaT
- Генеральный секретарь МЯУ
- Сообщения: 18852
- Зарегистрирован: Пн сен 03, 2007 18:24:27
- Откуда: Россия. Омск.
- Контактная информация:
Подскажите плиз вот такой момент:
Вот есть фрагмент
Вот как при (!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[i] = { 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;
Но вот что-то не правильно и я не могу понять что именно... Уже по всякому пробовал.
А с какой это радости у Вас массив migalka[i] определятся внутри главного цикла? И определяется как то странно. Такая прнография получилась из-за неправильного цитирования? При цитировании текста программы используйте кнопочки "Code". Или помещайте текст программы в присоединённый файл. А то трудно проверять Вашу программу.