Отговори на тема  [ 24 мнения ]  Отиди на страница Предишна  1, 2
PIC 16F1824 с DS1307-как се конфигурира? 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: PIC 16F1824 с DS1307-как се конфигурира?
Честотата трябва да я зададеш в project settings май беше за да може да ти смята после вярно delay-те. И все пак тази настройка трябва да отговаря на действотелната честота. Но няма никакво значение на каква честота ще е чипа за и2ц-то. Или ще е бързо или бавно ама ще работи.


Съб Яну 21, 2012 9:33 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Вто Юли 06, 2010 5:17 pm
Мнения: 12
Местоположение: Велико Търново
Мнение Re: PIC 16F1824 с DS1307-как се конфигурира?
Това е рузултата от последното неработещо нещо :evil: :
program Test_16F1824;

// Software I2C connections
var Soft_I2C_Scl : sbit at RC0_bit;
Soft_I2C_Sda : sbit at RC1_bit;
Soft_I2C_Scl_Direction : sbit at TRISC0_bit;
Soft_I2C_Sda_Direction : sbit at TRISC1_bit;
// End Software I2C connections

var USVal: array[20] of byte;
var b, I : byte;

procedure Beep_Sound(Beep_Num : byte);
begin
for b:= 1 to Beep_Num do
begin
RA4_bit:= 1;
VDelay_Advanced_ms(70, Clock_kHz);
RA4_bit:= 0;
VDelay_Advanced_ms(80, Clock_kHz);
end;
end;

procedure First;
begin
Beep_Sound(1);

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_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;

VDelay_Advanced_ms(10, Clock_kHz);

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(8, 1);

Beep_Sound(2);
end;

procedure Second;
begin

Soft_I2C_Start(); // Issue start signal
Soft_I2C_Write(0xD0);
Soft_I2C_Write(0);
Soft_I2C_Write(0);
Soft_I2C_Start(); // Issue repeated start signal

Soft_I2C_Write(0xD1); // Address PCF8583 for reading R/W=1


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

Soft_I2C_Stop(); // Issue stop signal

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]);

Beep_Sound(2);
end;


procedure Init_main;
begin
PORTA:= 0;
PORTC:= 0;
TRISA:= 0;
TRISC0_bit:= 0;
TRISC1_bit:= 0;
INLVLC:= 3;
LATC:= 3;

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

VDelay_Advanced_ms(1000, Clock_kHz);

Soft_I2C_Init;
Soft_I2C_Start;
Soft_I2C_Write($D0);
Soft_I2C_Write(0);
Soft_I2C_Write(0);
Soft_I2C_Stop;

{I2C1_init(100000); // initialize I2C module 100 kHz clk, full master mode
I2C1_start; // issue I2C start signal
I2C1_wr($D0); // write to RTC
I2C1_wr(0); // set pointer to 0
I2C1_wr(0); // send data (data to be written)
I2C1_stop;}

end;

begin
Init_main;

while(TRUE) do
begin
// First;
Second;
end;
end.

Като гледам ще намразя и Филипс и Майкрочип и т.н.
Сега може би е добре да пийна някоя ракийка и да почна от началото! :x
А между другото тук се вижда процедурката за която става въпрос. Задал съм по 70 и 80 мсек. за вкл./изкл. на зумера и при различните честоти това време е различно. А пък в даташийта на DS-са пише че трябва да работи на 100 кHz, знам ли!?
Май пак ще се почва с четенето от начало до край и безброй проби-грешки.

П.П. То е**ти темата стана! 8O


Съб Яну 21, 2012 11:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: PIC 16F1824 с DS1307-как се конфигурира?
Ами много ясно, че като задаваш различна честота в проекта ще ти излиза различен резултат :)

Примерно : чипа работи на 4 а ти казваш на компилатора че е на 8. Искаш дилей от 1мс. той смята че трябва да направи 100 ноп-а. Е прави 100 ноп-а ама те отнемат двойно повече време (на 4 мхз). И така дилея става 2мс. Същото става и с I2C-то - има един регистър в който се задава честотата на клока. Логично е компилатора да го сметне и да го плясне като константа. Е този компилатор не го прави така - има някаква дебела функция get_fosc или нещо от сорта. Но това няма значение в случая.

