Например TDA7294

Форум РадиоКот • Просмотр темы - С чего начать программировать микроконтроллеры?
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Ср янв 07, 2026 06:11:50

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 2294 ]     ... , , , 19, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 12, 2009 21:49:46 
Генеральный секретарь МЯУ
Аватар пользователя

Карма: 69
Рейтинг сообщений: 26
Зарегистрирован: Пн сен 03, 2007 18:24:27
Сообщений: 18825
Откуда: Россия. Омск.
Рейтинг сообщения: 0
Вот. Написал бета версию проги (пока задействован только один концевик и в некоторых местах совмещены каналы на поднимание и опускание)
Цитата:
#include <mega8>
#include <delay>

// Declare your global variables here

void main(void)
{
int i; // описание переменной "і" как целое число Int - (Integer)
PORTD=0x00; //Выставляем все выходы порта D на 0, то есть, выключаем весь порт D
DDRD=0xFF; //Делаем порт D, как выход, чтобы на выходах порта было напряжение 5В
while (1)
{
PORTD.0=1; // Упор поднимается
PORTD.1=1; // Подача доски
while (!PINB.1==0); // Доска на месте
PORTD.1=0; // Подача выключается
delay_ms(500); // Задержка 0,5 сек
PORTD.2=1; // Подача пилы
delay_ms(2000); // Задержка 2 сек
PORTD.2=0; // Пила выключается и опускается
delay_ms (500); // Задержка 0,5 сек
PORTD.3=1; // Направляющая поднимается
delay_ms (500); // Задержка
PORTD.4=1; // Толкатель толкает доску под пресс
delay_ms (500); // Задержка
PORTD.4=0; // Толкатель отходит
delay_ms (500); // Задержка
PORTD.5=1; // Боковой пресс прижимает доску к упору
delay_ms (300); // Задержка
PORTD.6=1; // Верхний пресс прижимает доску
delay_ms (500); // Задержка
PORTD.7=1; // Давит торцевой гидравлический пресс
delay_ms (2000); // Задержка
for (i = 0; i<15 ; i++) // Работает верхний пресс
{
PORTD.6=1; // Прижим
delay_ms(700); // Задержка
PORTD.6=0; // Ослабление
delay_ms(170); // Задержка
PORTD.6=1; // Прижим
}
PORTD.7=0; // Торцевой пресс отходит
delay_ms (2000); // Задержка
PORTD.6=0; // Верхний пресс поднимается
PORTD.5=0; // Боковой пресс отходит
delay_ms (500); // Задержка
PORTD.0=0; // Упор опускается
delay_ms (1000); // Задержка
PORTD.5=1; // Боковой пресс выталкивает доску в накопитель
delay_ms (500); // Задержка
PORTD.5=0; // Боковой пресс отходит
PORTD.3=0; // Направляющая опускается
delay_ms (500); // Задержка
// На начало программы
}
};

Прога работает нормально. В общем кое-что уже стало понятно :)


Последний раз редактировалось SeregaT Пт фев 13, 2009 15:26:03, всего редактировалось 2 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 13, 2009 13:11:34 
Друг Кота
Аватар пользователя

Карма: 28
Рейтинг сообщений: 267
Зарегистрирован: Ср сен 27, 2006 16:18:57
Сообщений: 3459
Рейтинг сообщения: 0
SeregaT писал(а):
...Из ваших двух ответов собрал один и всё заработало...
....
while (!PINB.1==0);
....


Если Вы ждёте лог. 0, то while (!PINB.1==0); работать будет, но это лёгкий садизм. :) Лучше писать так:
while (PINB.1);
Будет работать точно так же. Или так:
while (PINB.1==1);


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 13, 2009 15:18:01 
Генеральный секретарь МЯУ
Аватар пользователя

Карма: 69
Рейтинг сообщений: 26
Зарегистрирован: Пн сен 03, 2007 18:24:27
Сообщений: 18825
Откуда: Россия. Омск.
Рейтинг сообщения: 0
А в чём разница? Я так понимаю, если написать 0, то сработает если я подам на вывод минус, а если поставить 1, то на вывод надо подавать плюс?
В данном случае мне минус даже удобнее (если бы применять в реале), а вот с индукционных и оптических датчиков надо чтобы был плюс.
Барсик писал(а):
Будет работать точно так же.

Что-то не работала.
Цитата:
Или так:
while (PINB.1==1);

А так не пробовал...

P.S. Попробовал, не работает. Тогда прога без сигнала начинает работать дальше. А как тогда сделать чтобы срабатывало от +5В?

P.P.S. Оказывается забыл ! вначале убрать. Действительно, работает точно так-же, тоесть нужен логический 0. Разницу не уловил.


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 13, 2009 17:31:48 
Друг Кота
Аватар пользователя

