Перейти к содержанию
    

Подскажите начинающему

Нет. Я специально написал безо всяких битовых операций - именно работаем с портом как с байтом, целиком. Вы уже на глупость переправили.

 

Попробуем просто зажечь а потом просто погасить

 

sfr P1 = 0x90; //проверьте есть ли такие строчки в начале программы или в подключаемом заголовочном файле

sfr P3 = 0xB0; //

void main (void)

{

P1=0xff;//иначе может оказаться случайным

P3=0xff;//

 

while(1){

P3=P3&(~0x08);//зажгли

}

}

хорошо, завтра проверю, спасибо за объяснения

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С кнопкой с горем пополам разобрался :)

 

Хочу собрать вот такое устройство

http://avrlab.com/node/63

Обычный микроконтроллер, три светодиода и т.д. Схема понятна, спаяю без проблем.

Одно не понятно, как мне подключить это устройство к компьютеру? Какие контакты использовать и т.д.? Как я понимаю надо USB, но вот куда его подключать к микроконтроллеру, я не знаю. Как прошивать это устройство, какую программу для прошивки использовать? (имею ввиду, не ту программу которую надо в Keil написать, а софт которым прошивать) Объясните пожалуйста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Одно не понятно, как мне подключить это устройство к компьютеру?
Никак. Оно 'вещь в себе', к компу не подключается

Как я понимаю надо USB, но вот куда его подключать к микроконтроллеру, я не знаю.
К Tiny13 USB напрямую подключить нельзя. Понадобится переходник (на FT245 например). Или возьмите МК который поддерживает USB напрямую

Как прошивать это устройство,
Программатором. Железным. Их в сети море (и в магазине тоже).

какую программу для прошивки использовать?
Этого добра тоже навалом. avreal например. PonyProg. Да и сама AVRStudio умеет что то прошивать.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Программатором. Железным. Их в сети море (и в магазине тоже).

Как я понял, я приобретаю программатор для микропроцессоров, допустим MCS-51, подключаю к компу, беру "голый" микроконтроллер, вставляю его в программатор, т.е. соответствующие "ножки" микроконтроллера в "дырочки" на программаторе.

Качаю программу для прошивания микроконтроллера. Пишу программу в Keil. Прошиваю hex файлом микроконтроллер. Вытаскиваю микроконтроллер из программатора. Собираю схему. Включаю. Радуюсь. Так?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Радуюсь. Так?

Так

Или с вариантами - многие процессоры поддерживают ISP (In System Programming) - их можно зашить прямо в плате по нескольким проводам. Но для этого схема должна быть грамотно составлена и программатор должен уметь ISP

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как подключить библиотеку delay.h в Keil 3? Пишет что нету её. Где взять? Или она по другому называется?

 

Хочу сделать задержку.

Светодиод горит - через определённое количество секунд гаснет - через определённое количество секунд снова загорается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно эта библиотека называется как-то по другому, не delay.h.

Или есть другие возможности сделать задержку?

Что-то вроде через 500 мс светодиод загорается, через 200 мс светодиод гаснет. Без delay я не знаю как ещё это можно сделать. Подскажите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кое как со скрипам научился делать что-то вроде задержки, без всяких библиотек и delay-ев. С помощью таймеров! Использовал микроконтроллер ADuC842.

Делал по книжке, так сказать, просто заменял цифры в готовой программе и делал разный период мигания светодиода. Цифры брал не от балды, а высчитывал сам по формуле и делал ту задержку которую мне надо.

Осталось разобраться с программой.

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

 

sfr TMOD=0x89; //тут всё стандартно, перечисляем порты микроконтроллера

sfr TCON=0x88;

sfr TH1=0x8D; //TH1 и TL1 старший и младший разряды таймера работающие в первом режиме? указываем их порты?

sfr TL1=0x8B;

sfr P0=0x80;

sbit TF1=TCON^7; //вот эти две строчки не понял что означают. и цифры что означают 7 и 6?

sbit TR1=TCON^6;

sbit P0_0 = P0^0; //тут всё ясно, опять таки что означают цифры 0,1,2,3? исключающее ИЛИ для чего?

sbit P0_1 = P0^1;

sbit P0_2 = P0^2;

sbit P0_3 = P0^3;

main ()

{

int i;

TMOD=0x10; //сконфигурировали таймер как 8-битный тамер счётчик???

TCON=0xC0; //сконфигурировали регистр управления таймером ... как...???

for (i=1;i<100;i++)

{

TH1 = 13453 >> 8; //число высчитал по формуле, это не важно, тут вроде разобрался

TL1 = 13453;

TR1 = 1;

while (!TF1);

TF1 = 0;

}

P0_0 = 0;

P0_1 = 0;

P0_2 = 0;

P0_3 = 0;

for (i=1;i<100;i++)

{

TH1 = 13453 >> 8; //тут опять какое-то повторение, можно обойтись без него? а понял смысл, предыдущие идентичные команды - светодиод не горит "такое-то" время, а эти команды - светодиод горит "такое-то" время.

TL1 = 13453;

TR1 = 1;

while (!TF1);

TF1 = 0;

}

P0_0 = 0;

P0_1 = 0;

P0_2 = 1; //загорается "такой-то" светодиод

P0_3 = 0;

}

