реклама на сайте
подробности

 
 
> Светодиодиодна индикация на PIC18F6722, Как правильно написать программу?
Andbiz
сообщение Aug 16 2012, 16:40
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 447
Регистрация: 16-11-08
Из: Украина, Донецк
Пользователь №: 41 684



Здравствуйте, уважаемые форумчане!
Пробую освоить микроконтроллер PIC18F6722. Программа для работы – MPLAB IDE v8.86 + компилятор С18. Программатор – MPLAB ICD3. Есть плата, на которой уже установлен данный микроконтроллер и есть светодиоды, которые можно «позажигать», чтобы немного разобраться в работе данного МК.

Вот схемы платы:
Прикрепленное изображение

Прикрепленное изображение

Прикрепленное изображение


Микроконтроллер показан на третьей схеме.
Кварц стоит внешний – на 6 Мгц. Также используется внешний сторожевой ждущий таймер ADM706, который подключен к выводу 2 (RE0), которым нужно периодически давать импульсы, чтобы сбрасывать данный таймер и он не подал сигнал на перезапуск МК (я так понимаю).

На плате есть 8 семисегментных индикаторов HL1-HL8 (KingsBright SA56-11EWA).
Я решил написать программу, при которой на них будет написаны числа 12345678.
Сигналы на выбора сегмента (D0-D7) подключены от МК к индикатору через буферный регистр хранения информации ЭКФ1533ИР22. Сигналы на разрешение включения индикатора LE4 – LE11 подаются на индикатор с того же буферного регистра ЭКФ1533ИР22, на который данные сигналы подаются с МК через дешифратор ЭКФ1533ИД7 и инвертор сигналов ЭКФ1533ЛН1. С данными микросхемами я разобрался и написал для себя таблицу значений выходов МК, при которой будет зажигаться необходимая мне комбинация цифр.

Текст программы написал следующий:

Код
#include <p18f6722.h>

#pragma config OSC = XT // Применяю внешний кварцевый резонатор
#pragma config WDT = OFF // Внутренний сторожевой таймер отключаю - применяется внешний, который нужно периодически обнулять

void main (void)
{
    TRISD = 0;
    TRISE = 0;

    PORTD = 0; // Сбрасываю значения на порте D
    PORTE = 0; // Сбрасываю значения на порте E
    
    PORTD = 0xF9; // Принимаю соответствующие значения сегментов для индикатора HL1
    PORTE = 0x3; // Разрешаю индикацию индикатора HL1

    PORTD = 0xA4; // Принимаю соответствующие значения сегментов для индикатора HL2
    PORTE = 0x4; // Разрешаю индикацию индикатора HL2

    PORTD = 0xB0; // Принимаю соответствующие значения сегментов для индикатора HL3
    PORTE = 0x5; // Разрешаю индикацию индикатора HL3

    PORTD = 0x99; // Принимаю соответствующие значения сегментов для индикатора HL4
    PORTE = 0x6; // Разрешаю индикацию индикатора HL4

    PORTD = 0x92; // Принимаю соответствующие значения сегментов для индикатора HL5
    PORTE = 0x7; // Разрешаю индикацию индикатора HL5

    PORTD = 0x82; // Принимаю соответствующие значения сегментов для индикатора HL6
    PORTE = 0x8; // Разрешаю индикацию индикатора HL6

    PORTD = 0xF8; // Принимаю соответствующие значения сегментов для индикатора HL7
    PORTE = 0x9; // Разрешаю индикацию индикатора HL7

    PORTD = 0x80; // Принимаю соответствующие значения сегментов для индикатора HL8
    PORTE = 0xA; // Разрешаю индикацию индикатора HL8
    
    while (1); // Организую бесконечный цикл, для того, чтобы индикация светодиодов была постоянной
}


Программу скомпилировал, все прошло нормально, но прошивать МК еще не стал – решил спросить совета. Как я понимаю, при данной программе на мгновение должна появиться комбинация 12345678, т.к. с вывод микроконтроллера RE0 сигнал подается на ждущий таймер и индикаторы. Данный вывод у меня будет задействован в индикации и будет периодически менять свое значение, т.е. будет сбрасываться. Правильно ли я думаю? Правильно ли я написал программу? Правильно ли я указал конфигурационные биты в начале программы?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
esaulenka
сообщение Sep 6 2012, 11:26
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Вот зачем, интересно, мы тут кучу советов надавали?..
И ещё раз...

Цитата
// определяю адрес первого индикатора HL1 0x03, как переменную ADDR_HL1

Во-первых, терминология неверная.
Во-вторых, комментарии "масло масляное по той причине, что оно масляное" э-э... несколько мешают восприятию.


Цитата
char i,n;

Глобальные переменные так называть НЕЛЬЗЯ. Для глобальной переменной из её названия должно быть очевидно, что там внутри находится.
Для локальной это не так критично, хотя тоже некрасиво.