Карма: 28
Рейтинг сообщений: 267
Зарегистрирован: Ср сен 27, 2006 16:18:57
Сообщений: 3459
Рейтинг сообщения: 0
SeregaT писал(а):
...если я подам на вывод минус....

То микроконтроллер (или вход в лучшем случае) сгорит нафиг. На вход можно подавать только положительное напряжение величиной от нуля до напряжения питания. От величины этого напряжения зависит, что считает микроконтроллер при опросе состояния входа - 1 или 0. Если напряжение выше некоторого порога, то будет считана 1, если ниже некоторого порога, то будет считан 0.
Если у Вас на входе высокий уровень (лог. 1), а Вы ждёте, пока появится низкий (лог. 0), то следует писать while (PINB.1);
Если у Вас на входе низкий уровень (лог. 0), а Вы ждёте, пока появится высокий (лог. 1), то следует писать while (!PINB.1);

Кстати, на входе можно включить внутренний подтягивающий резистор, который подтягивает вход к +5 вольтам. Если вход висит в воздухе, то будет считываться лог. 1. А если вход посадить на землюто будет считываться лог. 0.


Последний раз редактировалось Барсик Пт фев 13, 2009 17:46:36, всего редактировалось 1 раз.

Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 13, 2009 17:44:54 
Генеральный секретарь МЯУ
Аватар пользователя

Карма: 69
Рейтинг сообщений: 26
Зарегистрирован: Пн сен 03, 2007 18:24:27
Сообщений: 18825
Откуда: Россия. Омск.
Рейтинг сообщения: 0
Барсик писал(а):
То микроконтроллер (или вход в лучшем случае) сгорит нафиг. На вход можно подавать только положительное напряжение величиной от нуля до напряжения питания.

Ну я имел ввиду минус питания, тоесть 0 (включал через резистор)
Цитата:
Если у Вас на входе высокий уровень (лог. 1), а Вы ждёте, пока появится низкий (лог. 0), то следует писать while (PINB.1);
Если у Вас на входе низкий уровень (лог. 0), а Вы ждёте, пока появится высокий (лог. 1), то следует писать while (!PINB.1);

А как сделать, чтобы на входе был низкий уровень? Когда я пишу (!PINB.1), то программа не ждёт сигнала а продолжает работу, как будто сигнал уже был.
Кстати, я заметил (когда делал для логического 0), что срабатывает даже от простого прикосновения к выходу (и даже от прикосновения пластмассовой линейкой). Вылечилось путём подачи +5 В через резистор 10 Ком. Но я вот что подумал, если +5 В не подавать, то наверное таким образом можно сделать сенсорные кнопки?


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 13, 2009 17:54:21 
Друг Кота
Аватар пользователя

Карма: 28
Рейтинг сообщений: 267
Зарегистрирован: Ср сен 27, 2006 16:18:57
Сообщений: 3459
Рейтинг сообщения: 0
SeregaT писал(а):
...А как сделать, чтобы на входе был низкий уровень?

Посадить вход на землю через резистор.

SeregaT писал(а):
...наверное таким образом можно сделать сенсорные кнопки?

Запросто. Только надо придумать такую цепь на входе, чтобы они срабатывали от пальца, но не срабатывали от помех... Что-нибудь вроде RC цепочки.


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 13, 2009 18:01:46 
Генеральный секретарь МЯУ
Аватар пользователя

Карма: 69
Рейтинг сообщений: 26
Зарегистрирован: Пн сен 03, 2007 18:24:27
Сообщений: 18825
Откуда: Россия. Омск.
Рейтинг сообщения: 0
Барсик писал(а):
Посадить вход на землю через резистор.

А, тоесть посадить на землю через резистор, а в программе написать (!PINB.1), а в качестве сигнала подавать +5 В. Надо попробовать.


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Сб фев 14, 2009 19:30:40 
Генеральный секретарь МЯУ
Аватар пользователя

Карма: 69
Рейтинг сообщений: 26
Зарегистрирован: Пн сен 03, 2007 18:24:27
Сообщений: 18825
Откуда: Россия. Омск.
Рейтинг сообщения: 0
А вот такой вопрос:
Как сделать так, чтобы при подаче сигнала на PINB.1, появлялся сигнал на PORTD.1. А при подаче сигнала на PINB.2, сигнал появлялся на PORTD.2?
Ну тоесть чтобы не последовательно все команды шли, а либо так, либо по другому (типа как ветвящийся алгоритм).


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 15, 2009 12:58:14 
Друг Кота
Аватар пользователя

