AR_AROV писал(а):а реальный пример на С/С++ никто и не показал (((
Интересно, а как Вы тогда смогли вообще программу написать, если не знаете как по счётчику в еепроме её зациклить ?
Что бы зарабатывать на подобном, нужно иметь представление о таких элементарных вещах. Не в обиду, но заказчик, видимо, не зря вам не доверяет...
Если прочтете написанное мною ранее то непременно увидите в одном из моих постов, что счетчик реализован, более того он опробован в действии и работает как надо.
AR_AROV писал(а):Людиии, человекиии!!! Я давно сделал счетчик!!!
Так Вам N-ное кол-во раз уже сказали - "Этого достаточно !". Не будет никто платить тонны баксов на разлочку Вашего залоченого МК с программой, стоимость которой максимум 100$ вместе со всеми исходниками. Заказчик заплатил - пришли и махнули МК на нормальный, и всё.
Все можно найти... было бы желание... AVR106: C functions for reading and writing to Flash memory on tinyAVR and megaAVR devices AVR109: Using Self Programming on tinyAVR and megaAVR devices
Эти app.notes можно найти на сайте атмела: отдельно описание и отдельно примеры. Регистрация не требуется.
— Не говорите мне что делать и я не скажу куда Вам идти...
AR_AROV писал(а):Людиии, человекиии!!! Я давно сделал счетчик!!!
Так Вам N-ное кол-во раз уже сказали - "Этого достаточно !". Не будет никто платить тонны баксов на разлочку Вашего залоченого МК с программой, стоимость которой максимум 100$ вместе со всеми исходниками. Заказчик заплатил - пришли и махнули МК на нормальный, и всё.
Я понял что достаточно... для себя хочу, знание - сила
WriteFlashPage(0x200, testBuffer1); // Writes testbuffer1 to Flash page 2 // Function returns TRUE ReadFlashPage(0x200, testBuffer2); // Reads back Flash page 2 to TestBuffer2 // Function returns TRUE WriteFlashByte(0x204, 0x38); // Writes 0x38 to byte address 0x204 // Same as byte 4 on page 2 // Returns TRUE testChar = ReadFlashByte(0x204); // Reads back value from address 0x204
#ifdef __FLASH_RECOVER FlashBackup.status=0; // Inicate that Flash buffer does // not contain data for writing while(EECR & (1<<EEWE)); LpmReplaceSpm(flashAddr, data); // Fills Flash write buffer WriteBufToFlash(ADR_FLASH_BUFFER); // Writes to Flash recovery buffer FlashBackup.pageNumber = (unsigned int) (pageAdr/PAGESIZE); // Stores page address // data should be written to FlashBackup.status = FLASH_BUFFER_FULL_ID; // Indicates that Flash recovery buffer // contains unwritten data while(EECR & (1<<EEWE)); #endif
#ifdef __FLASH_RECOVER FlashBackup.status = 0; // Indicates that Flash recovery buffer // does not contain unwritten data while(EECR & (1<<EEWE)); #endif
EECR |= eepromInterruptSettings; // Restore EEPROM interrupt mask return TRUE; // Return TRUE if address // valid for writing } else return FALSE; // Return FALSE if address not // valid for writing }
/*! * The function writes data from array dataPage[] to Flash page address * flashStartAdr. The Number of bytes written is depending upon the Flash page * size. Returns FALSE if input argument ucFlashStartAdr is not a valid Flash * page address for writing, else TRUE. **/ unsigned char WriteFlashPage(MyAddressType flashStartAdr, unsigned char *dataPage) { unsigned int index; unsigned char eepromInterruptSettings; if( AddressCheck(flashStartAdr) ){ eepromInterruptSettings = EECR & (1<<EERIE); // Stoes EEPROM interrupt mask EECR &= ~(1<<EERIE); // Disable EEPROM interrupt while(EECR & (1<<EEWE)); // Wait if ongoing EEPROM write
#ifdef __FLASH_RECOVER FlashBackup.status=0; // Inicate that Flash buffer does // not contain data for writing while(EECR & (1<<EEWE)); for(index = 0; index < PAGESIZE; index+=2){ // Fills Flash write buffer _SPM_FILLTEMP(index, (unsigned int)dataPage[index]+((unsigned int)dataPage[index+1] << 8)); } WriteBufToFlash(ADR_FLASH_BUFFER); // Writes to Flash recovery buffer FlashBackup.pageNumber=(unsigned int)(flashStartAdr/PAGESIZE); FlashBackup.status = FLASH_BUFFER_FULL_ID; // Indicates that Flash recovery buffer // contains unwritten data while(EECR & (1<<EEWE)); #endif for(index = 0; index < PAGESIZE; index+=2){ // Fills Flash write buffer _SPM_FILLTEMP(index, (unsigned int)dataPage[index]+((unsigned int)dataPage[index+1] << 8)); } WriteBufToFlash(flashStartAdr); // Writes to Flash #ifdef __FLASH_RECOVER FlashBackup.status=0; // Inicate that Flash buffer does // not contain data for writing while(EECR & (1<<EEWE)); #endif
EECR |= eepromInterruptSettings; // Restore EEPROM interrupt mask return TRUE; // Return TRUE if address // valid for writing } else return FALSE; // Return FALSE if not address not // valid for writing }
вам просто нечего делать в микроконтроллерном мире если Вы не можете загуглить и найти то что для Вас самим производителем сделано положено на видное место и ещё и обвешано указателями!
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
clawham писал(а):ну да а вы в курсе что память программировать может только тот код что находится в секции загрузчика и в фузах эта секцая обозначена как бутлодер?
clawham писал(а):ну да а вы в курсе что память программировать может только тот код что находится в секции загрузчика и в фузах эта секцая обозначена как бутлодер?
Ух-ты! А мой МК-tiny2313 и не в курсе... У него нет бут секции, однако SPM работает. Достаточно выполнять все по ДШ и не забыть бит SELFPRGEN запрограммировать.
— Не говорите мне что делать и я не скажу куда Вам идти...