Изменено пользователем Djumper

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

sfr TH1=0x8D; //TH1 и TL1 старший и младший разряды таймера работающие в первом режиме? указываем их порты?
Для SFR с адресом 8Dh определяется символическое имя - TH1. Это имя впоследствии используется в программе.

 

sbit TF1=TCON^7; //вот эти две строчки не понял что означают. и цифры что означают 7 и 6?

sbit TR1=TCON^6;

sbit P0_0 = P0^0; //тут всё ясно, опять таки что означают цифры 0,1,2,3? исключающее ИЛИ для чего?

sbit P0_1 = P0^1;

sbit P0_2 = P0^2;

sbit P0_3 = P0^3;

Для отдельных битов SFR определяются символические имена. Например, запись P0^0 означает нулевой бит регистра специальных функций с именем P0. Такая запись битов "проходит" не во всех трансляторах.

 

PS. Обычно с транслятором поставляется файл в котором уже определены все регистры и их биты в соответствии с DS на конкретный МК. Вместо определения их в программе (т.е. всех этих строк с sfr и sbit) записывают строчку препроцессора

#include <ADuC842.h>

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

P0_2 = 1; //загорается "такой-то" светодиод
Эдесь, скорее всего, "какой-то" светодиод - погаснет. Посмотрите внимательно в DS: как устроен выход паралельного порта - при выводе в порт нуля соответствующая ножка "замыкается" на "землю" ключем, а при выводе единицы - высокий уровень на ножке обеспечивается подтягивающим резистором. Чтобы загорелся светодиод - его включают между ножкой МК и плюсом питания через резистор, при этом светодиод горит при нуле на ножке МК. МК51 ("классика") может обеспечить достаточный для зажигания светодиода ток (и то не на всех портах) только при нуле на ножке МК (втекающий ток).

 

 

TMOD=0x10; //сконфигурировали таймер как 8-битный тамер счётчик???

Устанавливается "режим 1" работы таймера. В этом режиме счет идёт до FFFFh (т.е. шестнадцатибитный счетчик), при переполнении (FFFF -> 0000) устанавливается бит TF1.

TCON=0xC0; //сконфигурировали регистр управления таймером ... как...???
Устанавливаются биты TF1 и TR1. Imho, эта строка - лишняя: бит TR1 и так устанавливается несколько ниже, а бит TF1 - в данном случае устанавливать как раз и не надо: его появление при переполнении счетчика ожидается в цикле.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

for (i=1;i<100;i++)

{

TH1 = 13453 >> 8; //число высчитал по формуле, это не важно, тут вроде разобрался

TL1 = 13453;

TR1 = 1;

while (!TF1);

TF1 = 0;

}

Ещё маленькое замечание. В цикле Вы устанавливаете бит TR1. Этот бит автоматически не сбрасывается в ноль, и в программе - он не изменяется. Поэтому, достаточно один раз установить его в единицу (и то - не в цикле):

TR1 = 1;                    
for (i=1;i<100;i++) 
{ 
......
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#include <ADuC842.h>

Спасибо за подсказку!

 

Эдесь, скорее всего, "какой-то" светодиод - погаснет. Посмотрите внимательно в DS: как устроен выход паралельного порта - при выводе в порт нуля соответствующая ножка "замыкается" на "землю" ключем, а при выводе единицы - высокий уровень на ножке обеспечивается подтягивающим резистором. Чтобы загорелся светодиод - его включают между ножкой МК и плюсом питания через резистор, при этом светодиод горит при нуле на ножке МК. МК51 ("классика") может обеспечить достаточный для зажигания светодиода ток (и то не на всех портах) только при нуле на ножке МК (втекающий ток).

У меня (точнее на микроконтроллере на работе, он не мой:)) согласно схеме, светодиод подключен немного по другому: "минус" светодиода через резистор R1 подключен к коллектору транзистора, "плюс" светодиода подключен через резистор R2 к базе транзистора (сюда подаётся + напряжения питания, а этот резистор служит для усиления тока базы), эмиттер подключен к "земле" (-). И уже через базу транзистора мы подключаемся к выводу микроконтроллера.

Как я понял благодаря этому резистору R2, вместо 0 для включения светодиода, мы имеем 1 для включения светодиода.

 

Спасибо за подсказки!

 

 