Цитата
if (PORTBbits.RB0==0) SIMVOL=4; //проверяю 0 на строке 1 (восемь)
else if (PORTBbits.RB1==0) SIMVOL=5; //проверяю 0 на строке 2 (пять)
else if (PORTBbits.RB2==0) SIMVOL=6; //проверяю 0 на строке 3 (два)

Ну вот откуда очевидно, что SIMVOL=4 - это восемь, а SIMVOL=6 - это два?! Это явное место для применения дефайнов (или, что лучше, enum'а).


Цитата
for (i==0; i<10000; i++); //длительность задержки опрделяется величиной i

Как уже говорили, длительность ЭТОЙ задержки определяется погодой на Марсе. Кроме того, непонятна необходимость этой задержки в принципе.

Цитата
Могу ли я из элементов массива (к примеру [0],[5],[8],[9],[7],[1]) создать число 58971 записью
sprintf (a, "%06d", buf);

Нет, конечно. Посмотрите на типы аргументов у sprintf. Для этой задачи подойдёт sscanf, но в данном случае проще вычислять значение прямо при вводе.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Andbiz
сообщение Sep 6 2012, 14:50
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 447
Регистрация: 16-11-08
Из: Украина, Донецк
Пользователь №: 41 684



Цитата(esaulenka @ Sep 6 2012, 14:26) *
Вот зачем, интересно, мы тут кучу советов надавали?..
Во-первых, терминология неверная.
Во-вторых, комментарии "масло масляное по той причине, что оно масляное" э-э... несколько мешают восприятию.
Глобальные переменные так называть НЕЛЬЗЯ. Для глобальной переменной из её названия должно быть очевидно, что там внутри находится.
Для локальной это не так критично, хотя тоже некрасиво.
Ну вот откуда очевидно, что SIMVOL=4 - это восемь, а SIMVOL=6 - это два?! Это явное место для применения дефайнов (или, что лучше, enum'а).

На работе у меня Интернета нет, исправления внесу на работе, там же можно сразу проверить.

Цитата(esaulenka @ Sep 6 2012, 14:26) *
Как уже говорили, длительность ЭТОЙ задержки определяется погодой на Марсе. Кроме того, непонятна необходимость этой задержки в принципе.


При нажатии клавиши может отобразиться много цифр на индикаторе. В процессе написания программы пока помогает.

Цитата(esaulenka @ Sep 6 2012, 14:26) *
в данном случае проще вычислять значение прямо при вводе.

А каким образом?

Сегодня продолжал разбираться с прерыванием - так и не возникает. Программа чучуть изменилась. Текст теперь вот такой:
http://files.mail.ru/0LTSRM
В чем может быть проблема?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Andbiz   Светодиодиодна индикация на PIC18F6722   Aug 16 2012, 16:40
- - Andbiz   Программу записал в МК. В результате получилась сл...   Aug 17 2012, 17:29
|- - Ruslan1   на ИР22 (SN74LS373) остаются (хранятся) те данные,...   Aug 17 2012, 19:53
- - ILYAUL   Цитата1. Коментарии должны быть полезны, а не прос...   Aug 17 2012, 20:14
- - Andbiz   Большое спасибо за помощь! Цитатана ИР22 (SN7...   Aug 20 2012, 15:28
|- - Ruslan1   Цитата(Andbiz @ Aug 20 2012, 18:28) Я обр...   Aug 20 2012, 17:20
- - Andbiz   Сигнал LE1 идет на микросхему D7 ЭКФ1533ИР22 (перв...   Aug 20 2012, 17:52
- - Andbiz   Написал другую программу. Предприятие, на котором ...   Aug 21 2012, 15:40
|- - _Артём_   Цитата(Andbiz @ Aug 21 2012, 18:40) Прогр...   Aug 21 2012, 15:55
- - esaulenka   Маленький совет: при написании комментариев забыть...   Aug 21 2012, 16:28
|- - _Артём_   Цитата(esaulenka @ Aug 21 2012, 19:28) Ма...   Aug 21 2012, 16:36
- - _Ivana   Да, читая комментарии я только ещё больше путаюсь ...   Aug 21 2012, 16:43
- - esaulenka   и о ЦАПах, которые на самом деле очень даже АЦП Ц...   Aug 21 2012, 17:23
- - Andbiz   _Артём_ Спасибо, понял – более компактный код можн...   Aug 22 2012, 17:01
|- - Ruslan1   Про индикацию: самое простое для разборок- это 1. ...   Aug 23 2012, 08:54
- - esaulenka   Цитата1) За return должно следовать выражение в ск...   Aug 23 2012, 11:46
- - Andbiz   Спасибо! Программу сделал. Код получился следу...   Aug 31 2012, 18:51
- - Andbiz   Программу для ввода текста сделал – вводит в...   Sep 5 2012, 14:15
- - Andbiz   Вопрос еще по поводу функции sprintf . Могу ли я и...   Sep 5 2012, 19:01
- - esaulenka   ЦитатаПри нажатии клавиши может отобразиться много...   Sep 7 2012, 09:31


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 12:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01406 секунд с 7
ELECTRONIX ©2004-2016