Не совсем в тему, но вот рабочая прогр для PIC
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Proba 15 декабря 2003 г. 14:19
В ответ на: Подскажите как подключить Флеш AT49F001 к микроконтроллеру ADuC812 и есть ли какието особенности перезаписи данных в Флеш. отправлено AlCher 15 декабря 2003 г. 13:41

; Для платы PIC16F877 49F0001
; Кварц 20 Мгц
; Запись и стирание AT49F001 работают + Data Polling is working!
; резисторы в линиях 6 и 7 порта Б требуют обязательно задержки!!!
; Т.к. DataPolling используется, то это не позволяет записать в уже записанное место
; т.к. считанный байт не будет равен записываемому (за исключением когда на место 1 пишутся 0)

; Приращение адреса идет только младшим байтом, предел памяти 256,
; поэтому при попытке записи повторной в 0-ую ячейку, data polling зацикливается НАВСЕГДА!
; **********************************************************************
; Запись wdataf во FLASH по адресу wadrfh wadrfl
; **********************************************************************
;
; На выходе оставляет все линии управления HIGH и PORTB - на ввод
write
bsf _OE
call set_portb_out

movlw 0x55
movwf FADRH
movwf FADRL
bcf _WE ; защелкнули адрес 5555h
bcf _CE
movlw 0xAA
movwf FDATA ; вывели в порт B
bsf _CE
bsf _WE ; защелкнули данные AAh

movlw 0x2A
movwf FADRH
movlw 0xAA
movwf FADRL
bcf _WE ; защелкнули адрес 2AAAh
bcf _CE
movlw 0x55
movwf FDATA ; вывели в порт B
bsf _CE
bsf _WE ; защелкнули данные 55h

movlw 0x55
movwf FADRH
movwf FADRL
bcf _WE ; защелкнули адрес 5555h
bcf _CE
movlw 0xA0
movwf FDATA ; вывели в порт B
bsf _CE
bsf _WE ; защелкнули данные A0h

movff wadrfl,FADRL
movff wadrfh,FADRH
bcf _WE ; защелкнули адрес записи
bcf _CE
movff wdataf,FDATA ; вывели данные в порт B
bsf _CE
bsf _WE ; защелкнули данные

call set_portb_in

d_polling
bcf _CE ; выбрали микросхему
bcf _OE ; разрешили выход
; !!! Важно т.к. по линиям стоят 5К резисторы, то
; без этой задержки не работает
goto $+1
goto $+1
movf FDATA,w
bsf _OE
bsf _CE

subwf wdataf,w ; wdataf(записанный байт) - W(считанный байт)
sz ; мы получили истинный байт (бит в 7 разр!)
goto d_polling ; не совпадают
; запись завершена!
return

; **********************************************************************
; ПОЛНОЕ СТИРАНИЕ ВСЕЙ FLASH
; **********************************************************************

fclear
bsf _OE
call set_portb_out
; 1
movlw 0x55
movwf FADRH
movwf FADRL
bcf _WE ; защелкнули адрес 5555h
bcf _CE
movlw 0xAA ; защелкнули данные AAh
movwf FDATA
bsf _CE
bsf _WE
; 2
movlw 0x2A
movwf FADRH
movlw 0xAA
movwf FADRL
bcf _WE ; защелкнули адрес 2AAAh
bcf _CE
movlw 0x55 ; защелкнули данные 55h
movwf FDATA
bsf _CE
bsf _WE
; 3
movlw 0x55
movwf FADRH
movwf FADRL
bcf _WE ; защелкнули адрес 5555h
bcf _CE
movlw 0x80 ; защелкнули данные 80h
movwf FDATA
bsf _CE
bsf _WE
; 4
movlw 0x55
movwf FADRH
movwf FADRL
bcf _WE ; защелкнули адрес 5555h
bcf _CE
movlw 0xAA ; защелкнули данные AAh
movwf FDATA
bsf _CE
bsf _WE
; 5
movlw 0x2A
movwf FADRH
movlw 0xAA
movwf FADRL
bcf _WE ; защелкнули адрес 2AAAh
bcf _CE
movlw 0x55 ; защелкнули данные 55h
movwf FDATA
bsf _CE
bsf _WE
; 6
movlw 0x55
movwf FADRH
movwf FADRL
bcf _WE ; защелкнули адрес 2AAAh
bcf _CE
movlw 0x10 ; защелкнули данные 10h
movwf FDATA
bsf _CE
bsf _WE

; Data Polling - TOGGLE BIT 6
;
bsf STATUS,RP0 ; страница 1
movlw b'11111111' ; установка PORTB на ввод
movwf PORTB
bcf STATUS,RP0 ; страница 0

clrf rab2
d_toggle
bcf _CE ; выбрали микросхему
bcf _OE ; разрешили выход
; !!! Важно т.к. по линиям стоят 5К резисторы, то
; без этой задержки не работает
goto $+1
goto $+1
movff FDATA,rab1
bsf _OE
bsf _CE
; если бит переключается, то rab2 будет то +1, то -1
; т.е. значание не будет значительно изменятся (0,1 или 255)
; Если бит 6 стабилен, то rab2 будет изменяться в одну сторону
; и через 127 циклов достигнет 5F
btfss rab1,6
goto decr2
incf rab2,f
goto middle
decr2
decf rab2,f
middle
movlw 5F ; середина между 0 и 255
subwf rab2,w ; Текущее значение - W(255)
sz ;
goto d_toggle
return


; **********************************************************************
; Вывод 256 байт содержимого FLASH на ЭКРАН в двоичном виде
; **********************************************************************

printf_dig
call set_portb_in
bpzu

btfsc _dip2 ; перевод строки можно отключить
call enter ; с новой строки

btfss _dip1
goto bnoadr ; не отображать адрес

movff adrfl, L_byte ; for BCD conversion
movff adrfh, H_byte ; The 16 bit binary adress = 0000
call print_adr
movlw ' '
call transmit
movlw ' '
call transmit

bnoadr
movff adrfl,FADRL
movff adrfh,FADRH ; установили адрес
bcf _CE ; выбрали микросхему
bcf _OE ; разрешили выдачу данных на линии PORTB
goto $+1
goto $+1
movff FDATA,tempa
bsf _OE ; отключили выходы (в третье состояние)
bsf _CE ; отключили микросхему памяти

movf tempa,w
call transmit ; вывели данные из FLASH на экран

incf adrfl, f ; приращение адреса на единицу (16 разрядов)
; snz
; incf adrfh, f
brott
btfss _kn ; для приостановки вывода -> нажми кнопку
goto brott

goto bpzu

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru