Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

PIC 16F1824 с DS1307-как се конфигурира?
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=9803
Страница 1 от 2

Автор:  lz2ddl [ Пет Яну 20, 2012 3:47 pm ]
Заглавие:  PIC 16F1824 с DS1307-как се конфигурира?

Здравейте уважаеми съфорумци!
Пиша за първи път, но се опитах да прочета преди това и не успях да намеря нужната информация. :cry:
Ако съм пропуснал нещо, предварително се извинявам.
Та несгодата ми е следната:
Започнах да пиша малка програмка за горния РІС (на MikroPascal). Самото софтче не изпълнява кой знае какви задачи, и със скромния си опит успях да постигна задоволителни резултати, но стигнах до свързването на DS1307 и закъсах. С две думи-не тръгна. Четох описанието на двата чипа и отново не можах да ги подкарам. РІС-а си има хардуерна І2С поддръжка, но явно не мога да го конфигурирам. DS1307 съм свързал с изтеглящи резистори към SDA и SCL изводите първо по 10к, а после по 5к (два по 10к в паралел), и пак не заработи. Пробвах с батерия и без батерия но резултатите са същите. :rolleyes:
Голямата ми молба към вас е едно рамо, ако може, за първоначалното конфигуриране на пика или каквато и да е помощ в тази посока. От самата програма мисля няма да има смисъл да да пускам извадки, защото е на Pscal, както споменах, а вие работитите със С на много професионално ниво. Ползвал съм примери, които са работещи и ми се струва, че няма да са ви полезни.
Още веднъж се извинявам за глупавия ми въпрос и предварително благодаря на отзовалите се!

Автор:  lz2ddl [ Пет Яну 20, 2012 9:18 pm ]
Заглавие:  Re: PIC 16F1824 с DS1307-как се конфигурира?

В допълнение на въпроса ми по-долу ви давам част от сорса, в който съм упоменал конфигурацията на РІС-а. Писал съм и излишни редове, но четейки датасшийта пробвах каквото разбрах. Може да има и безсмислени редове, но до тук ми се простират възможностите.
Принципно, в хелпа на МикроПаскала пише, че след инит-процедурата, SDA и SCL изводите се конфигурират автоматично. Правих тестове с извеждане на звук на едно пиезо-зумерче, като задавах колко време да пищи и колко да не пищи и ми направи впечатление, че интервалите зависеха от тактовата честота на контролечето. Колкото е по-ниска честотата, толкова по-малки са интервалите, въпреки че ползвах процедурата VDelay_Advanced_ms(time_ms, Current_Fosc_kHz: word). Както се вижда, освен времето в милисекунди, се чете и честотата на пика, като съм ползвал процедурата Clock_kHz() (например VDelay_Advanced_ms(700, Clock_kHz); за закъснение от 700мсек.).
Дано това помогне на разбиращите колеги, тъй като аз не мога да разбера какъв е проблема.
Нямам осцилоскоп под ръка и сглобих един, който ползва звуковата карта, но не мога да кажа дали измервам правилно, защото шината SCL е конфигурирана на 100 kHz, а звуковата карта няма как да ги измери.
Дадох примера със звука с пиезо-зумера, защото не мога да разбера в крайна сметка кои 100 kHz са наистина толкова (при тактова честота 4 MHz, 8MHz, 0.5MHz или друга стойност|.
С няколко думи влязох в джаза яко! :|
Силно се надявам на помощ, тъй като видях доста преглеждания на въпроса ми и още веднъж благодаря предварително! :?
П.П. Записите в Епрома съм правил за да проверя дали има някаква комуникация, а процедурата TestRead, съм копирал от уж работещ пример.


PORTA:= 0;
PORTC:= 0;
TRISA:= 0;
TRISC:= 31;
TRISC0_bit:= 1;
TRISC1_bit:= 1;
TRISC2_bit:= 1;
TRISC3_bit:= 1;
TRISC4_bit:= 1;
INLVLC:= 0;
LATC:=0;

SSP1CON1:= 59;
WPUC0_bit:= 1;
WPUC1_bit:= 1;
OPTION_REG.7:= 0;
SSPEN_bit:= 1;
CKP_bit:= 1;
SSP1IE_bit:=1;

I2c1_Init(100000);

procedure TestRead;
var I: byte;
begin
I2c1_Start(); // Issue I2C start signal
I2c1_Wr($D0); // Send I2c Write Slave Address
I2c1_Wr(0); // Send Rtc2 Register Address
I2c1_Repeated_Start(); // Issue I2C repeated start signal
I2c1_Wr($D1); // Send I2c Read Slave Address
for I := 0 to 7 do
begin
if I = 7
then UsVal[I] := I2c1_Rd(0) // no ack: last byte to read
else UsVal[I] := I2c1_Rd(1); // with ack
end;
I2c1_Stop;

EEPROM_Write(0, USVal[0]);
EEPROM_Write(1, USVal[1]);
EEPROM_Write(2, USVal[2]);
EEPROM_Write(3, USVal[3]);
EEPROM_Write(4, USVal[4]);
EEPROM_Write(5, USVal[5]);
EEPROM_Write(6, USVal[6]);
EEPROM_Write(7, USVal[7]);

end;

Автор:  Cekins [ Пет Яну 20, 2012 10:54 pm ]
Заглавие:  Re: PIC 16F1824 с DS1307-как се конфигурира?

Ако си решил да ползваш бейсик за 8 битовите зарежи микробейсика - протона е (лично според мен) поне 10 пъти по добър.

Сега по проблема - първо за да видиш дали ти тръгва коректно I2C-то ще ти трябва скоп. Иначе само ще чуваш изпуквания по време на комуникацията... Осцилатора също се вижда със скоп дали тръгва. Ама DS1307 пък няма да тръгне :)

