Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

Re: Програмирование pic на СИ.

Пт янв 28, 2011 00:50:49

misterkuk писал(а): Компиляция прошла успешно:) Завтра проверю на железе.

Можешь и не проверять , работать не будет ...

Re: Програмирование pic на СИ.

Пт янв 28, 2011 10:02:07

dosikus писал(а):
misterkuk писал(а): Компиляция прошла успешно:) Завтра проверю на железе.

Можешь и не проверять , работать не будет ...

:( почему?

Re: Програмирование pic на СИ.

Пт янв 28, 2011 10:31:49

misterkuk писал(а):Вот моя первая програма под схему http://www.labkit.ru/html/Assembler_for_PIC?id=356 Компиляция прошла успешно:) Завтра проверю на железе.
Код:
#include <pic.h>

__CONFIG (INTIO & UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS);
#define knopka RB2 // кнопка
void podgot (void); // подготовка МК
void main (void)
{
podgot();
if (knopka = 0)
PORTB = 0b01111111;
}
// === подготовка МК
void podgot (void)
{
TRISA = 0b00000000; // направление работы ножек порта А
TRISB = 0b11111111; // направление работы ножек порта В
CMCON = 0x07; // отключение компараторов
PORTA = 0; // очищаем порт А
PORTB = 0; // очищаем порт Б
RBPU = 1;  // подтягивающие R (0-вкл, 1-выкл)
}

Дефайны лучше для удобства чтения подтягивать к инклюдам, сразу после них.
Условие проверяется на равенство оператором ==, а не = (оператор присвоения)
Приучайся при модификации порта не трогать те выводы, которые заняты. В твоем случае это вход кнопки.
В твоем случае, судя по программе, ты не успеешь нажать кнопку после включения. Придется держать ее нажатой при подаче питания. :)
Попробуй сделать в цикле:
Код:
void main (void)
{
  podgot();
  for(;;)
  {
   if (knopka == 0)
    PORTB |= 0b0000001;
   else
    PORTB &= 0b1111110;
  }
}

И отслеживать состояние RB0 в зависимости от состояния кнопки.

Re: Програмирование pic на СИ.

Пт янв 28, 2011 11:08:29

ut1wpr писал(а):Дефайны лучше для удобства чтения подтягивать к инклюдам, сразу после них.
Условие проверяется на равенство оператором ==, а не = (оператор присвоения)
Приучайся при модификации порта не трогать те выводы, которые заняты. В твоем случае это вход кнопки.
В твоем случае, судя по программе, ты не успеешь нажать кнопку после включения. Придется держать ее нажатой при подаче питания. :)

И отслеживать состояние RB0 в зависимости от состояния кнопки.

