|
Светодиодиодна индикация на PIC18F6722, Как правильно написать программу? |
|
|
|
Aug 16 2012, 16:40
|
Местный
  
Группа: Свой
Сообщений: 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 сигнал подается на ждущий таймер и индикаторы. Данный вывод у меня будет задействован в индикации и будет периодически менять свое значение, т.е. будет сбрасываться. Правильно ли я думаю? Правильно ли я написал программу? Правильно ли я указал конфигурационные биты в начале программы?
|
|
|
|
|
 |
Ответов
|
Sep 6 2012, 11:26
|

Профессионал
    
Группа: Свой
Сообщений: 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, но в данном случае проще вычислять значение прямо при вводе.
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Sep 6 2012, 14:50
|
Местный
  
Группа: Свой
Сообщений: 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В чем может быть проблема?
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|