На микроелектроника библиотеките за I2C, доколкото съм имал досег с тях, са леко куци. На хардуерно I2C умира ако не чуе ack от дивайса който вика - демек ако го няма там или не отговаря по някаква причина - муерте.


Ще ти опиша пак възможните последователности. Явно не ти се е изяснило как работи I2C-то.

за запис :
Start
Write 7bit + Write (bit 0 clear)
write 8 bit adress
Write 8 bit data
.... - в зависимост от дивайса може да се пише до края на страницата или както е при еепромите по 16 байта
write 8 bit data
Stop

За четене :
Start
Write 7bit device address + Write (bit 0 clear)
write 8 bit adress
Restart
Write 7bit device address + Read (bit 0 set)
Read 8 bit data
ack
...
Read 8 bit data
noack
Stop

или четене от адреса на който е дивайса

Start
Write 7bit device address + Read (bit 0 set)
Read 8 bit data
ack
....
Read 8 bit data
noack
stop

След запис задължително трябва или стоп...старт или рестарт за да може да се чете. И задължително се изпълнява целия сикуънс за четене, съответно за писане.

Ама и като гледам как си ги омешал софт със хард направо ...
И потретвам вече - I2C модула взема пълен контрол над пиновете - включен ли е модула нищо друго не се признава за двата пина дори не може и да се клатят с Port или Lat регистрите. TRIS-а въобще не го признава.


Съб Яну 21, 2012 11:53 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Вто Юли 06, 2010 5:17 pm
Мнения: 12
Местоположение: Велико Търново
Мнение Re: PIC 16F1824 с DS1307-как се конфигурира?
Cekins, ОГРОМНО Благодаря, за търпението, с което се отнасяш с мен!
Щом не тръгват тези единички по І2С-то значи наистина има нещо.
Дано да е софта.
Може да греша (което си е така), но първо малко прочетох и след като не се справих сам почнах да питам. За карането и повтарянето на това, което се мъчиш да ми набиеш в главата си прав :( , така си е.

В даташийта чета редовете по-долу, и си мисля, че няма честота по дефол, в смисъл ползвам вътрешен осцилатор който стига до 32 MHz. Не ми трябва някаква точност и не се оплаквам за разликата във времената, но при промяна продължителността е много осезаема.

Прикачени файлове:
PIC16F1824.jpg
PIC16F1824.jpg [ 34.42 KiB | Прегледано 1371 пъти ]



След това объркване на софтуерна и нардуерна І2С няма, защото пускам по отделно процедурите First и Second за да проверя дали проблемите идват от ПИК-а или от софта.

По-долу се помъчих да подредя по твоите съвети какво е написано в кода, дано ме разбереш. :? Със син цвят е изричния ти съвет за записите на адрес $00 стойност $00. В описанието на DS-а пише за четене R/W-бита да е 1 и затова адреса става $D1. Следващия цикъл с for... четат данните като if-а слага "0" когато прочете последните данни и "1" за "ack" ако не е последен байт.
Гледайки всичко това си мисля, че съм спазил твоите съвети.


За четене :
Start I2C1_start; // issue I2C start signal
Write 7bit device address + Write (bit 0 clear) I2C1_wr($D0); // Command RTC write
write 8 bit adress I2C1_wr(0); // Set pointer to mins/secs
I2C1_Wr(0);

Restart I2C1_Repeated_Start;
Write 7bit device address + Read (bit 0 set) I2C1_wr($D1); // Command RTC read
Read 8 bit data
ack
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;
...
Read 8 bit data
noack
Stop

За това с пълния контрол усещам, че ме караш да спирам този модул по някакъв начин докато не ми трябва. Ще се опитам, но на тези пинове няма нищо друго, а пък и след като дам стоп, модула не спира ли? Това с TRIS, PORT и LATC съм чел и спазвал каквото са писали в шийтовете, но съм ги изключвал и пак не е имало резултат.
Нощес направих един опит с хелпа на микрото и се втрещих. Взех пример за І2С-комуникация за 16F887 и го пуснах в Real PIC Simulator и не можа да прочете правилно DS-а. По-точно четеше нещо но сметките BCD към извеждане на LCD не бяха както трябва.
Още веднъж ти благодаря, че отделяш време за моето невежество :?
Приятен зимен ден!


Нед Яну 22, 2012 11:54 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: PIC 16F1824 с DS1307-как се конфигурира?
Ами така както си го написал ще запише 0 в адрес 0 и ще започне да чете от адрес 0х01, тъй като поинтера се увеличава с единица автоматично след всяко четене И писане, независимо какво е. С други думи ако искаш да прочетеш секундите, след Restart трябва пак да се подаде 0xD0 0х00 Restart 0xD1 Read.

Включването на модула се осъществява в неговия контрол регистър. Няма нищо общо със Start и Stop къндишъните. Би трябвало компилатора при командата I2C_init да го включи и след това няма кой да го изключи.

Ако ползваш вътрешен осцилатор, то виж в даташийта раздела за Internal Oscilator Module на каква честота тръгва по дифолт. Компилатора от настройката НЕ ТИ СЕТВА РЕГИСТЪРА. Това е причината поради която много ти се променят времената:) Процесора си върви все на една и съща честота, а компилера смята грешно времената. Тази настройка е само за да може той да си смята колко nop-а трябват за даден delay и разни такива времезависими фунции. Доколкото съм запознат с компилаторите на микроелектроника, настройката за I2C си я смята run time и би трябвало да си вземе реалната честота на процесора. Ама това може Relsys да ти го каже, той е по запознат с тях.