Карма: 28
Рейтинг сообщений: 267
Зарегистрирован: Ср сен 27, 2006 16:18:57
Сообщений: 3459
Рейтинг сообщения: 0
Что-то я нифига не понял, что Вы хотите.
Чтобы при подаче сигнала на PINB.1, появлялся сигнал на PORTD.1 надо написать:
PORTD.1 = PINB.1;
PORTD.2 = PINB.2;
И засунуть это в цикл, чтобы опрос портов происходил достаточно часто. Если Ваша программа занята чем-то другим и не может опрашивать эти порты, то необходимо использовать прерывания. Организовать прерывания от таймера, чтобы они происходили с нужной Вам частотой, и засунуть в обработчик прерывания эти строчки.
А насчёт "ветвящегося алгоритма" я ваще ничего не понял, что Вы имели в виду.


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 15, 2009 13:05:58 
Генеральный секретарь МЯУ
Аватар пользователя

Карма: 69
Рейтинг сообщений: 26
Зарегистрирован: Пн сен 03, 2007 18:24:27
Сообщений: 18825
Откуда: Россия. Омск.
Рейтинг сообщения: 0
Барсик писал(а):
Что-то я нифига не понял, что Вы хотите.

Ну вот например дошла программа до определённой строки и остановилась (ждёт сигнала). Если сигнал поступил на PINB.1, то выполняется одна чатсть программы, а если на PINB.2, то выполняется другая часть.


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 15, 2009 16:28:37 
Генеральный секретарь МЯУ
Аватар пользователя

Карма: 69
Рейтинг сообщений: 26
Зарегистрирован: Пн сен 03, 2007 18:24:27
Сообщений: 18825
Откуда: Россия. Омск.
Рейтинг сообщения: 0
И еще:
Имеется ЖК дисплей WINSTAR WHC0802B-NGA-CT. Инфы по этому дисплею я нифига не нашёл, знаю только что там 16 выводов и микросхема. Каким способом можно разобраться, как его подключать?
И что вообще с ним можно сделать для начала? (Ну чисто для обучения. На практике мне от этого дисплея пока ничего не надо).


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 15, 2009 17:16:16 
Друг Кота
Аватар пользователя

Карма: 28
Рейтинг сообщений: 267
Зарегистрирован: Ср сен 27, 2006 16:18:57
Сообщений: 3459
Рейтинг сообщения: 0
Так бы сразу и написали бы. Для подобных случаев существует конструкция "Switch". Странно, но в "Руководство полного идиота по программированию (на языке Си)" ссылку на которое http://lib.ru/CTOTOR/starterkit.txt давал Pippeytz, я ничего не нашёл про "Switch". Вероятно, полные идиоты эту конструкцию не используют... Но мы то с Вами другие...
Код:
unsigned char i = 0;
while (1)
    {
   
    // ждём лог. 1 на одном из входов
    do
    {
        i = PINB; // считали все выводы сразу
        i = i & 0b00001110; // маскируем разряды, которые нам не нужны
    }while(!i); // будет крутиться в цикле, пока на одном из выводов PINB.1, PINB.2, PINB.3
                // не появится лог. 1
   
    // Где-то вылезла лог. 1. Разбираемся где именно.
    // если на PINB.1, то значение i будет 2
    // если на PINB.2, то значение i будет 4
    // если на PINB.3, то значение i будет 8
    switch (i)
    {
    case 2:
        // значит лог. 1 появилась на PINB.1
        // выполняем соответствующий кусок кода
        PORTD.1 = 1; // например.
        // вообще, здесь можно писать много всего...   
    break; //всё, что надо сделали, вывалваемся из switch
    case 4:
        // значит лог. 1 появилась на PINB.2
        // выполняем соответствующий кусок кода
        PORTD.2 = 1; // например.
        // вообще, здесь можно писать много всего...   
    break; //всё, что надо сделали, вывалваемся из switch
    case 8:
        // значит лог. 1 появилась на PINB.3
        // выполняем соответствующий кусок кода
        PORTD.3 = 1; // например.
        // вообще, здесь можно писать много всего...   
    break; //всё, что надо сделали, вывалваемся из switch
       
    default:
        // а это тот самый случай, кода вылезло нечто не предусмотренное
        // предыдущими случаями. Можно ничего не писать, а можно написать
        // интрукции и на этот случай
    } // это конец оператора switch
   
    // дальше программа продолжается с этого места
    // .....................
   
    };


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 15, 2009 18:27:58 
Генеральный секретарь МЯУ
Аватар пользователя

Карма: 69
Рейтинг сообщений: 26
Зарегистрирован: Пн сен 03, 2007 18:24:27
Сообщений: 18825
Откуда: Россия. Омск.
Рейтинг сообщения: 0
Спасибо, вроде кое-что понял, попробую...


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 16, 2009 11:00:38 
Генеральный секретарь МЯУ
Аватар пользователя

