VHEMaster, вы это мне или кому-то из предыдущих сообщений?:)
Потому что хочу научиться.
PORTB&=~(1<<pin); обнуляем битМikа писал(а):И до кучи тогда еще вопрос: как будет правильнее сбрасывать бит? Так (~(1<<0)) или так (0<<1) или второй вариант вообще работать не будет?:)
Я это тому, кому нужна помощьМikа писал(а):VHEMaster, вы это мне или кому-то из предыдущих сообщений?:)
pcb писал(а): PORTB/=(1<<pin); ставим бит
Код: Выделить всё
PORTB|=(1<<pin); //ставим бит Код: Выделить всё
ISR( INT1_vect )
{
GICR=0b00000000; // Запрет прерываний
_delay_ms(250); // Ожидание
LcdWriteData('P'); // Оповещение о том, что прерывание сработало
w=1; // "Включение условия"
}
if (w==1)
{
//Выполняемый код
[b]Было тут[/b]
GIFR=0xb11100000; // Сбрасываем флаги прерываний по
GICR=0b10000000; // Разрешаем прерывания
_delay_ms(500);
[b]w=0;[/b]
}
Код: Выделить всё
GIFR=0xb11100000; // Сбрасываем флаги прерываний Код: Выделить всё
GIFR=0xFF;Это называется "Привет, я Миша и я днище"eess9 писал(а):А что за странная запись?Если вы хотите в 16-ричной системе, то 0xFF, если в двоичной - 0b11111111.Код: Выделить всё
GIFR=0xb11100000; // Сбрасываем флаги прерываний
0xb -??? Странно что компилятор пропустил такое
Если флаг надо сбросить, то надо записатьКод: Выделить всё
GIFR=0xFF;
А чего бы ему не пропустить ? 0xb - это 11 в десятичной. Синтаксис для компилятора вполне адекватный.0xb -??? Странно что компилятор пропустил такое
Ух ты! А я проглядел. Мikа, Вы очень изящно выстрелили себе в ногу.А чего бы ему не пропустить ? 0xb - это 11 в десятичной.
Код: Выделить всё
TCNT1|0x30
Тогда логично было бы добавить строчку типато, что таймер не обнуляется, я помню
Код: Выделить всё
OCR1A+=TIMER_INT_PERIOD;
Код: Выделить всё
\ In segment EEPROM_I, align 1, keep-with-next
11 __eeprom uint8_t eep_OSCCAL=0x40;
\ eep_OSCCAL:
\ 00000000 40 DC8 64
12
13
\ In segment CODE, align 2, keep-with-next
14 int main(void)
\ main:
15 {
16 unsigned char a = 1;
\ 00000000 E001 LDI R16, 1
17
18 eep_OSCCAL=a;
\ 00000002 .... LDI R20, eep_OSCCAL
\ 00000004 .... RCALL __eeput8_8
19 ;
20
21 //Разрешение прерываний
22 __enable_interrupt();
\ 00000006 9478 SEI
23
24 while(1)
\ ??main_0:
\ 00000008 CFFF RJMP ??main_0
25 {
26 ;
27 }
28
29
30 }
Maximum stack usage in bytes:
Function CSTACK RSTACK
-------- ------ ------
main 0 4
Segment part sizes:
Function/Label Bytes
-------------- -----
eep_OSCCAL 1
main 10
10 bytes in segment CODE
1 byte in segment EEPROM_I
10 bytes of CODE memory
1 byte of XDATA memory
Errors: none
Warnings: none
only pure true norwegian blackx 
Неужели разработчики компилятора поленились реализовать такую простейшую функцию? Ведь это пишется в 2 строчки! В чем смысл такого упущения?blackx писал(а):мало верится, что при записи происходит проверка значения
В малом смысле реализации такой проверки. EEPROM обычно используется для хранения каких-то редко изменяемых данных, например, настроек. Причем зачастую эти данные изменяются человеком. В таком режиме ресурс EEPROM чрезвычайно велик, и делать дополнительную защиту от записи уже существующего значения нет смысла.В чем смысл такого упущения?
Нет. А во FLASH вообще стирается страница целиком, даже если меняем только один байт (остальные, естесственно, надо перписывать).Есть ли внутри кристалла аппаратная проверка
А если кто-то безконца тыркает кнопки "погромче-потише", "поярче-потемнее" и т. п., а проц каждый раз пишет в ЭСППЗУ? Так и дотыркаться можно.YS писал(а):EEPROM обычно используется для хранения каких-то редко изменяемых данных, например, настроек.
Так программу в ПЗУ проца никто не обновляет в это время и дело закончится тем, что заряд скорее утечет в памяти прогамм, зато данные в ЭСППЗУ целые будут. Правда кому они будут нужны после этогоYS писал(а):выполняя запись того же значения, мы продлеваем срок его хранения, обновляя утекшую часть заряда
Ну это в памяти программ я так понял. А память данных ЭСППЗУ разве также шьется?YS писал(а):Нет. А во FLASH вообще стирается страница целиком, даже если меняем только один байт (остальные, естесственно, надо перписывать).
Давайте посчитаем. Ресурс EEPROM AVR - 100000 циклов перезаписи. Пускай человек тыкает кнопку раз в секунду по двенадцать часов в день, и при каждом тычке процессор сохраняет измененное значение в память.А если кто-то безконца тыркает кнопки
Где как. У MSP430 так же, только размер сегмента меньше. У AVR побайтно. Но физически и память программ, и память данных используют один принцип - это один и тот же (в смысле технологии) FLASH. Только доступ к ячейкам организован по-разному, и EEPROM заточен под больший ресурс.А память данных ЭСППЗУ разве также шьется?
Ага, я сам так спотыкался.YS, подал идею по поводу переполнение таймера с разанее записанным в него числом, спс
Флаг сбрасывается автоматически при входе в обработчик. Вот если не хочется, чтобы после разрешения прерываний произошел переход в обработчик, тогда перед разрешением его надо сбросить.Поэтому при работе с прерыванием по совпадению счётчика с каким-то числом надо:
Сбросить флаг прерывания
Сбросить счётчик в 0
Разрешить прерывание по совпадению
Код: Выделить всё
typedef struct _NT_TIB {
struct _EXCEPTION_REGISTRATION_RECORD* ExceptionList; // 00h
PVOID StackBase; // 04h
PVOID StackLimit; // 08h
....
struct _NT_TIB *Self; // 18h
} NT_TIB, *PNT_TIB;Код: Выделить всё
#define OFFSET(type, field) ((ULONG_PTR)(&((type *)0)->field))Код: Выделить всё
#define TeStackLimit OFFSET(NT_TIB, StackLimit)Код: Выделить всё
LDR R0,[R2, #+0x08] ; R0 = [R2]->StackLimit, в R2 адрес переменной типа NT_TIBКод: Выделить всё
LDR R0,[R2, #+TeStackLimit]