Кстати никто не поможет написать простую программу, что-то вроде ввода пароля на микроконтроллере: вводим с помощью клавиатуры матричного типа известные цифры (пароль), светодиод загорается, если пароль введён не верно, то ничего не происходит.

С меня подробная принципиальная схема устройства для которого пишется программа. Документация. Само устройство есть в пользовании. И я готов за работу даже денюшку дать, минимум 10$.

Короче мне нужен учитель для создания этой программы :)

Изменено пользователем Djumper

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сам написал программу! Всё же приятно самому сделать что-то работающее. Получилась немного кривая программа.

Писал программу пользуясь другими программами, т.е. пришлось перерыть много "литературы", чтобы найти то что нужно.

 

Что получилось: хотел написать программу типа кодового замка, получилось, что-то вроде: жмём три кнопки 1,6,8 по очереди, загорается один, два и три светодиода (нажали нужные кнопки).

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

 

Что хочу получить в новой версии программы, но не знаю как это реализовать:чтобы светодиоды загорались только при нажатии на кнопки 1,6,8. И чтобы когда загорелся третий светодиод, загорались все четыре светодиода и продолжали гореть, а при нажатии на любую кнопку они прекращали гореть.

 

Выслушаю любые советы и подсказки.

 

sfr P0=0x80; //ну тут стандартно, решил расписать каждую "ножку" отдельно, чтобы было легче писать программу и чтобы не запутаться

sfr P1=0x90;

sbit P0_0=0x80; //1 светодиод

sbit P0_1=0x81; //2 светодиод

sbit P0_2=0x82; //3 светодиод

sbit P0_3=0x83; //4 светодиод

sbit P0_4=0x84; //1 столбец клавиатуры матричного типа

sbit P0_5=0x85; //2 столбец

sbit P0_6=0x86; //3 столбец

sbit P1_0=0x90; //1 строка

sbit P1_1=0x91; //2 строка

sbit P1_2=0x92; //3 строка

sbit P1_3=0x93; //4 строка

 

int k;

char a[3]; //переменная "а" будет содержать 3 символа? или состоит из матрицы с 3 столбцами?

main()

{

char b[3]={'1','6','8'}; //это вроде как значение кода, но он не работает или это что-то другое? переменная, то для чего?

inception: P0=0; P1=0;//inception я придумал название, это же переменная?

while(k!=3) //почему "k" не равно 3??? когда будет больше нажатий то обнулиться?

{

P0_4=0; P0_5=1; P0_6=1; //ну тут на 1 столбец 0 подаём, что означает что на этом столбце будет нажата какая-то клавиша

if (P1_0==0) {k++; while(P1_0==0) a[k]='1'; //указали строку, нажата 1 клавиша, добавили к "k" единичку, далее пока клавиша нажата, то что? переменная "а" равна 1 кодовому символу?

P0_3=1; P0_2=0; P0_1=0; P0_0=0;} //включаем светодиод подавая 1 (специфичная схема :))

 

P0_4=1; P0_5=1; P0_6=0;

if (P1_1==0) {k++; while(P1_1==0) a[k]='6';

P0_3=0; P0_2=1; P0_1=0; P0_0=0;}

 

P0_4=1; P0_5=0; P0_6=1;

if (P1_2==0) {k++; while(P1_1==0) a[k]='8';

P0_3=0; P0_2=0; P0_1=1; P0_0=0;}

}

//тут охота чтобы после третьей нажатой клавиши загорались все 4 светодиода и продолжали гореть пока не нажму на любую другую клавишу

goto inception; //идём к "началу" и повторяем цикл?

}

 

PS: не важно в каком порядке буду код вводить, подскажите как включить все 4 светодиода и выключить их при нажатии на любую клавишу.

Спасибо!

Изменено пользователем Djumper

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выслушаю любые советы и подсказки.

Попробую подсказать

 

Бесконечный цикл реализуется проще так:

вместо

inception: P0=0; P1=0;//inception я придумал название, это же переменная?
.......
goto inception;

записываем

for(;;)
{ 
P0=0; P1=0;
.......
}

Далее - матричная клавиатура...

Работает считывание нажатых кнопок так: на один из столбцов выдаем низкий уровень (0), на остальные - высокий (1). Считываем значение строк и, там где будет низкий - там нажата кнопка на "пересечении" строки и столбца.

 

Чтобы было Вам понятнее, рекомендую оформить отдельные функциональные части Вашей программы как функции. Например, функция возвращающая нажатые в данный момент кнопки может выглядеть как-то так (подстоюсь под Ваш стиль, чтобы было Вам понятнее):

