Чтение данных из памяти микроконтроллера через UART

June 27, 2010 by admin Комментировать »

Теперь займемся процедурами чтения содержимого внешней памяти и осу­ществления установок разрешения-запрещения записи. Естественно, это при­дется делать через компьютер (а куда еще считывать?), и мы используем уже инициализированный нами UART. Нам потребуется реализовать четыре про­цедуры:

? запрет записи во flash;

? разрешение записи во flash;

? чтение содержимого flash;

? обнуление адреса flash, чтобы начать запись с начала.

Добавим в текст программы, в основной цикл (по метке Gcykle, обязательно после команды rcall incom) следующие строки:

cpi temp,OxFO /запись во flash разрешить breq proc_FO

cpi temp,OxFl /запись во flash запретить breq proc_Fl

cpi temp,0xF2 /читать flash breq proc__F2

cpi temp,0xF8 /запись во flash с начала, обнулить адрес breq proc_F8

Посылая соответствующие команды ($F0 и т. д.) с компьютера, мы будем вызывать соответствующую процедуру. Проще всего оформить процедуры разрешения и запрещения:

proc__FO: /F0 запись flash разрешить

rcall EnableFlash rjmp Gcykle

proc_Fl: /Fl запись flash запретить

rcall DisFlash rjmp Gcykle

EnableFlash: cli

/сначала проверяем бит «конец памяти» sbrc Flag,2 rjmp exit_FE

20 Зак. 1191

/проверяем байт разрешения, если нет, пишем его в память ldi ZH,1 /старший RAM ldi ZL,FEnRAM Id tenp,Z cpi temp,$FF breq exit_FA ldi temp,$FF St Z,teiiip

clr ZH /старший EEPR

ldi ZL,FEnEE

rcall WriteEEP

ldi teiiip,$AA /все Ok

rcall out_com sei ret

exit_FA:

ldi temp,$FA /ответ в компьютер – уже разрешен

rcall out_com sei ret

exit__FE:

ldi temp,$FE /ответ в компьютер – конец памяти

rcall out_com sei ret

DisFlash: cli

clr temp

ldi ZH,1 /старший RAM ldi ZL,FEnRAM St Z,temp

clr ZH /старший EEPR ldi ZL,FEnEE rcall WriteEEP

ldi temp,$AA ;ответ в компьютер – все Ок

rcall out_com sei ret

Запрещение/разрешение прерываний здесь приведено для порядка: в основ­ном цикле они уже имеются {см. разд. «Запись констант через UART»\ и их можно исключить. Из полученных процедур мы видим, зачем нам понадо­бился отдельный флаг «конец памяти» — если он установлен, то разрешить запись будет нельзя. Это можно будет сделать только одновременно со сбро­сом адреса, что необратимо, и данные после этого уже прочесть будет невоз­можно. Потому мы сначала займемся их чтением:

proc_F2: ;F2 читать flash

rcall ReadFullFlash rjitp Gcykle

ReadFullFlash: cli

mov YH,AddrH /сохраняем текущий адрес в Y .mov YL,AddrL

clr AddrL /чтение начнем с начала памяти clr AddrH loopRF:

ср AddrL,YL /не дошли ли до текущего срс AddrH,YH

breq end_RF /если дошли, то конец чтения rcall ReadFlash /собственно чтение mov teirp,DATA /данные из DATA в temp rcall out_com /передаем наружу adiw AddrL,1 /следующий адрес rjmp loopRF end_RF:

mov AddrH,YH / восстанавливаем текущий адрес

mov AddrL,YL sei ret

Процедура ота будет долгой, если записан сколько-нибудь существенный кусок в памяти (для передачи 32 кбайт со скоростью 9600 потребуется по­рядка полминуты, да еще и чтение по I2C), и на все это время прерывания будут запрещены. Для нашего измерителя это выльется только в исчезно­вение на это время индикации, но могут быть ситуации, когда следует пре­дотвратить выключение контроллера на такое время — например, чтобы не потерять данные, когда настанет момент очередной записи. В дальнейшем мы учтем этот момент (хотя это, как вы увидите, сильно усложнит про­грамму). А пока нам осталось только описать сброс адреса для записи опять с начала памяти: proc_F8: ;F8 clear address

rcall ClearAddr rjmp Gcykie

ClearAddr:

cli

cbr Flag,4 /обнуляем бит конец памяти clr AddrH /обнуляем адрес, clr AddrL

clr ZH /И записываем его в EEPROM Idi ZL,EaddrL

mov temp,AddrL /можно и просто .clr temp rcall WriteEEP inc ZL

mov temp, AddrH rcall WriteEEP

Idi temp,$AA /ответ в компьютер – все Ok

rcall out_com sei ret

Теперь у нас есть измеритель температуры и давления, который записывает данные во внешнюю память, и эти данные могут быть оттуда прочитаны в любой момент. А нам осталось только объединить измеритель с часами, что­бы можно было задавать точный и достаточно длительный интервал измере­ния. И для этой цели нам также пригодится интерфейс I2C.

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты