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

ЕЕПРОМ -ПИК16Ф88-КОНТРОЛНА СУМА ЗА ПРОВЕРКА-КАК СТАВА
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=13709
Страница 1 от 2

Автор:  excitron [ Вто Апр 14, 2015 2:43 pm ]
Заглавие:  ЕЕПРОМ -ПИК16Ф88-КОНТРОЛНА СУМА ЗА ПРОВЕРКА-КАК СТАВА

Здравейте,колеги,търся съвет от вас знаещите във връзка с теоретичното обяснение на изпълнение на такова задание в асемблер за ЕЕПРОМ на пик16ф88.

Понеже програмата ми работи добре ,но искам да се презастраховам от събитие при проблем в ЕЕПРОМ.
Записвам избирателно в едната клетка на ЕЕПРОМ памета десетични числа от 1 до 17,а във следващата клетка от памета записвам константи избирателно от 1 до 6.
При пускане на пика се чете от епрома и се задават посочените константи от всяка клетка,но ако се прецака записа в паметта,искам постоянно да се прави проверка чрез контролна сума и ако не съвпада да приема стойностти по подразбиране,а от там и да започва мигане на светодиод за авария
ВЪПРОС:
Как се прави такава контролна сума. къде се записва такова контролно число .Какво съдържа контролната сума.
Интересувам се от същинския алгоритъм ,а аз програмат ще я напиша(стига разбира се ако няма някъде готов пример,който мога да разгледам )

Автор:  Wise [ Вто Апр 14, 2015 3:24 pm ]
Заглавие:  Re: ЕЕПРОМ -ПИК16Ф88-КОНТРОЛНА СУМА ЗА ПРОВЕРКА-КАК СТАВА

Ами най-разпространено е CRC / CRC8,CRC16,CRC32/ Гуглето ще ти каже как се прави.
2 байта CRC16 си е достатъчно сигурно

Автор:  ike [ Вто Апр 14, 2015 3:30 pm ]
Заглавие:  Re: ЕЕПРОМ -ПИК16Ф88-КОНТРОЛНА СУМА ЗА ПРОВЕРКА-КАК СТАВА

Обаче гълта доста рам и флаш, а 16ф88 няма чак толкова много.
Може с xor. Например ако имаш 8 баита, xor ги висичките и резултата го слагаш в 9тия байт на ЕЕПРОМа.

Автор:  excitron [ Вто Апр 14, 2015 3:30 pm ]
Заглавие:  Re: ЕЕПРОМ -ПИК16Ф88-КОНТРОЛНА СУМА ЗА ПРОВЕРКА-КАК СТАВА

Търся на асемблер, ако имате предложения .Кога се пуска такава проверка .
Записването се извършва в еепрома на пика само когато се влезе чрез бутон за настроика на нови константи ,през другото време само и единствено се чете .След пускане на на пика ,с нормално ресетване (без чип) прочитам еепрома.
Може ли да се згафи положението когато само се чете .Устройството работи в автомобил.
Ще има само едно реле,което ще се опоределя дали да бъде постоянно включено без да с екомутира през процеса на използването на устройството,то се включва или не, само от първоначалното прочитане на еепрома.
Кога може да се обърка нещо по принцип.След като четем само и единствено .След монтажа на устройството и първоначална настройка ,после вече не се изисква никакво записване,Само и единствено при всяко пускане четем ..Затова ако има нещо по простичко алгоритъмче,не говориме за прецизни неща.Просто ще приеме първоначалана тстойност и ще мига светодиод за авария.

Автор:  timt [ Вто Апр 14, 2015 5:59 pm ]
Заглавие:  Re: ЕЕПРОМ -ПИК16Ф88-КОНТРОЛНА СУМА ЗА ПРОВЕРКА-КАК СТАВА

Когато се прочете кода от ЕЕПРОМ-а се дава старт на твоят алгоритъм а когато се прекъсне захранването например се зарежда наново кода ти. Няма място за притеснение. Само не го пускай постоянно да си търси кода от ЕЕПРОМ-а а само при промяна и старт. (примерно)

Автор:  ToHu [ Вто Апр 14, 2015 6:13 pm ]
Заглавие:  Re: ЕЕПРОМ -ПИК16Ф88-КОНТРОЛНА СУМА ЗА ПРОВЕРКА-КАК СТАВА

Ммм зависи каква надежност търсиш, за 7 к файл вероятността да се получат случайни грешки които да не ги детектне алгоритъма е сравнително малка, но я има. Примерно в определени индусстрии където е задължително да си проверяваш файловете както и да репортваш чексума CRC32 е недопустимо дори и за такива малки файлове, ако е просто за да си сигурен, мисля че ще ти е ОК, ако гониш стандарт, виж какво иска стандарта.