Та... пробвай това което ти казах - запиши 0х00 в 0х00 и 0х10 в 0х07. И виж дали ще ти излезе 1Hz импулси на изхода на даласа. Ако това стане значи комуникацията е ок. От там насетне ще го бистрим останалото.


Нед Яну 22, 2012 12:19 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Вто Юли 06, 2010 5:17 pm
Мнения: 12
Местоположение: Велико Търново
Мнение Re: PIC 16F1824 с DS1307-как се конфигурира?
Eто това написах и е без резултат:

I2C1_Init(100000);

I2C1_start; // issue I2C start signal
I2C1_wr($D0); // Command RTC write
I2C1_wr($00); // Set pointer to mins/secs
I2C1_Wr($00); // това е за всеки случай

I2C1_Repeated_Start; // от тук трябва пойнтера да се върне на нула

I2C1_wr($D0); // Command RTC write

for I := 0 to 7 do
begin
UsVal[I] := I2C1_Wr(1); // пиша осем единици и след това прехвърлям прехвърлям наколко в епрома
end;
I2C1_Wr($10); // това би трябвало да включи SQW/OUT на 1 Hz

I2C1_Repeated_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;

VDelay_Advanced_ms(10, Clock_kHz);

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(8, 1);
end;

На SQW/OUT включих през 2,2 кома и 1 ком към маса транзистор и зумерчето. Няма реакция. С този псевдо осцилоскоп към звуковата карта не измерих никаква промяна или импулси.


Нед Яну 22, 2012 2:25 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение Re: PIC 16F1824 с DS1307-как се конфигурира?
Този юнит гледа ли го?
Гледам че е точно за този часовник, с точно този компилатор.


Нед Яну 22, 2012 5:03 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: PIC 16F1824 с DS1307-как се конфигурира?
Еми няма да включи изхода защото при първото писане адреса става 0х01, след още осем (фор-а дето си го написал) отива на 0х08 :) и 0х10 го записваш реално в 0х08 а не в 0х07. А и нещо друго - след старт/рестарт ако ще пише ЗАДЪЛЖИТЕЛНО първо се подава адрес а не байт - слейва го очаква. А ти така при първото писане го пращаш на първи адрес (то по случайност си е там) и за това след 8 писания не ти отива на 9-тия а на 8-мия. С други думи след Write мкоманда първо се подава адрес.

Мичев - той просто бърка последователностите на I2C-то - още не му се е изяснило кое, кога, как :)

На Протона, това му харесвам, че всичко му е в една команда и той сам се оправя със всичките контроли по шината.


Нед Яну 22, 2012 7:51 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Вто Юли 06, 2010 5:17 pm
Мнения: 12
Местоположение: Велико Търново
Мнение Re: PIC 16F1824 с DS1307-как се конфигурира?
От изписаните вече две страници разбрах нещо много важно. Както е казал древен мислител "Аз знам, не нищо не знам."
Малко ще се заровя в теорията и ще понауча каквото трябва, пък дано успея да подкарам тия битчета да вървят както им кажа.
Много благодаря на всички отзовали се и най-вече на Cekins за огромното му търпение и се надявам в близко време да се похваля с добри резултати!


Пон Яну 23, 2012 2:34 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 24 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни