Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прочитать из C содержание Fuses и Lock bits
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Xorval
Требуется прочитать из программы на Си состояние Fuses и Lock bits.
Кристалл - ATtiny13. Среда - IAR.
Пытался описать переменную в функции, так чтобы она попала в R30-R31 (ZL-ZH). Не получается.
Может быть кто-нибудь знает "культурный" способ прочитать Fuses и Lock bits из Си?
И уж заодно - можно ли указать для auto-переменной, в какой регистр я ее хочу поместить?
AndyBig
Фьюзы и лок-биты вообще нельзя прочесть "изнутри", т.е. из прошивки. Только программатором.
Xorval
Цитата(AndyBig @ Jun 11 2006, 00:21) *
Фьюзы и лок-биты вообще нельзя прочесть "изнутри", т.е. из прошивки. Только программатором.

Можно. См. например doc2535.pdf по ATtiny13 стр.100, второй абзац.
It is possible to read both the Fuse and Lock bits from software. To read the Lock bits,
load the Z-pointer with 0x0001 and set the RFLB and SELFPRGEN bits in SPMCSR.
When an LPM instruction is executed within three CPU cycles after the RFLB and
SELFPRGEN bits are set in SPMCSR, the value of the Lock bits will be loaded in the
destination register.
vet
Почему бы и не из ассемблера? чем сишный код культурнее asm-функции? :-/
bmf
для ATMEGA в IAR делал так

#include <inavr.h>

#define _GET_LOCK_BITS() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0001, 0x09 )
#define _GET_LOW_FUSES() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0000, 0x09 )
#define _GET_HIGH_FUSES() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0003, 0x09 )
#define _GET_EXTENDED_FUSES() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0002, 0x09 )
#define _SET_LOCK_BITS(data) __DataToR0ByteToSPMCR_SPM( data, 0x09 )
#define _ENABLE_RWW_SECTION() __DataToR0ByteToSPMCR_SPM( 0x00, 0x11 )

#define _WAIT_FOR_SPM() while( SPMCR_REG & (1<<SPMEN) );

// Read lock bits.
_WAIT_FOR_SPM();
sendchar( _GET_LOCK_BITS() );

// Read fuse bits.
_WAIT_FOR_SPM();
sendchar( _GET_LOW_FUSES() );

// Read high fuse bits.
_WAIT_FOR_SPM();
sendchar( _GET_HIGH_FUSES() );

// Read extended fuse bits.
_WAIT_FOR_SPM();
sendchar( _GET_EXTENDED_FUSES() );
AndyBig
Цитата
Можно. См. например doc2535.pdf

Приношу извинения за поспешную недостоверность smile.gif.
Xorval
Большое спасибо за советы. Совет от Bmf, честно говоря оказался для меня слишком сложным, но навеял вот такую штуку:

char fuses_low_byte, fuses_high_byte;
SPMCSR=9;
fuses_low_byte=*((char __flash *)0); // Read fuses low byte
SPMCSR=9;
fuses_high_byte=*((char __flash *)3); // Read fuses high byte

Оказалось она транслируется IAR-ом как раз в то, что надо, и работает как надо.

Насчет того, чем ассемблер менее культурен, чем Си.
Я же написал "культурно" в кавычках. Имелось в виду так, чтобы компилятор Си был в курсе происходящего. А так - ассемблер конечно не менее культурен. Прошу прощения если посягнул на святое smile.gif .
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.