Автор:  excitron [ Вто Апр 14, 2015 7:20 pm ]
Заглавие:  Re: ЕЕПРОМ -ПИК16Ф88-КОНТРОЛНА СУМА ЗА ПРОВЕРКА-КАК СТАВА

Значи устройството при монтажа в автомобила се програмира за първи път ,след което всеки път при захранването му се чете ЕЕПРОМА и се настройва според зададените константи ,и така всеки път след рестарт чете само при пускането, и в процеса на работа няма никакво вземане даване с еепрома.Т.е. ако не що се е объркало собственика ще го усети при ненормалната работа и още при подаване на захранване се индицира с мигане нчколко път ина жълт диод ,а пък при нормално изпълннение с последователно светване на червен и зелен диод.
Малка част от програмата за четенето в началото : CIKAL_MIGANE_1 приема D'1' do D'17'; CHANGE_1 πριεμα D'1' do D'6'
EEPROM
MOVLW 0x2101
MOVWF REEADR ;In:F(REEADR)
CALL READE
MOVWF CIKAL_MIGANE_1


MOVLW 0x2102
MOVWF REEADR ;In:F(REEADR)
CALL READE

MOVWF CHANGE_1

Мога ли да ги записвам при настройката от бутона ми за програмирането например CIKAL_MIGANE_1 на две места в еепрома и CHANGE_CD_1 пак на две места ,а при нормална работа след стартирането да ги чета тези дублирани данни на на различните им адреси и след разлика между тях да алармирам за грешен код,или пък АКО ТРЯБВА ДА ЗАПИСВАМ ЕДНИ И СЪЩИ ДАННИ НА ТРИ РАЗЛИЧНИ АДРЕСА ,КАТО ТОГАВА ПРИ ЧЕТЕНЕ ЧЕТА ОТ ЕЕПРОМА ТРИ РАЗЛИЧНИ адреса с една и съща информация и дори само една от тях да е различна ,щом другите два адреса се препокриват еднакво да приемаме точно това за вярното.
EEPROM
MOVLW 0x2101
MOVWF REEADR ;In:F(REEADR)
CALL READE
MOVWF CIKAL_MIGANE_1

EEPROM
MOVLW 0Х21ХХ
MOVWF REEADR ;In:F(REEADR)
CALL READE
MOVWF CIKAL_MIGANE_12

EEPROM
MOVLW 0x21ХХ
MOVWF REEADR ;In:F(REEADR)
CALL READE
MOVWF CIKAL_MIGANE_13
И после да създам алгоритъм за тези 3 те : CIKAL_MIGANE_1, CIKAL_MIGANE_12 , CIKAL_MIGANE_13 като по нормално са еднакви по стойност и ги сръвнявам всеки път в началото...Какво мислите за този мой прост алгоритъм ...Все пак не е добре ако се налага от време на време да се влиза в програмиращ режим-няма да има лесен достъп до устройството

Автор:  timt [ Вто Апр 14, 2015 8:12 pm ]
Заглавие:  Re: ЕЕПРОМ -ПИК16Ф88-КОНТРОЛНА СУМА ЗА ПРОВЕРКА-КАК СТАВА

Няма никакъв смисъл освен ако не искаш да ползват даденото устройство различни потребители с различна идентификация както го има в повечето съвременни автомобили.
Няма как да си загубиш прочетеното от ЕЕПРОМ-а освен ако не ти работи програмата коректно. От този чип не очаквай чудеса но за твоята работа си е супер.
След промяна на кода пак повтаряш:
COD_1
MOVLW 0x2101
MOVWF REEADR ;In:F(REEADR)
CALL READE
MOVWF CIKAL_MIGANE_1
Примерно, приeма веднъж кода и затваря релето и го набутваш в спящ режим освен ако не искаш да го програмираш с нов код. Така релето ще е включено а при пускане ще е изключено докато не се идентифицира.
Варианти много.

Автор:  Н'бабане Гт'муан'га [ Вто Апр 14, 2015 11:03 pm ]
Заглавие:  Re: ЕЕПРОМ -ПИК16Ф88-КОНТРОЛНА СУМА ЗА ПРОВЕРКА-КАК СТАВА

Ето ти тествана стандартна CRC8 функция, която не ползва много флаш нито пък много рам.

