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
/*!
* The function writes byte data to Flash address flashAddr. Returns FALSE if
* input address is not valid Flash byte address for writing, else TRUE.
**/
unsigned char WriteFlashByte(MyAddressType flashAddr, unsigned char data){
MyAddressType pageAdr;
unsigned char eepromInterruptSettings;
if( AddressCheck( flashAddr & ~(PAGESIZE-1) )){
eepromInterruptSettings= EECR & (1<<EERIE); // Stores EEPROM interrupt mask
EECR &= ~(1<<EERIE); // Disable EEPROM interrupt
while(EECR & (1<<EEWE)); // Wait if ongoing EEPROM write
pageAdr=flashAddr & ~(PAGESIZE-1); // Gets Flash page address from byte address
#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
LpmReplaceSpm(flashAddr, data); // Fills Flash write buffer
WriteBufToFlash(pageAdr); // Writes to Flash
#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 запрограммировать.
— Не говорите мне что делать и я не скажу куда Вам идти...