Или поне докато не му подадеш $00 на адрес $00 :) чети по-внимателно даташита - 7-ми бит на адрес $00 контролира осцилатора и трябва да се запише 0 в него за да тръгне. Досега не съм случвал чип дето да тръгне по дифолт (иначе в даташийта пише че се инициализират в незнайно състояние - би трябвало все някога да се инициализира в 0 - може и аз малко да съм пробвал).

И зарежи микробейсика. Читава версия (с хапче) на протон-а има на www.rutracker.org (Proton IDE) - няма неканени гости в нея.

Автор:  lz2ddl [ Съб Яну 21, 2012 12:54 am ]
Заглавие:  Re: PIC 16F1824 с DS1307-как се конфигурира?

Cekins, благодаря за отговара!
Редактирах предния си пост, като зачервих реда, в който смятам че става това записване на $00 на адрес $00 (до колкото разбирам говориш за СН-бита на нулевия адрес).
Кода е писан на Паскал и споменах, че е изваден едно към едно от работеща програма (поне по думите на човека, който я е писал).

Автор:  Cekins [ Съб Яну 21, 2012 12:31 pm ]
Заглавие:  Re: PIC 16F1824 с DS1307-как се конфигурира?

Ми не - значи схемата е следната :

адрес на дивайса
адрес от паметта
----- за четене : рестарт на и2ц
команда за четене (адреса с read bit set)
четене на клетка

или

адрес на дивайса
адрес на паметта
----- за запис : запис на данните

демек програмат трябва да има нещо от сорта :

I2c1_Start(); // Issue I2C start signal
I2c1_Wr($D0); // Send I2c Write Slave Address
I2c1_Wr(0); // Send Rtc2 Register Address
I2c1_Wr(0); // ей това ще запише вече $00 в адрес $00
I2c1_Stop;

Това трябва да ти е веднъж в програмата за да не ти нулира постоянно секундите, защото в този регистър са и те. Аз лично, след като стартирам програмата си чета две клетки от рам-а на ртц-то в които очаквам да има 0x55 и 0xAA. Ако няма чак тогава нулирам адреса и записвам 0х55 и 0хАА в тия две клетки. Така ако батерията я има те ще си останат такив аи при следващо пускане на процесора ще се прочетат - значи всичко е ок и няма нужда от нулиране. Ако са някакви други си го нулирам и готово.

Автор:  lz2ddl [ Съб Яну 21, 2012 1:15 pm ]
Заглавие:  Re: PIC 16F1824 с DS1307-как се конфигурира?

То се вижда, че май с теб само комуникираме, за което ти благодаря!
Това ще пробвам на момента, само да променя малко кода, че снощи пробвах с една библиотека за софт. I2C и така зарязах всичко. :(
А това за грешната честота на MCU-то дали има нещо вярно или си въобразявам? :cry:

Автор:  lz2ddl [ Съб Яну 21, 2012 1:57 pm ]
Заглавие:  Re: PIC 16F1824 с DS1307-как се конфигурира?

Проверих това:

I2C1_start; // issue I2C start signal
I2C1_wr($D0); // Command RTC write
I2C1_wr(0); // Set pointer to mins/secs
I2C1_Wr(0);
тук пробвах с I2C1_Repeated_Start; и с I2C1_start;

I2C1_wr($D1); // Command RTC read
I2C1_Wr(0);

for I := 0 to 7 do
begin
if I = 7
then UsVal[I] := I2c1_Rd(0) // no ack: last byte to read
else UsVal[I] := I2c1_Rd(1); // with ack
end;

I2C1_Stop;

EEPROM_Write(0, USVal[0]);
EEPROM_Write(1, USVal[1]);


Не излезе нищо. Блокира си програмата и това е. :evil:
Проверих с Repeated_Start, без него и също със I2С1_Start и резултат никакъв. Това малко осмокрако дяволче ме вкара в приключение!
А най-лошото е, че не мога да намеря симулатор за тази ИС и на всяка промяна на една запетайка даже компилирам, товаря на ПИК-а, навирам го в цокъла на пробната платка, пускам, псувам и пак отначало.

Автор:  head_up [ Съб Яну 21, 2012 4:27 pm ]
Заглавие:  Re: PIC 16F1824 с DS1307-как се конфигурира?

lz2ddl написа:
на всяка промяна на една запетайка даже компилирам, товаря на ПИК-а, навирам го в цокъла на пробната платка, пускам, псувам и пак отначало.


Добре дошъл в клуба :mrgreen: Гадничко е, но така се прави с тия дървета ...

Автор:  lz2ddl [ Съб Яну 21, 2012 4:45 pm ]
Заглавие:  Re: PIC 16F1824 с DS1307-как се конфигурира?

То си така, ама срещу дърво като има друго, става гора и освен за тачки за друго не стават.
Пък и моята детска мечта определено не е да се ядосвам с точно тези гадове, ама "пък мий убаво бе!"
Ще продължавам да ги мачкам, дано има напредък.
Между другото в момента слушам една песен на Accept - Balls to the Wall и си я представям във вариант "PICs to the Wall" :finga: и да ги гърмя с помпата като капачки на стрелбище.
Но май се поувлякох.
Желая на всички, прочели мъките, ми лек и приятен ден!
Аз продължам!

Автор:  CarBeta [ Съб Яну 21, 2012 8:03 pm ]
Заглавие:  Re: PIC 16F1824 с DS1307-как се конфигурира?

SDA и SCL трябва да са конфигурирани като digital I/O. Не виждам да изключваш ADC'то. Поне в кода дето си пуснал.

Автор:  lz2ddl [ Съб Яну 21, 2012 8:22 pm ]
Заглавие:  Re: PIC 16F1824 с DS1307-как се конфигурира?

ADC-не изключвам, защото го ползвам в друга част от софта. Той следи за напрежение през цикъл while(); и т.н.
Освен него ползвам и PWM модула-постоянно, докато работи и ADC-то.
Това дали ще е пречка?
Май ще трябва да направя една постановка за тест на всичко по отделно (в интерс на истината ADC и PWM модулите работят заедно без проблем и за сега си вършат работата както трябва).

Автор:  Cekins [ Съб Яну 21, 2012 8:34 pm ]
Заглавие:  Re: PIC 16F1824 с DS1307-как се конфигурира?

I2C модула ВИНАГИ взема пълен контрол над пиновете - включиш ли го - край с всичко останало дето е там.

Не е проблема в пика, не е и в далас-а.

Имаш ли някакъв вариант за дебъг? Примерно MAX232 закачен към UART-а на пикчето? Някой светодиод някъде?

Ако имаш пиккит2 можеш него да ползваш за UART директно без конвертор на нива.

Автор:  CarBeta [ Съб Яну 21, 2012 9:11 pm ]
Заглавие:  Re: PIC 16F1824 с DS1307-как се конфигурира?

Опитай да коментираш двата реда, с които разрешаваш вътрешните пуллъп, и да остане само с външните резистори.

Автор:  Cekins [ Съб Яну 21, 2012 9:15 pm ]
Заглавие:  Re: PIC 16F1824 с DS1307-как се конфигурира?

Cekins написа:
I2C модула ВИНАГИ взема пълен контрол над пиновете - включиш ли го - край с всичко останало дето е там.


Ама като казвам пълен имам предвид 101% пълен - нито пулъпи, нито ацп-та, нищо ...

Сега.... Напиши една програмка дето само да запише нулата в нулевия регистър и 0x10 в адрес 0х07. След това с един светодиод на sqw изхода на ds1307 (с минуса към чипа и с по големичък резистор че да не го пратиш във вечните силиконови полета) виж дали ще почне да мига.

Автор:  lz2ddl [ Съб Яну 21, 2012 9:22 pm ]
Заглавие:  Re: PIC 16F1824 с DS1307-как се конфигурира?

Това с пулъпите съм го правил и няма резултат.
Имам пиккит2 на Сириус (този: http://www.sirius-pcb.com/index.php?mod ... g&show=127) но не знам става ли за дебъг и ако да-как?
Може би това става с MPLAB-а а аз съм на МикроПаскал (сръбска измишльотина).
А индикация за работа ползвам една процедура за извеждане на единица на един пин от А-регистъра, към който през транзистор включвам зумер.
Това ми трябва за готовото устройсво. А между другото точно с тази процедура разбрах, че има проблем с тактовия генератор, защото (както съм описал по-горе) времето за включване на зумера при различните тактови честоти се променя. По-горе във втория ми пост съм описъл.
Сега се заиграх и пуснах една програмка, в която вкарах само I2C процедурите без нищо друго, резултата е същия-няма резултат.
А щом това със 101% процента става, не трябва ли след като си свърши работата І2С модула, да освободи поне 90% за свършване на останалата работа?

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/