Свежие обсуждения
Микроконтроллеры

Ликбез по программированию PIC

1 5 99

Вроде уже догадался (см)

 


Моё мнение - не надо для такого ликбеза запутывать начинающего прерываниями, которые при такой задаче и не требуются, и всякими define... Кто уже встрянет и почувствует зачем ему это нужно, то сам потом будет разбираться.
Начинающему гораздо проще понять, что идёт ПРОСТОЙ процесс чтения нужного регистра, изменения полученного КОДА с помощью допустимых команд и выдача управляющего КОДА опять же в нужный регистр, т.е. ячейку памяти со своим индивидуальным адресом.
Прерывания ведь нужны только для мгновенной реакции процессора, а в этой задачке время девать некуда, даже при частоте процессора в десятки кГц. Кнопку можно нажать, если постараться, где-то на 10 мс, даже при частоте 40 кГц одна команда 100 мкс, значит, можно выполнить 100 команд и опросить кнопку, а 100 команд тут не придумаешь.... .
По своему опыту начинающего - трудно было сделать первый шаг, чтобы просто пройти путь, предлагаемый MPLAB(вплоть до того, что файл не хотел сохраняться в папку с русским названием... ) Даже и техзадание можно бы упростить хоть до двух кнопок...

 

Прочитав все, резюмирую:

1. Имеем утвержденное ТЗ.
2. Имеем утвержденную схему подключения кнопок и с/д.
3. Не имеем однозначно согласованного алгоритма. Понятно, что задача имеет много решений, поэтому давайте обсудим все за и против каждого решения и, как просят участники, давайте не будем торопиться, тем более, что не все еще подтянулись к обсуждению (Левон , начитавшись литературы, появится похоже в понедельник). Тем более, что у многих в будни доступ в сеть более удобный.
Итак изучаем предложенные алгоритмы, не забывая, что мы в программировании практически полные нули, и задаем вопросы. К составителям алгоритмов просьба дать текстовые пояснения, если таковые нужны.

 

Итак, схема утверждена эта:

Прошу высказать критические замечания по предложенному графу (вариант 2):

 

По графу picmaniac'a: отсутствует устойчивое состояние, когда нажато более одной кнопки.

Вот мой граф (см. приложение)

PS: sorry, забыл ужать картинку.

 

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

 

Извините, забыл зациклить вершины графа. Исправленный вариант прилагаю.

 

Splav56: в чем нарисован алгоритм?

Разумеется, во FreeHand'е. Хотя подобные промежуточные решения можно было и руками нарисовать и сфотографировать

 

Splav56: алгоритм требует письменных пояснений

Звери! Ну раз уж взялся нарисовать...
http://pro-radio.ru/user/uploads/35066.gif

Все просто. Тут показано тело бесконечного цикла. Идея: получить в конце цикла байт с выставленными битами, соответствующими включенным светодиодам. Например, если нужно зажечь первые три, записываем в этот байт число 7 (двоичное 00000111). На схеме алгоритма этим байтом сразу считается порт B (хотя как тут говорят, читать из него без особой надобности не следует, поэтому пусть это будет любая регистровая переменная).

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

С первой кнопкой просто: если она нажата, записываем в порт B значение 1 и идем дальше.

Если нажата вторая кнопка, смотрим, есть ли в порте В какое-то отличное от нуля значение. Если есть (а это значит, что какой-то светодиод уже включен), обнуляем порт и заканчиваем цикл. Если нет (т. е. port B == 0), записываем туда двоичное 00000011 (зажгли два светодиода) и переходим к третьей кнопке.

Повторяем почти один в один предыдущий абзац для всех остальных кнопок. Если выясняется, что пора включать свет, записываем в порт 0000111 или 00001111 при нажатой третьей или четвертой кнопках. Если на предыдущих шагах какой-то светодиод уже включен, сбрасываем в нуль байт и заканчиваем цикл, не интересуясь тем, нажаты или нет остальные кнопки.

Теперь выдаем сформированные биты на выход, где сидят светодиоды.

И наконец, как правильно заметил Picmaniac, раз мы подключаем светодиоды к +Uпит, то полученный байт должен быть проинвертирован. Это можно сделать либо в конце цикла, либо проинвертировав сразу все значения в алгоритме (то есть вместо 1 пишем 255, вместо 00000111 — 11111000 и т. д.). Но я бы предпочел добавить одно действие в конце, потому что сравнивать с нулем проще, чем сравнивать со значением 11111111.

(А вообще — таблицей надо делать, таблицей )

 

Crot2: Начинающему гораздо проще понять, что идёт ПРОСТОЙ процесс чтения нужного регистра, изменения полученного КОДА с помощью допустимых команд и выдача управляющего КОДА опять же в нужный регистр, т.е. ячейку памяти со своим индивидуальным адресом.
прошу вас излагайтесь пожалуйста правильно, код и байт всётаки разные вещи. ктото может подумать что программа должна код модифицировать, как я вначале, пока не вчитался. извините.
так-же видя что все дружно бросились обсуждать алгоритм чтения кнопок и вывода обработаного результата и чуть не забыли об остальном предлагаю вынести этот алгоритм в отдельную подпрограмму, над которой все дружно и будем "издеватся", заодно опробуем "структурный подход" я же в свою очередь накидал сдесь схему "оболочки" для этой ПП. (см. атач) там только прерывания используются, упоминалось вроде что их лучше не использовать.