Не пойму зачем нам отслежывать выход на индикатор? Я думал нужно отслежывать кнопку, тоесть RA2. Про равенство забыл. Виноват. И что такое Дефайны?:) Программа с изменением равенства не заработала:( В обед проверю с вашими исправлениями.
Цель была такая- Нажимаем- горит
Бросаем тухнет.
А мочему вы в примере поставили |= и &= ?

Re: Програмирование pic на СИ.

Пт янв 28, 2011 11:51:24

misterkuk писал(а):Вот моя первая програма под схему http://www.labkit.ru/html/Assembler_for_PIC?id=356 Компиляция прошла успешно:) Завтра проверю на железе.
Код:
#include <pic.h>

__CONFIG (INTIO & UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS);
#define knopka RB7 // кнопка
void podgot (void); // подготовка МК
void main (void)
{
podgot();
while(1) начало бесконечного цикла (внимательно читай самоучитель)
{
if (knopka == 0)  PORTB0 = 1;
else PORTB0 = 0;
} //конец бесконечного цикла
} //конец функции
// === подготовка МК
void podgot (void)
{
TRISA = 0b00000000; // направление работы ножек порта А
TRISB = 0b10000000; // направление работы ножек порта В
CMCON = 0x07; // отключение компараторов
PORTA = 0; // очищаем порт А
PORTB = 0; // очищаем порт Б
RBPU = 1;  // подтягивающие R (0-вкл, 1-выкл)
}

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

Re: Програмирование pic на СИ.

Пт янв 28, 2011 11:54:19

скажите ,а зачем накладывать маски |= и &= на порт,чтобы вывести в него данные?
в авр я встречал подобные присваивания, хотя просто пишу через =
PORTB = 0b10100100; и все прекрастно работает

Re: Програмирование pic на СИ.

Пт янв 28, 2011 12:04:15

vovik15 писал(а):скажите ,а зачем накладывать маски |= и &= на порт,чтобы вывести в него данные?
в авр я встречал подобные присваивания, хотя просто пишу через =
PORTB = 0b10100100; и все прекрастно работает


Это не зависит от PIC или AVR. Логика тут простая : присваиванием меняешь _все_ разряды порта. Можно и так написа'ть, но при этом надо каждый раз помнить, что там было раньше, и каждый раз воспроизводить это состояние остальных выходов портов. А по маске - изменить состояние только выбранных выходов, не трогая остальные.

Re: Програмирование pic на СИ.

Пт янв 28, 2011 13:21:47

vovik15 писал(а):скажите ,а зачем накладывать маски |= и &= на порт,чтобы вывести в него данные?
в авр я встречал подобные присваивания, хотя просто пишу через =
PORTB = 0b10100100; и все прекрастно работает

Чтобы не "задевать" те разряды порта, которые нельзя трогать.
Подобные сокращения в Си повсеметно приняты. Язык Си очень гибок. Но по сути все сводится к следующему преобразованию.
Код:
char temp;
 temp = PORTB & 0xFE;
 PORTB = temp;

Читаем в переменную temp значение выводов порта, накладывая маску, при этом бит_0 сбрасывается.
Модифицированное значение temp выводим снова в порт.
В результате bit_0 порта окажется сброшенным, при этом остальные разряды порта останутся неизменными.
Оператор &= называется совмещенным оператором. Компилятор при этом сам наложит маску и присвоит модифицированное значение переменно, слева от оператора.
Рекомендую почитать основы программирования на Си. В интернете бездна материала...

Re: Програмирование pic на СИ.

Пт янв 28, 2011 17:38:32

При проверке на железе, горел только "е" сегмент и причём не зависимо от того нажата кнопка или нет.

Re: Програмирование pic на СИ.

Вс янв 30, 2011 19:23:29

Ну думаю с простой программой мы разобрались. А как насчёт работы с энергонезависимой памятью? как с ней работать?

Re: Програмирование pic на СИ.

Пн янв 31, 2011 10:03:59

http://piclist.ru/S-EEPROM/S-EEPROM.html
что ты привязался к этой памяти? у пиков полно других полезных функций

Re: Програмирование pic на СИ.

Пн янв 31, 2011 13:36:04

попробывал в протеусе. Там тоже только 1 сегмент горит. В чём причина?

Re: Програмирование pic на СИ.

Пн янв 31, 2011 19:45:55

исходник давай,и проект протеуса

Re: Програмирование pic на СИ.

Пн янв 31, 2011 22:56:17

С протеусом раньше не работал. Соединил индикатор с пиком как попало ( не так как на схеме). На железе тотже результат.
Вложения
ishodnik+proekt.rar
(110.45 KiB) Скачиваний: 353

Re: Програмирование pic на СИ.

Пн янв 31, 2011 23:38:43

А как на счёт хекса ? :))) Исходник нельзя вотнуть в протеус.... :?

Re: Програмирование pic на СИ.

Вт фев 01, 2011 00:30:55

:) Вот и хекс
Вложения
migal hex.rar
(243 байт) Скачиваний: 325

Re: Програмирование pic на СИ.

Вт фев 01, 2011 01:24:43

значит так
во вложении проект протеуса и исходник
что касаеться протеуса : кварц ставить необязательно(он все равно не эмулируеться) резисторы на индикатор тоже ставить не требуеться
они только отнимают ресурсы компьютера
Вложения
project.rar
(15.69 KiB) Скачиваний: 347

Re: Програмирование pic на СИ.

Вт фев 01, 2011 22:10:09

Но вопрос остаётся открытым. Почему горит только 1 сегмент и мигает как вздумается ему?

Re: Програмирование pic на СИ.

Вт фев 01, 2011 23:55:13

бесконечный цикл забыл
while(1)
{
тут нужный код
}

и номер кнопочки перепутал (надо было в протеусе на другую линию повесить)
на RA2 перевесь,согластно программе
Код:
#include <pic.h>
__CONFIG (LP & UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS);

void podgot (void); // подготовка МК
void main (void)
{
podgot();
while (1)
{
if (RA2 == 0) PORTB = 1;
}
} //конец функции
// === подготовка МК

void podgot (void)
{
TRISA = 0b11111111; // направление работы ножек порта А
TRISB = 0b00000000; // направление работы ножек порта В
CMCON = 0x07; // отключение компараторов
PORTA = 0; // очищаем порт А
PORTB = 0; // очищаем порт Б
RBPU = 1;  // подтягивающие R (0-вкл, 1-выкл)
}

Re: Програмирование pic на СИ.

Ср фев 02, 2011 00:31:51

vovik15 писал(а):бесконечный цикл забыл

Я уже скопировал ваш код, вставил в МПЛАБ, скомпилировал. В протеусе в свойствах пика указал на hex файл прошивки что в папке микрочипа в програм файлс. Нажимаю плей. Ничего не горит ( хорошо). При нажатие кнопки должны загореться все сегменты, но загорается и горит всё время только 1 сегмент с линии RB0. Хотя по идее при отжаатии ничего светится не должно. У вас тот код что вы написали, как в протеусе работает?
Вложения
Безымянный22.JPG
(193.68 KiB) Скачиваний: 790
Ответить