Карма: 69
Рейтинг сообщений: 26
Зарегистрирован: Пн сен 03, 2007 18:24:27
Сообщений: 18825
Откуда: Россия. Омск.
Рейтинг сообщения: 0
Что-то не совсем понял про эту Switch. При компиляции ошибки не находит, но программа не работает. Тоесть не реагирует на сигналы. В чём причина, так и не понял. Даже попробовал не свою прогу, а вот то, что Вы написали (просто скопировал как есть), эффект тот-же.


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 16, 2009 12:13:40 
Опытный кот

Карма: 3
Рейтинг сообщений: 7
Зарегистрирован: Пт авг 22, 2008 16:59:43
Сообщений: 732
Рейтинг сообщения: 0
Со Switch все просто:
Код:
switch(i)
{
case 3: PORTB.1=1; break; //Если i равно 3 то выполняем PORTB.1=1, и вываливаем из скрипта
}
Это замена такому
Код:
if (i==3) {PORTB.1=1;}

Просто со свитч легче.

_________________
catcoolers@gmail.com


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 16, 2009 12:39:27 
Генеральный секретарь МЯУ
Аватар пользователя

Карма: 69
Рейтинг сообщений: 26
Зарегистрирован: Пн сен 03, 2007 18:24:27
Сообщений: 18825
Откуда: Россия. Омск.
Рейтинг сообщения: 0
А как определить, чему равно значение i ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 16, 2009 13:00:54 
Модератор
Аватар пользователя

Карма: 68
Рейтинг сообщений: 424
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Сообщений: 13490
Откуда: Тамбовская обл.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Предлагаю тему в соответствующий раздел. Очень много интересного собралось, при том по-порядку.


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 16, 2009 14:03:24 
Друг Кота
Аватар пользователя

Карма: 28
Рейтинг сообщений: 267
Зарегистрирован: Ср сен 27, 2006 16:18:57
Сообщений: 3459
Рейтинг сообщения: 0
SeregaT писал(а):
А как определить, чему равно значение i ?

Прикрутите к CodeVisionAVR отладчик AVR Studio. И получите массу удовольствий. В том числе можно будет смотреть значения переменных.
Как это сделать, написано в http://pro-radio.ru/controllers/6585/

SeregaT писал(а):
...что Вы написали (просто скопировал как есть), эффект тот-же.

Ещё бы. Это же не вся программа, а фрагмент. И не просто фрагмент, а иллюстрация. Кстати, там нигде нет, чтобы выходы порта D устанавливались в ноль.


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 16, 2009 15:39:30 
Генеральный секретарь МЯУ
Аватар пользователя

Карма: 69
Рейтинг сообщений: 26
Зарегистрирован: Пн сен 03, 2007 18:24:27
Сообщений: 18825
Откуда: Россия. Омск.
Рейтинг сообщения: 0
Барсик писал(а):
Кстати, там нигде нет, чтобы выходы порта D устанавливались в ноль.

У меня это было. Я же то-же скопировал как фрагмент к работающей программе, предварительно убрав всё лишнее :) Ну думаю разберусь.


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 16, 2009 19:18:53 
Генеральный секретарь МЯУ
Аватар пользователя

Карма: 69
Рейтинг сообщений: 26
Зарегистрирован: Пн сен 03, 2007 18:24:27
Сообщений: 18825
Откуда: Россия. Омск.
Рейтинг сообщения: 0
Гляньте пожалуйста, вот где тут может быть ошибка?
Цитата:
#include <mega8>
#include <delay>
// Declare your global variables here
unsigned char i = 0;
void main(void)
{
PORTD=0x00; //Выставляем все выходы порта D на 0, то есть, выключаем весь порт D
DDRD=0xFF; //Делаем порт D, как выход, чтобы на выходах порта было напряжение 5В
while (1)

// ждём лог. 1 на одном из входов
do
{
i = PINB; // считали все выводы сразу
i = i & 0b00001110; // маскируем разряды, которые нам не нужны
}while(!i); // будет крутиться в цикле, пока на одном из выводов PINB.1, PINB.2, PINB.3
// не появится лог. 1

switch(i)
{
case 2: PORTD.1=1; break; //Если i равно 2 то выполняем PORTB.1=1, и вываливаем из скрипта
}
};

Тоесть если я правильно понял, то при подаче сигнала на PINB.1 (да вообще-то пробовал все PIN), должен появиться сигнал на PORTD.1 (не появился).
В той программе, которую написал Барсик я смог добиться, чтобы загорались светодиоды (причём не совсем те, что я ожидал), и не всегда. Тоесть можно было тыкать в три порта повсякому и иногда светодиоды загорались.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 2294 ]     ... , , , 19, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y