unsigned int GetButton(void)
{
  unsigned int x;
  P0_4= 1;  P0_5= 1; P0_6= 0;  // Третий столбец
  x= ((~P1) & 0x0F);  // Считали четыре кнопки третьего столбца (P1_0 ... P1_3)
  P0_4= 1;  P0_5= 0; P0_6= 1;  // Второй столбец
  x= (x << 4) | ((~P1) & 0x0F);  // Добавили четыре кнопки второго столбца (P1_0 ... P1_3)
  P0_4= 0;  P0_5= 1; P0_6= 1;  // Первый столбец
  x= (x << 4) | ((~P1) & 0x0F);  // Добавили четыре кнопки первого столбца (P1_0 ... P1_3)
  return x;
}

Эта функция возвращает шестнадцатибитовое значение, 12 младших разрядов которого означают состояние кнопок: 4 младших - на первом столбце, следующие четыре - на втором, и ещё четыре - на третьем. Причем, 1 - кнопка нажата (обратите внимание на инверсию разрядов - (~P1) ).

 

Можно написать и функцию зажигания/тушения светодиодов:

void LED(unsigned char L)
{
  P0= (P0 & 0xF0) | (L & 0x0F);
}

Параметр этой функции: младшие четыре бита - состояния светодиодов (младший - первый, и т.д.)

 

Тогда Ваша программа будет выглядеть как-то так:

void main(void)
{
  unsigned char P;  // Три младших бита этой переменной - признаки нажатия трёх "секретных" кнопок (оно же состояние трёх светодиодов)
  const unsigned int B[3]= { 0x0001, 0x0020, 0x0080 }; // Коды "секретных" кнопок: первая(первый столбец-первая строка), шестая(2-2) и восьмая(2-4)
  
  P= 0; // Кнопки нажаты не были
  LED(0);  // Светодиоды погашены
  for(;;)
  {
    unsigned int x;  // Текущее состояние кнопок
    x= GetButton();
    if((x & B[0]) != 0) 
    {  // Среди нажатых кнопок есть первая секретная
      P= P | (1 << 0);  // Зафиксировали этот факт
      x= x & (~B[0]);  // Удалим её из переменной с нажатыми кнопками
    }
    if((x & B[1]) != 0) 
    {  // Среди нажатых кнопок есть вторая секретная
      P= P | (1 << 1); 
      x= x & (~B[1]);
    }
    if((x & B[2]) != 0) 
    {  // Среди нажатых кнопок есть третья секретная
      P= P | (1 << 2); 
      x= x & (~B[2]);
    }
// Обратите внимание, что выше напрашивается цикл, но сделал без цикла, чтобы было Вам понятнее - переделаете сами...
    if(x != 0) // Нажата ещё какая-то кнопка, которая не входит в список секретных?
      P= 0;  // Да, нажата ещё какая-то кнопка: Все - как бы сначала (т.е. сбросить признаки нажатия кнопок, потушить светодиоды)
    if(P == 0x07)  // Все ли секретные кнопки были нажаты?
      LED(P | 0x08); // или LED(0x0F); Да! Все три кнопки были нажаты - зажечь 4 светодиода
    else
      LED(P); // Зажечь те светодиоды, что соответствуют нажатым секретным кнопкам
  }
}

 

Ну - вот... Как-то так...

 

P.S. Может-быть я не понял Вашу задачу? Например, нужно ли соблюдать порядок нажатия на "секретные" кнопки? В приведенной выше программке - порядок нажатия безразличен. Это - не трудно исправить... Три светодиода я "привязал" к трем "секретным" кнопкам - т.е. нажали вторую "секретную" кнопку - второй светодиод и загорелся, первую кнопку - первый светодиод... А как Вы хотели? Научитесь четко формулировать задачу: хорошая формулировка - считай - половина работы сделана!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

P.S. Может-быть я не понял Вашу задачу? Например, нужно ли соблюдать порядок нажатия на "секретные" кнопки? В приведенной выше программке - порядок нажатия безразличен. Это - не трудно исправить... Три светодиода я "привязал" к трем "секретным" кнопкам - т.е. нажали вторую "секретную" кнопку - второй светодиод и загорелся, первую кнопку - первый светодиод... А как Вы хотели? Научитесь четко формулировать задачу: хорошая формулировка - считай - половина работы сделана!

Спасибо за подсказки, к сожалению нет возможности проверить ваш вариант программы, т.к. микроконтроллер будет доступен только на следующей неделе, но мне бы хотелось просто доработать свой вариант программы.

 

В принципе, пусть "секретные" кнопки нажимаются как угодно, не обязательно по порядку (хотя какой это замок с КОДОМ? :)), мне главное суть уловить и из вашей программы я уловил суть как сделать что-то вроде кода! Спасибо!

 

Сейчас я бы хотел просто сделать так, что после третьей кнопки (в моей программе) загорались все 4 светодиода и продолжали гореть пока я не нажму на любую другую кнопку. Подскажите и я вам буду очень благодарен :)

 

PS: кстати, прочтите мои комментарии к моей программе, правильно ли я понимаю как работает программа?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...