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

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 931
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

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

Сообщение Ghost in shell »

Аlex писал(а):
Ghost in shell писал(а):как записать число непосредственно в память МК?
Не совсем понятен вопрос. Что означает "память МК" и что значит непосредственно ?
Ну и для чего это вообще нужно ? Вдруг найдутся альтернативные решения Ваших задумок.

Хочу писать значения в eeprom, чтобы не пропадали при отключении питания. Уверен, что при непоследственном обращении к памяти компилятор работает безглючнее, и прога быстрее идет.
P.S. В какой версии MPLAD IDE вы работаете?
Кот гуляет сам по себе, но вблизи холодильника.
electronik_tver
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн авг 05, 2013 12:18:46

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

Сообщение electronik_tver »

urry писал(а):Самое время отложить протеус и взять в руки паяльник.


Вот доделаю банный прибор освободится макетка и спаяю часы в железе
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

urry писал(а):Вопросы - почему часы стоят - это уже не мне, а Тени. Имхо, здесь недопиленная разработчиками модель.
Самое время отложить протеус и взять в руки паял0


Юра, да брось ...
Все там работает и без танцев с бубном .
Шину надо было объявить , см на скрин.
А все остальное есть в даташите . И запись соответствует интел шине , и запуск часиков - все в нем расписано .

СпойлерИзображение

Изображение
electronik_tver
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн авг 05, 2013 12:18:46

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

Сообщение electronik_tver »

Ув Dosikus а можно по подробнее? я даж специальную тему создавал с просьбой о помощи, ссылочка на предыдущей странице, и щел не методом тыка а по даташиту, опыта только маловато найти где не так сделал
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

А что здесь непонятного ?
Шину соединяем как на скрине .
Задаем пинам порта пЫк AD0 -AD7 - соответственно шине DS12887 ,
ставим метку на шину AD[0..7] - сие крайне обязательно , причем все это расписано в хелпе к протеус.
В модели есть диагностика записи и чтения - НО! корректно работает только для регистров 0x00-0x0D .
Хватит для начальном отладки . После вылизывания процедур диагностику отключить !
Часики пускаются записью 0x20 в регистр 0x0A ...

СпойлерИзображение

Изображение

Изображение



Эпюры записи и чтения для шины интел :

СпойлерИзображение
Изображение
electronik_tver
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн авг 05, 2013 12:18:46

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

Сообщение electronik_tver »

метку на шине поставил, заработала шина,
20 в регистр А отправил пошли часы (кстате почему 20 тоесть 00100000 так и не понял не нашел в описании), ну слава богу,
писать в регисты часов получается, а вот читать хоть убей нет (((

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

#include <htc.h>
#include <stdio.h>
#include "usart.h"
#include "hard_config.h"

__CONFIG(HS & WDTDIS & PWRTEN & BOREN & LVPDIS & UNPROTECT );

#define DS_AS RC0
#define DS_WR RC1
#define DS_RD RC2
#define DS_Data PORTD

unsigned char BCDconv (unsigned char source);
unsigned char DCBconv (unsigned char source);
unsigned char ReadMemory (unsigned char Addr);
void WriteMemory (unsigned char Addr,unsigned char Data);
void ClockInit( void );

near unsigned char hours,minutes,seconds,day,mon,year,week,mem;

unsigned char BCDconv (unsigned char source) {
unsigned char temp_min=0;
unsigned char temp_maj=0;
temp_min = source&15; temp_maj = source >> 4;
temp_maj *= 10;
return temp_maj+temp_min;}

unsigned char DCBconv (unsigned char source) {
unsigned char temp_min=0;
unsigned char temp_maj=0;
temp_maj = source/10 ;temp_min = source - temp_maj*10;
temp_maj <<= 4; return temp_maj+temp_min;}

void main() {GIE = 0;init_comms();ClockInit();
mem=0;printf("\r\nmem=%d", mem);DelayS(1);
WriteMemory (0x04,DCBconv(05));
//mem=BCDconv (ReadMemory(0x04));
printf("\r\nmem1=%d", mem);
DelayS(5);
WriteMemory (0x02,DCBconv(11));
//mem=BCDconv (ReadMemory(0x02));
printf("\r\nmem2=%d", mem);
DelayS(5);
WriteMemory (0x00,DCBconv(57));
//mem=BCDconv (ReadMemory(0x00));
printf("\r\nmem3=%d", mem);
DelayS(5);
while(1) {
//seconds=BCDconv (ReadMemory(0x00));
//minutes=BCDconv (ReadMemory(0x02));
//hours=BCDconv (ReadMemory(0x04));
//printf("\r\n=%d", hours);//printf("\r\n=%d", minutes);printf("\r\n=%d", seconds);
DelayS(1);}}

unsigned char ReadMemory (unsigned char Addr) { //читаем значение данных по адресу Addr
unsigned char temp = 0;
TRISD=0b00000000;
DS_RD=1;DS_WR=1;DS_AS=1;
DS_Data=Addr;
DS_AS=0;DelayUs(5);
DS_RD=0;DelayUs(5);
TRISD=0b11111111;
temp = DS_Data;
DS_RD=1;DS_AS=1;
return temp;}

void WriteMemory (unsigned char Addr, unsigned char Data ) {//записываем значение данных по адресу Addr
DS_RD=1;DS_WR=1;DS_AS=1;
TRISD=0b00000000;
DS_Data=Addr;
DS_AS=0; DelayUs(1);
DS_Data=Data;
DS_WR=0;DelayUs(1);
DS_WR=1;DS_AS=0;}


void ClockInit( void ){
TRISC0=0;TRISC1=0;TRISC2=0;PORTC=0;
//WriteMemory (0x0A, 0b00100000 ); //Регистр А 0b11110100
//WriteMemory (0x0B, 0b11111111 ); //Регистр В
//WriteMemory (0x0C, 0b11111111 ); //Регистр C
//WriteMemory (0x0D, 0b11111111 ); //Регистр D
}



вот если строки //mem=BCDconv (ReadMemory(0x04));
и еще там две рядом комментированы, то часы получают последовательно три числа которые я назначил,

тоесть процедура записи работает,
если комментарий с какойто из трех строк снять то перестает работать и последующая запись в регистр (и часы не получают и в ответе мусор) тоесть косяк гдето в процедуре чтения.... (( никак не разберусь где

весь проект в архиве, помогите пож
Вложения
Clock_DS12887.zip
(200.5 КБ) 225 скачиваний
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

На счет включения :
OSCILLATOR CONTROL BITS
When the DS12887 is shipped from the factory, the internal oscillator is turned off. This feature prevents
the lithium energy cell from being used until it is installed in a system. A pattern of 010 in bits 4 through
6 of Register A turns the oscillator on and enables the countdown chain.


Нарывались на сие когда покупали новые чипы , старые с распая - естесно уже включенные.
И так дословно -
Когда чип поставляется с завода , внутренний генератор выключен .
Сие используется для экономии внутренней батареи .
Комбинация 010 в битах 4-6 регистра A включает внутренний генератор и разрешает счетную цепочку .
00100000 бинарное и есть 0x20 .

На счет чтения . Не буду тебя мучать, держи исходники под XC8. Накиданы вчера за 5 минут , так что все сырое но рабочее.
Заметь так же , что у меня CS дергается ...
Спойлер

Код: Выделить всё

#include <xc.h>
#include <stdint.h>

#define _XTAL_FREQ  4000000


#define RTC_DATA   PORTD
#define DATA_DIR_D      TRISD

// Control-Pins
#define RTC_CTRL   PORTB
#define CTRL_DIR_B   TRISB
#define RTC_RD   0x04
#define RTC_WR   0x02
#define RTC_AS     0x01
#define RTC_CS   0x08
#define  wait()  __delay_us(2)

 uint8_t temp[4];

 void delay(uint8_t deltemp)
 {
     while(deltemp)
     {
       __delay_ms(100);
       deltemp--;
     }
 }

void rtc_write(uint8_t addres,uint8_t data)
{
 DATA_DIR_D  = 0x00;
RTC_CTRL &= ~RTC_CS;
wait();
RTC_DATA = addres;
//wait();
RTC_CTRL & = ~RTC_AS;

wait();
RTC_CTRL & = ~RTC_WR;
RTC_DATA =data;
RTC_CTRL | = RTC_WR;
wait();
RTC_CTRL = 0x0F;
}
uint8_t rtc_read(uint8_t addres)
{
uint8_t data;
DATA_DIR_D  = 0x00;
RTC_CTRL &= ~RTC_CS;
wait();
RTC_DATA = addres;
//wait();
RTC_CTRL & = ~RTC_AS;
wait();

DATA_DIR_D  = 0xFF;
wait();
RTC_CTRL & = ~RTC_RD;
data=RTC_DATA ;
RTC_CTRL = 0x0F;
return data;
}


void main(void)
{
    uint8_t i;
    CTRL_DIR_B=0x00;
    ANSELH=0;
    RTC_CTRL = 0x0F;
    DATA_DIR_D =0x00;

delay(2);
rtc_write(0,0x35);            // пишем секунды
rtc_write(2,0x45);            // пишем минуты
rtc_write(0x0B,0x02);       // 24 часовой режим
rtc_write(4,0x22);           // пишем часы
rtc_write(0x0A,0x20);     // старт
delay(20);
temp[0] =rtc_read(0);    //читаем секунды
temp[1] =rtc_read(2);     //читаем минуты
temp[2] =rtc_read(4);     //читаем часы

    while(1)
    {
    ;
    }
   
}



PS Твои чипы могут быть уже с дохлыми батарейками. В сети есть как восстановить .
Обычно высверливают дохлую и припаивают свежак...
Да и 12887 это с проблемой 2000 , те что 12С887 c добавленным счетчиком веков ...
Chettuser

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

Сообщение Chettuser »

Для чего в папке проекта создаётся файл с именем проекта и расширением .as?
electronik_tver
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн авг 05, 2013 12:18:46

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

Сообщение electronik_tver »

Спасибо добрый человек, а я голова два уха думал че там еще за осциллятор появился, думал пока не нужен мне забью нулями регистры ан нет тутто и ошибся, а уже запущенные часы не собъются если им опять 010 впулить? Не надо проверку делать перед инициализацией?

Про батарейку я в курсе, эти и еще одни подобные достаты из теплосчетчика который еще недавно работал и приговорен по причине утери паспорта и невозможности пройти госповерку, так что с большой вероятностью еще жив литий, вообще они меня привлекли чисто экспериментально, а именно возможностью создавать прерывание и будить спящий мк, наверняка и в других часах это есть но в твери с деталями туго.
сейчас почитаю что там с кодом мне прислал ) еще раз спасибо
Последний раз редактировалось electronik_tver Вс янв 05, 2014 22:50:52, всего редактировалось 1 раз.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

electronik_tver писал(а):Спасибо добрый человек, а я голова два уха думал че там еще за осциллятор появился, думал пока не нужен мне забью нулями регистры ан нет тутто и ошибся, а уже запущенные часы не собъются если им опять 010 впулить? Не надо проверку делать перед инициализацией?



А ХЗ . У меня сейчас живых нет , хотя приобрести не отказался бы .
Сам раритетом балуюсь,
сейчас повторно, после трехлетней консервации , запускаю свой ZX Phoenix
Конечно RTC проще сделать на STM32F0, но уже едет конструктор PROF ПЗУ ...
electronik_tver
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн авг 05, 2013 12:18:46

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

Сообщение electronik_tver »

Заработали часы, неоходим всетаки сs оказался, без него всякий бред читался
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Теперь в железе ...
Chettuser

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

Сообщение Chettuser »

Стырил и что то не могу разобрать код:

Код: Выделить всё

if (RB4&&(Impulse_Lenght<PR2)){}

Из-за этого недолюбливаю Си. :evil:

Допустим RB4&&() - это логическое И ("побайтовое"). А вот как вяжется (Impulse_Lenght<PR2) в выражении if?
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Легко. (Impulse_Lenght<PR2) даёт логический результат (правда или ложь, да или нет). Вот его и подставляем в выражение RB4 && X (где X - результат (Impulse_Lenght<PR2)).
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Своими словами. Условие выполнится, если ("RB4" будет равно единице) И ("Impulse_Lenght" будет меньше "PR2").
iliich
Потрогал лапой паяльник
Сообщения: 318
Зарегистрирован: Вс апр 25, 2010 13:37:02

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

Сообщение iliich »

Здравствуйте извините что так неуместно пишу. Хочу книгу для micro c , на официальном сайте но дорого для студента подскажите мне бы толка синтаксу научится. (и примеры чтоб были)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

iliich писал(а):на официальном сайте но дорого
Бесплатно - это дорого ? Документация к компиляторам всегда идёт в комплекте, либо качается отдельно без всякой платы.

http://www.mikroe.com/eng/downloads/get ... l_v101.pdf
http://www.mikroe.com/eng/downloads/get ... ro_pic.pdf
Читайте на здоровье :)

Там же и примеры можно скачать - http://www.mikroe.com/mikroc/pic/specification/ Тоже бесплатно :)
iliich
Потрогал лапой паяльник
Сообщения: 318
Зарегистрирован: Вс апр 25, 2010 13:37:02

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

Сообщение iliich »

спосибо , я уждумал платние книги скачать :)
iliich
Потрогал лапой паяльник
Сообщения: 318
Зарегистрирован: Вс апр 25, 2010 13:37:02

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

Сообщение iliich »

пишу в microc pro for pic

void main() {

ANSEL = 0x04; // Configure AN2 pin as analog
TRISA = 0xFF; // PORTA is input
ANSELH = 0; // Configure other AN pins as digital I/O
TRISC = 0x3F; // Pins RC7, RC6 are outputs
TRISB = 0; // PORTB is output
do {
temp_res = ADC_Read(2); // Get 10-bit results of AD conversion
PORTB = temp_res; // Send lower 8 bits to PORTB
PORTC = temp_res >> 2; // Send 2 most significant bits to RC7, RC6
} while(1);
}
взял из (http://www.mikroe.com/downloads/get/30/ ... l_v101.pdf) странныца 269
ANSEL, ANSELH выбивает ошыбкый :) почему
iliich
Потрогал лапой паяльник
Сообщения: 318
Зарегистрирован: Вс апр 25, 2010 13:37:02

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

Сообщение iliich »

помогите
никак не выходит как записать if, если на порт продам напрыжение.хочу на порт получил 1

void main()

{

trisa=0x00;
porta=0x00;
portd=0x00;
trisd=0x00;
while (1)
}
if (porta.RA0=1) {
portd=0xff; }
}
Ответить

Вернуться в «PIC»