Код:
uint8_t crc8(uint8_t *block, uint16_t length) {
    uint8_t b, xcrc=0;
    uint16_t t;
    for (t=0; t<length; t++) {
        xcrc^=block[t];
        for (b=0; b<8; b++) if (xcrc&1) xcrc=(xcrc>>1)^0x8c; else xcrc>>=1;
    }
    return(xcrc);
}

Автор:  excitron [ Сря Апр 15, 2015 8:14 am ]
Заглавие:  Re: ЕЕПРОМ -ПИК16Ф88-КОНТРОЛНА СУМА ЗА ПРОВЕРКА-КАК СТАВА

Значи разбрах,че не е нужно такава пловерка в моя случай, но предриема ли ще ползвам срс8.Затова има ли вариант да го плати някой в асемблер код Дори може готова примерна програма.

Автор:  ToHu [ Сря Апр 15, 2015 11:11 pm ]
Заглавие:  Re: ЕЕПРОМ -ПИК16Ф88-КОНТРОЛНА СУМА ЗА ПРОВЕРКА-КАК СТАВА

ами не съм сигурен че CRC8 ще върши работа ако се очаква че е възможно да се счупи, при CRC8 редовно ми се е случвало да не открива по сериозно счупени данни. Зависи колко битови са ти данните, ако са 8 битови вместо да правиш CRC просто ги пиши по два пъти, ако са по големи вече има смисъл от CRC но отново за 32 битови данни CRC8 не е много надеждно, камо ли за по дълги. То и двойното записване не е гаранция, аз съм виждал грешка и при тройно записване, даже съм го виждал два пъти, т.е. и трите записа да са счупени по един и същ начин, какъв е шанса сигурно и сам можеш да сметнеш но се е случвало.

Автор:  Cekins [ Чет Апр 16, 2015 8:23 am ]
Заглавие:  Re: ЕЕПРОМ -ПИК16Ф88-КОНТРОЛНА СУМА ЗА ПРОВЕРКА-КАК СТАВА

Специално при пик-четата единствения проблем за който знам е следния - когато влезе в brownout ситуация PC брояча може да скочи на случайно място. Когато това случайно място се окаже поредицата за запис, се записват неясни(случайни) данни в еепрома. Понеже обикновенно този участък е функция която се вика от някъде с параметри адрес и данни, а влизайки там случайно, адреса е последния от който си чел, там и се записват глупостите. В интерес на истина изглежда много отнесено като обяснение - такова е и обяснението от микрочип и най-интересното е че се случва. На мен ми се е случвало и решението пак според микрочип е : винаги след достъп до еепром, адреса (EEADR) да се сетва на адрес който не се ползва. Естествено включването на BOR си е задължително - така ще се избегне като цяло подобен ефект с подскачане случайно по програмата. В крайна сметка от как почнаха да правя това с адреса, повече не съм имал случай на скапани данни.

Правил съм и записване всеки път в различна клетка(циклично). Ама сега въобще не помня как го бях реализирал да пише равномерно в целия еепром и как точно беше номера да знае точно кой запис е последния.

Автор:  ToHu [ Чет Апр 16, 2015 11:11 am ]
Заглавие:  Re: ЕЕПРОМ -ПИК16Ф88-КОНТРОЛНА СУМА ЗА ПРОВЕРКА-КАК СТАВА

Това за което аз споменавам се е случвало на съвсем различна архитектура, не е резултат на случайността а на съвсем умишлени действия, но индиректни, разбирай смущения някои от тях водещи може би до рестарт на проца.

Автор:  mitko_el [ Чет Апр 16, 2015 1:22 pm ]
Заглавие:  Re: ЕЕПРОМ -ПИК16Ф88-КОНТРОЛНА СУМА ЗА ПРОВЕРКА-КАК СТАВА

ike написа:
...Може с xor. Например ако имаш 8 баита, xor ги висичките и резултата го слагаш в 9тия байт на ЕЕПРОМа.


Това с xor съм го правил , и съм го "счупвал" , в смисъл сумата е ок , ама байтовете не са... Та втора осигуровка , сумирал съм всички байтове , и квото се получи като 8 бит накрая , пиша в клетка...

Автор:  Н'бабане Гт'муан'га [ Чет Апр 16, 2015 1:45 pm ]
Заглавие:  Re: ЕЕПРОМ -ПИК16Ф88-КОНТРОЛНА СУМА ЗА ПРОВЕРКА-КАК СТАВА

Ето и функция за стандартно CRC16, но тя си заема повечко място в паметта.

Код:
uint16_t crc16(uint16_t seed, uint16_t length, uint8_t *block) {
    const uint16_t tCRC16[256] = {
        0x0000, 0xc1c0, 0x81c1, 0x4001, 0x01c3, 0xc003, 0x8002, 0x41c2, 0x01c6, 0xc006, 0x8007, 0x41c7, 0x0005, 0xc1c5, 0x81c4, 0x4004,
        0x01cc, 0xc00c, 0x800d, 0x41cd, 0x000f, 0xc1cf, 0x81ce, 0x400e, 0x000a, 0xc1ca, 0x81cb, 0x400b, 0x01c9, 0xc009, 0x8008, 0x41c8,
        0x01d8, 0xc018, 0x8019, 0x41d9, 0x001b, 0xc1db, 0x81da, 0x401a, 0x001e, 0xc1de, 0x81df, 0x401f, 0x01dd, 0xc01d, 0x801c, 0x41dc,
        0x0014, 0xc1d4, 0x81d5, 0x4015, 0x01d7, 0xc017, 0x8016, 0x41d6, 0x01d2, 0xc012, 0x8013, 0x41d3, 0x0011, 0xc1d1, 0x81d0, 0x4010,
        0x01f0, 0xc030, 0x8031, 0x41f1, 0x0033, 0xc1f3, 0x81f2, 0x4032, 0x0036, 0xc1f6, 0x81f7, 0x4037, 0x01f5, 0xc035, 0x8034, 0x41f4,
        0x003c, 0xc1fc, 0x81fd, 0x403d, 0x01ff, 0xc03f, 0x803e, 0x41fe, 0x01fa, 0xc03a, 0x803b, 0x41fb, 0x0039, 0xc1f9, 0x81f8, 0x4038,
        0x0028, 0xc1e8, 0x81e9, 0x4029, 0x01eb, 0xc02b, 0x802a, 0x41ea, 0x01ee, 0xc02e, 0x802f, 0x41ef, 0x002d, 0xc1ed, 0x81ec, 0x402c,
        0x01e4, 0xc024, 0x8025, 0x41e5, 0x0027, 0xc1e7, 0x81e6, 0x4026, 0x0022, 0xc1e2, 0x81e3, 0x4023, 0x01e1, 0xc021, 0x8020, 0x41e0,
        0x01a0, 0xc060, 0x8061, 0x41a1, 0x0063, 0xc1a3, 0x81a2, 0x4062, 0x0066, 0xc1a6, 0x81a7, 0x4067, 0x01a5, 0xc065, 0x8064, 0x41a4,
        0x006c, 0xc1ac, 0x81ad, 0x406d, 0x01af, 0xc06f, 0x806e, 0x41ae, 0x01aa, 0xc06a, 0x806b, 0x41ab, 0x0069, 0xc1a9, 0x81a8, 0x4068,
        0x0078, 0xc1b8, 0x81b9, 0x4079, 0x01bb, 0xc07b, 0x807a, 0x41ba, 0x01be, 0xc07e, 0x807f, 0x41bf, 0x007d, 0xc1bd, 0x81bc, 0x407c,
        0x01b4, 0xc074, 0x8075, 0x41b5, 0x0077, 0xc1b7, 0x81b6, 0x4076, 0x0072, 0xc1b2, 0x81b3, 0x4073, 0x01b1, 0xc071, 0x8070, 0x41b0,
        0x0050, 0xc190, 0x8191, 0x4051, 0x0193, 0xc053, 0x8052, 0x4192, 0x0196, 0xc056, 0x8057, 0x4197, 0x0055, 0xc195, 0x8194, 0x4054,
        0x019c, 0xc05c, 0x805d, 0x419d, 0x005f, 0xc19f, 0x819e, 0x405e, 0x005a, 0xc19a, 0x819b, 0x405b, 0x0199, 0xc059, 0x8058, 0x4198,
        0x0188, 0xc048, 0x8049, 0x4189, 0x004b, 0xc18b, 0x818a, 0x404a, 0x004e, 0xc18e, 0x818f, 0x404f, 0x018d, 0xc04d, 0x804c, 0x418c,
        0x0044, 0xc184, 0x8185, 0x4045, 0x0187, 0xc047, 0x8046, 0x4186, 0x0182, 0xc042, 0x8043, 0x4183, 0x0041, 0xc181, 0x8180, 0x4040
    };
    uint16_t xcrc16=seed;
    for (uint16_t t=0; t<length; t++) {
        uint16_t x=tCRC16[0xff&(xcrc16^block[t])];
        xcrc16=((xcrc16^x)>>8)|(x<<8);
    }
    return(xcrc16);
}

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