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

 
 
> Светодиодиодна индикация на 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
Ответов
Andbiz
сообщение Aug 17 2012, 17:29
Сообщение #2


Местный
***

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



Программу записал в МК.
В результате получилась следующая ситуация на индикаторах:
Индикатор HL1 – 2
Индикатор HL2 – 3
Индикатор HL3 – 4
Индикатор HL4 – 5
Индикатор HL5 – 6
Индикатор HL6 – 7
Индикатор HL7 – 8
Индикатор HL8 – 8

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


Получилась ситуация, что все разряды сдвинулись на одно значение в сторону. Схема верная – прозвонил, ошибок в ней нет.
Дешифратор работает верно.
Сигналы LE – это выходы с инверторов сигналов (D5-D6).

Должно быть:
LE1 – не задействован в программе
LE2 – не задействован в программе
LE3 – не задействован в программе
LE4 – разрешение включения индикатора HL1
LE5 – разрешение включения индикатора HL2
LE6 – разрешение включения индикатора HL3
LE7 – разрешение включения индикатора HL4
LE8 – разрешение включения индикатора HL5
LE9 – разрешение включения индикатора HL6
LE10 – разрешение включения индикатора HL7
LE11 – разрешение включения индикатора HL8
LE12 – отсутствует, на схеме не подключен

На деле:
LE1 – неизвестно
LE2 – неизвестно
LE3 – неизвестно
LE4 – неизвестно
LE5 – разрешение включения индикатора HL1
LE6 – разрешение включения индикатора HL2
LE7 – разрешение включения индикатора HL3
LE8 – разрешение включения индикатора HL4
LE9 – разрешение включения индикатора HL5
LE10 – разрешение включения индикатора HL6
LE11 – разрешение включения индикатора HL7
LE12 – разрешение включения индикатора HL8

Т.е. получилась ситуация, что все сигналы сдвинулись на одно значение. При помощи сигнала LE12 я могу зажигать индикатор HL8 и записывать в него любые значения. При этом этот вывод неподключен. Дешифратор работает верно, значения все записываю верно.
Уже потратил весь день на поиски причины этого сдвига. Из-за чего это может происходить?
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Aug 17 2012, 19:53
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



на ИР22 (SN74LS373) остаются (хранятся) те данные, которые были во время перехода H->L.
то есть те данные, которые были в момент откючения канала дешифратора (Дешифратор активный 0, но у Вас еще инвертор после него есть)
Делайте выводы.

Но с кодом программы нужно что-то делать.
1. Коментарии должны быть полезны, а не просто набор слов.
2. Не применяйте константы в коде, пользуйтесь #define


Пишите как-то так
Код
#define ADDR_HL1 0x03
#define ADDR_HL2 0x04
#define ADDR_HL3 0x05
#define ADDR_HL4 0x06
#define ADDR_HL5 0x07
#define ADDR_HL6 0x08
#define ADDR_HL7 0x09
#define ADDR_HL8 0x0A
#define ADDR_HL_NO_SELECT 0x00    //все селекты HL1-HL8 неактивны

#define LEDCODE_0    0xF9
#define LEDCODE_1    0x19
#define LEDCODE_2    0x29
#define LEDCODE_3    0x39
#define LEDCODE_4    0x49
#define LEDCODE_5    0x59
#define LEDCODE_6    0x69
#define LEDCODE_7    0x79
#define LEDCODE_8    0x89
#define LEDCODE_9    0x99


#define PORT_DATA PORTD
#define PORT_ADDR PORTE

// определение функций
void Indicator(char addrCode, char dataCode);


//сами функции
void Indicator(char addrCode, char dataCode)
{
    PORT_ADDR = addrCode;
    PORT_DATA = dataCode;
    PORT_ADDR = ADDR_HL_NO_SELECT;     // в этот момент защелкиваются данные на HL1
}



void main (void)
{
    TRISD = 0;    //порты на вывод
    TRISE = 0;

    Indicator(ADDR_HL1,LEDCODE_1);
    Indicator(ADDR_HL2,LEDCODE_2);
    Indicator(ADDR_HL3,LEDCODE_3);
    Indicator(ADDR_HL4,LEDCODE_4);
    Indicator(ADDR_HL5,LEDCODE_5);
    Indicator(ADDR_HL6,LEDCODE_6);
    Indicator(ADDR_HL7,LEDCODE_7);
    Indicator(ADDR_HL8,LEDCODE_8);
      
        while(1);  // ждем выключения или ресета
}


И еще, по схеме:
1. Скажите большое спасибо тому, кто нарисовал на схеме инвертор ЛН1 без обозначения инверсии выходов. Это инвертор. там кружочки нарисовать хорошо бы. Как, впрочем и у ИД7.
2. Второе спасибо за то, что "разработчик" платы разработал также и нестандартный порядок пинов на ICSP разъеме внутрисхемного программирования. Стандартный порядок: Vpp, Vdd,Vss, PGD, PGC.

Основной штамп на первом листе Вы благоразумно затерли, иначе я бы оперировал конкретным именем разработчика sm.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Andbiz   Светодиодиодна индикация на PIC18F6722   Aug 16 2012, 16:40
- - 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 6 2012, 11:26
|- - Andbiz   Цитата(esaulenka @ Sep 6 2012, 14:26) Вот...   Sep 6 2012, 14:50
- - esaulenka   ЦитатаПри нажатии клавиши может отобразиться много...   Sep 7 2012, 09:31


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 07:22
Рейтинг@Mail.ru


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