Обратите внимание, что запись во flash разрешена, если байт FEnEE равен $FF, т. е. в самом начале, когда EEPROM еще пуста, запись по умолчанию разрешается. В процедуре обработки данных дописываем процедуры сохранения «сырых» значений температуры и давления по указанным адресам. Они у нас содержатся в регистрах AregH: AregL. В начале обработки данных по температуре, после имеющегося оператора rjmp prs дописываем:

     ldi ZL,Thex ;запоминаем температуру

     st Z+,AregH

     st Z,AregL

А там, где начинается расчет давления, после оператора rjmp contPT записываем:

     ldi ZL,Phex  ;запоминаем давление

     st Z+,AregH

     st Z,AregL

Теперь инициализируем таймер. В загрузочную секцию вместо строк инициализации Timer 0 (ldi temp, (1<) и out TIMSK, temp) добавляем:

;++++++++Set Timer 1

     ldi temp,high(58594)

    out OCR1АН, temp

    ldi temp,low(58594)

    out OCR1AL,temp

    ldi temp,0b01000000

    out TCCR1A,temp  ;переключающий режим для вывода PD5-0C1A

    ldi temp,0b00001101

    out TCCR1B,temp  ;1/1024 очистить после совпадения

    ldi temp, (1< ;разреш. прерывания

    ;по совпадению для Timer 1 и переполнению Timer 0

    out TIMSK,temp

К выводу OC1A (вывод 19 для ATmega8535) можно присоединить светодиод, который будет попеременно гореть и гаснуть с периодом 30 с, показывая, что запись работает.

Далее в секции начальной загрузки инициализируем регистры адреса. Получится довольно сложная процедура (листинг 16.6), которая должна проверять значения адреса в EEPROM, и если он есть (т. е. память не пуста и там не записаны все единицы), то еще и сравнивать его с последним возможным адресом (32767 или 7FFFh).

Листинг 16.6

:=======инициализация адреса flash

       clr ZH  ;старший EEPROM

       ldi ZL,EaddrL  ;младший EEPROM

       rcall ReadEEP

       mov AddrL,temp

       ldi ZL,EaddrH

       rcall ReadEEP

       mov AddrH,temp ;теперь в AddrH:AddrL адрес из EEPROM

       ldi temp,0xFF ;если все FF, то память была пуста

       ср AddrL,temp

       ldi temp,0xFF

       cpc AddrH, temp

       brne cont_1

       clr AddrH  ;если пуста, то присваиваем адрес = 0

       clr AddrL

       clr ZH  ;старший EEPROM

       ldi ZL,EaddrL  ;младший EEPROM

       mov temp,AddrL

       rcall WriteEEP  ;и записываем его опять в EEPROM

       inc ZL

       mov temp,AddrH

       rcall WriteEEP

cont_1:  ;теперь проверку на последний адрес $7FFF

       ldi temp,0xFF

       cp AddrL,temp

       ldi temp,0x7F

       cpc AddrH, temp

       brne cont_2

       sbr Flag,4  ;4 бит регистра Flag = конец памяти

cont_2:  ;загрузка байта разрешения записи flash

       clr ZH  ;старший EEPROM

       ldi ZL,FEnEE

       rcall ReadEEP

       ldi ZH,1  ;старший RAM

       ldi ZL,FEnRAM  ;младший RAM

       st Z,temp  ;сохраняем значение флага

Отдельный бит «конец памяти» в регистре Flag (бит 2, т. е. устанавливается он командой sbr Flag, 4, см. главу 13) нам понадобится позднее, для того, чтобы можно было временно запретить запись во flash внешней командой, не сбрасывая значения адреса и независимо от того, достигнут конец памяти или нет.

Теперь в секции прерываний заменим reti на rjmp TIM1_COMPA в строке для прерывания Timer1 Compare А (шестое сверху, не считая RESET), и напишем его обработчик (листинг 16.7).

Перейти на страницу:

Поиск

Похожие книги