| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Софтуерно четене на 24Cхx памети-откриване на топлата вода.. http://mcu-bg.com/mcu_site/viewtopic.php?f=14&t=3442 |
Страница 1 от 2 |
| Автор: | Dimitar [ Вто Дек 19, 2006 11:37 pm ] |
| Заглавие: | |
Тактовата честота би трябвало да е ОК и без това с Делфи-то неможеш да изгенерираш по-голяма от колкото може да понесе паметта. По-добре се съсредоточи върху времената на сигналите един спрямо друг. Някъде из архивите трябва да имам код за софтуерно I2C на С за микроконтролер, но то е същото - важното е да схванеш алгоритъма. Като го изнамеря, ще го постна ако мислиш, че ще ти свърши работа. |
|
| Автор: | ToHu [ Сря Дек 20, 2006 9:32 am ] |
| Заглавие: | |
Проблема мможе да се окаже не толкова в делфито, колкото в винбоза, какво плваш за управление на порта, API или компонент, който ползва API? Ако екомпонент едва ли имаш някакви гаранции за времето за изпълнение на фунциите на компонента, а дори и сам да си го правиш през API пак не знам доколко можеш да определиш кое кога и за како време се изпълява. Ако имаш осцилоскоп няма да е лошо да видиш какво излиза, дали нямаш разминаване във продължителностите. |
|
| Автор: | ¶ [ Сря Дек 20, 2006 10:55 am ] |
| Заглавие: | |
Бавната скорост не е проблем, I2C протокола е синхронен протокол, докато високата скорост би объркала паметта, обаче надали ще можеш с Windows и четене/писане през порт, да извадиш повече от 100kHz. Mного удобни за създаване на точни времезакъснения ( ако можем да използваме термина точност в многозадачна операционна система ) са функциите QueryPerformanceFrequency() и QueryPerformanceCounter() от Win32 API. С тях можеш да създаваш времеинтервали от микросекунди. Аз ги използвам в код за Win32 за I/O през паралелния порт. Нямам забележки към тях, работят си коректно ( само, че не използвам Делфи |
|
| Автор: | krasisoft [ Сря Дек 20, 2006 7:09 pm ] |
| Заглавие: | |
ОК. Не знаех, че по-бавната скорост не е проблем...Аз се опитвах да вдигна честотата. Скоростта на четене/запис не ме интересува за сега. Проблема е да я прочета един път. Ето кода, с който се боря вече 2 дена (Той е микс между моя и нещо, което намерих във форума на C++ за LPT, но идеята е същата). Къде бъркам. Грешката е в мене. Как да разбера, че 24С08 въобще приема нещо? Куца комуникацията - или аз не подавам правилната последователност от байтове, или честотата не е синхронизирана(според мен съм ги синхронизирал, ама знае ли човек PC-то на какво мнение е.....С Windows....трудно е да се правят точни предположения...) Махнах кода, защото вече не е актуален и хората се бъркат.....има го постнат по-надолу. [code][/code] |
|
| Автор: | ¶ [ Сря Дек 20, 2006 7:32 pm ] |
| Заглавие: | |
Процедурата на четена на I2C памети е следната: старт сигнал; адресира паметта с нейния I2C адрес; мастера чете акнолидж; запис на адреса в паметта, от който ще се чете; мастера чете акнолидж; повторен старт; адресиране на паметта с нейния I2C адрес, с бит 0 вдигнат, т.е. вече ще се чете; мастера чете акнолидж; четене на един байт; мастер изпраща нот акнолидж, ако ще чете само този байт, в противен случай изпраща акнолидж и се чете следващият байт; генерира се стоп сигнала; Така като гледам кода на Делфи, четеш от произволен адрес, защото нямаш запис на адрес в паметта от който ще четеш, адресираш директно паметта с нейния I2C адрес и четеш. Освен това не четеш акнолиджа, генерираш допълнителния клок за него, но не го четеш, т.е. ако наистина не знаеш на каква скорост работиш, задължително трябва да го четеш, тъй като паметта може на всеки такт да ти сваля клока, т.е. тя нагажда скоростта на мастер устройството според нейната маскимална скорост. Така на една I2C шина могат да се навържат и бавни и бързи устройства, това което е бавно ще накара мастера да се съобрази с него. Вземи си разпиши като блок схема протокола на обмен и ще ти станат ясни нещата. Този протокол е много добре обяснен в дейта-чаршафите на MicroChip-пските I2C памети. |
|
| Автор: | krasisoft [ Чет Дек 21, 2006 5:09 am ] |
| Заглавие: | |
Много благодаря за съветите. Отидох, четох и вече записвам без проблеми на който адрес си искам. Ама за четенето несто не става - паметта малчи и не отговаря нищо. Погледнете процедурата за четене, може би бъркам в протокола на обмен (не пращам това дето трябва). Схемата даже и не се опитва да направи нещо - сякаш на нея не се говори...Какво ли не пробвах вече.... Благодаря предварително. procedure TForm1.ReadBtnClick(Sender: TObject); var Temp : integer; begin i2c_start(); i2c_write($A1); //$A1 Команда : ще четем // i2c_write($00); // Адрес на, от който ще четеме --???? и с тоя ред и без него все същото Temp := i2c_read(True); i2c_stop(); i2c_Delay; end; Ето това е за писане и работи. procedure TForm1.WriteBtnClick(Sender: TObject); begin i2c_start(); i2c_write($A0); //$A0 Команда: ще записваме i2c_write($00); // Адрес, на който ще записваме i2c_write($00); // Данни i2c_write($01); i2c_write($02); i2c_write($03); i2c_stop(); end; |
|
| Автор: | Dimitar [ Чет Дек 21, 2006 6:46 am ] |
| Заглавие: | |
Мисля, че трябва така да бъде: procedure TForm1.ReadBtnClick(Sender: TObject); var Temp : integer; begin i2c_start(); i2c_write($A0); //!!!!!!$A0 Команда : ще записваме адреса от който четем !!!!!!!! i2c_write($00); // Адрес от който ще четеме i2c_start(); // !!!!!Пак стартов бит !!!!! i2c_write($A1); //!!!!!$A1 Командата ще четем е чак тук !!!!! Temp := i2c_read(True); i2c_stop(); i2c_Delay; //-> от това няма нужда, даже можеш всички delay да махнеш от кода end; Ама не съм ти погледнал самата процедура за четене на байта, че ме домързя - пробвай това и ако нестане пак ще погледна |
|
| Автор: | krasisoft [ Чет Дек 21, 2006 7:56 pm ] | |||||||||
| Заглавие: | ||||||||||
Ами за разлика от по-преди - пак нищо. Иначе като махнах i2c_Delay() започна да пише с мълниеносна скорост, но това не е главната цел за момента... Проблема е, че в lpModemStatus винаги имаме 0-сякаш паметта въобще не реагира на това дето и се подава.....HELP. Ето това са процедурите за четене на байт: Благодаря.
|
||||||||||
| Автор: | ¶ [ Пет Дек 22, 2006 10:24 am ] |
| Заглавие: | |
Постни целия I2C код и захрани паметта от външо захранване, докато ти тръгнат нещата. |
|
| Автор: | bobyk [ Пет Дек 22, 2006 11:55 am ] |
| Заглавие: | |
Ами от това което си написал не разбрах прочел ли си даташита на поне няколко памети, при по големите адреса е 2 байта, поне аз такива малки с еднобайтов адрес не съм ползвал. Как разбираш че записа ти е бил успешен, само по ACK? Ако си успял да пишеш сигурно захр на паметта е добре. Успех, пиши какво става. |
|
| Автор: | krasisoft [ Съб Дек 23, 2006 11:03 am ] | |||||||||
| Заглавие: | ||||||||||
Относно 2-байтовия адрес....Ползвам 24С04, която е 512 байта и се адресира като 2 страници от по 256 байта, т.е. еднобайтов адрес за отместаване в страницата е достатъчен. Мерси за мнението. Ето това е целият i2c-код:
|
||||||||||
| Автор: | Predator_MF [ Съб Дек 23, 2006 12:51 pm ] | |||||||||
| Заглавие: | ||||||||||
Съвет - постави функциите за I2C извън класа на TForm-a, или в отделен клас, или без клас. Друг съвет - с тоя sleep(10) ще чакаш цял ден да се изчете паметта, ползвай микросекунден delay, ако се затрудняваш има много примери в нета. И още един съвет докато съм се сетил - 10ms закъснение, за изчитане на 1 байт от паметта ти трябват 150-250ms, за толкова време визуализацията на програмата ти зависва...напиши всички функции за I2C в отделен pas файл, добави един Thread в програмата си, при натискане на бутона караш Thread-а да ти изпълни кода за четене, така няма да прекъсваш визуализацията. А освен това избягвай в такива "low level" изпълнения да ползваш string-а на Delphi, специално в случая с i2c_read говоря, където обръщаш от int в str, после добавяш към друг стринг и накрая пак обръщаш string в integer с някаква функция...можеш доста по елементарно да го напишеш това...примерно:
|
||||||||||
| Автор: | krasisoft [ Съб Дек 23, 2006 5:22 pm ] |
| Заглавие: | |
Мерси за съвета - ше го направя. А това за Sleep(10) - чел си стария код - вече го махнах. Това за thred-a вече е направено, но засега не искам да давам на Виндовс-а да се занимава с нищо друго, а само с моята програмка, защото искам да избегна пращането и обработката на съобщения в това време. Кода още не е оптимизиран - това е работен вариант и там съм писал работи само и само да тръгне. Оптимизациите ги оставям накрая. Не виждам какво ще промени нещата ако изкарам всички процедури извън класа на формата (това ще го направя естествено - накрая ще сложа всичко като готова библиотека за четене на i2c памети за Делфи и ще го постна във форума. Така следващия дето иска да си прави собствена библиотек няма да загуби няколко дена като мене....). Така-а-а на проблема.... Мисля, че грешката е точно в момента когато подготвям COM-порта за приемане на данни.(От схемата се вижда, че като вдигам SDA се вдига и CTS - свързани са на една линия). Та когато чакам данни по CTS аз свалям състоянието на SDA=0. И точно в тоя момент схемата се шашка и млъква. Може би приема някакъв съгнал който я обърква.......или се рестартира....Ще пробвам и с външно захранване...ама щом мога да записвам значи трябва да е добре. Благодаря предварително. |
|
| Автор: | krasisoft [ Пон Дек 25, 2006 10:58 pm ] |
| Заглавие: | |
Значи...сложих външно захранване и се държи доста по-стабилно, но проблема с четенето си остава. Утре ще гледам сигналите с осцилоскоп, че един проятел ще донесе двулъчев. Предполагам, че получава някой пик дето не трябва да го има. Иначе според мен всичко си е ОК вече. |
|
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|