[an error occurred while processing this directive] [an error occurred while processing this directive]
А ну ка
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено L.A. 13 мая 2002 г. 15:52
В ответ на: Как то коряво получается. Забыл как HTML вставлять. отправлено L.A. 12 мая 2002 г. 23:52


;********************************************************************
; Filename: SPI10.ASM *
; Программа для записи данных в SERIAL EEPROM Atmel 25020 *
; Генератор IntRC 4МГц *
; *
;********************************************************************

list p=12c508
#include

__CONFIG _CP_OFF & _WDT_ON & _MCLRE_OFF & _IntRC_OSC

; ;-------------------------------------------;
;Регистры специальных ; АЛГОРИТМ РАБОТЫ ;
; функций ; ;
INDF EQU 00H ; При одновременном нажатии 2-х кнопок ;
TMR0 EQU 01H ;PULT и PLAY/ST.BY происходит запись данных ;
PCL EQU 02H ;в ячейки 10H - 3FH SEPROM '25020' ;
STATUS EQU 03H ; В каждую ячейку заносится число, соотв-ее ;
FSR EQU 04H ;номеру ячейки. ;
OSCCAL EQU 05H ; ;
PORTB EQU 06H ; ;
;Регистры ОЗУ ; ;
COUNT1 EQU 07H ; ;
COUNT2 EQU 08H ; ;
COUNT3 EQU 09H ;
COUNT4 EQU 0AH ;
OUTBYTE EQU 0BH ; ;
RXDATA EQU 0CH ; ;
REGSTAT EQU 0DH ; ;
REGADDR EQU 0EH ; ;
REGDATA EQU 0FH ; ;
; ; ;
;Биты спец. регистров ; ;
C EQU 0 ; ;
Z EQU 2 ; ;
PD EQU 3 ; ;
T0 EQU 4 ; ;
PA0 EQU 5 ; ;
GPWUF EQU 7 ; ;
SI EQU 4 ; ;
SCK EQU 5 ; ;
SO EQU 1 ; ;
CS EQU 0 ; ;
PULT EQU 3 ; ;
STBY EQU 2 ;-------------------------------------------;

ORG 00H
MOVWF OSCCAL
GOTO START

ORG 40H ;---------------------------------------;
START MOVLW B'00111111' ;PORTB<0> - PORTB<3> - входы ;
TRIS PORTB ;Входы подвеш-ся к U пит. ;
MOVLW B'00001101' ;Предварительный делитель на вхо- ;
OPTION ;де WDT 1:32 ;
GOTO MAIN ;---------------------------------------;

;===================================================================;
; 2БЛОК ПОДПРОГРАММ 0 ;
;===================================================================;
;-------------------------------------------------------------------;
; DELAY подпрограмма ожидания . Время ожидания ок. 10 мС ;
; при 4 МГц кварце ;
;-------------------------------------------------------------------;
DELAY MOVLW 0FH ;---------------------------------------;
MOVWF COUNT1 ; ;
DEC1 MOVLW 0FAH ; ;
MOVWF COUNT2 ; ;
DEC2 DECFSZ COUNT2,F ; ;
GOTO DEC2 ; ;
DECFSZ COUNT1,F ; ;
GOTO DEC1 ;---------------------------------------;
RETLW 0
;*******************************************************************;
; OUTPUT подпрограмма записи байта в EEPROM ;
;-------------------------------------------------------------------;
OUTPUT CLRWDT ; Подготовка - сброс линий SCK и SI ;
BCF PORTB,SCK ;( линии подключенной к входу SI микросх;
BCF PORTB,SI ;SERIAL EEPROM ) ;
BCF STATUS,C ; ;
; ;---------------------------------------;
MOVLW 08H ;---------------------------------------;
MOVWF COUNT1 ; Запись 08H в счетчик битов COUNT1 ;
IC03 BTFSC OUTBYTE,7 ; Проверка бита OUTBYTE<7> Если он ;
BSF PORTB,SI ;равен 1 ,то установка бит PORTB,SI ;
BSF PORTB,SCK ;Затем перед- ся строб имп. ;
RLF OUTBYTE,F ;Затем сдвиг влево рег-р OUTBYTE. ;
BCF PORTB,SCK ;Затем сбрас- ся строб имп. ;
BCF PORTB,SI ; После этого сброс бита PORTB,SI ;
DECFSZ COUNT1,F ; уменьшение счетчика битов и продолж. ;
GOTO IC03 ;передачи. ;
; ;---------------------------------------;
RETLW 0
;*******************************************************************;
; INPUT подпрограмма чтения байта ;
;-------------------------------------------------------------------;
INPUT CLRWDT ; Подготовка - сброс линий SCK и SI ;
BCF PORTB,SCK ;( линии подключенной к входу SI микросх;
BCF PORTB,SI ;SERIAL EEPROM ) и очистка RXDATA ;
CLRF RXDATA ;---------------------------------------;
; ;---------------------------------------;
IC55 CLRF COUNT1 ; Занесение 8 в счетчик битов COUNT1 ;
BSF COUNT1,3 ; Передача перед.фронта строба ;
IC60 BSF PORTB,SCK ; Очистка С для записи инф-ции ;
BCF STATUS,C ; Проверка данных на входе ;
BTFSC PORTB,SO ; Если SO=1,то устан-ть С ;
BSF STATUS,C ; Задний фронт строб. импульса ;
BCF PORTB,SCK ; Бит С перех. в бит RXDATA<0> ;
RLF RXDATA,F ; Уменьш. BIT_COUNT на 1 и,если он =0 ;
DECFSZ COUNT1,F ;то закончить ;
GOTO IC60 ;---------------------------------------;
;
RETLW 0
;-------------------------------------------------------------------;
; T_ADR1 таблица адресов прошивки
;-------------------------------------------------------------------;
T_ADR1 MOVF COUNT4,W ; ;
ADDWF PCL,F ; ;
RETLW 10H ; ;
RETLW 15H ; ;
RETLW 20H ; ;
RETLW 25H ; ;
RETLW 30H ; ;
RETLW 35H ; ;
RETLW 40H ; ;
RETLW 45H ; ;
RETLW 50H ; ;
RETLW 55H ; ;
RETLW 60H ; ;
RETLW 65H ; ;
RETLW 70H ; ;
RETLW 75H ; ;
RETLW 80H ; ;
RETLW 85H ; ;
;-------------------------------------------------------------------;
; T_DAT1 таблица данных прошивки ;
;-------------------------------------------------------------------;
T_DAT1 MOVF COUNT4,W ; ;
ADDWF PCL,F ; ;
RETLW 00H ; ;
RETLW 56H ; ;
RETLW 57H ; ;
RETLW 58H ; ;
RETLW 59H ; ;
RETLW 60H ; ;
RETLW 61H ; ;
RETLW 62H ; ;
RETLW 63H ; ;
RETLW 64H ; ;
RETLW 65H ; ;
RETLW 66H ; ;
RETLW 67H ; ;
RETLW 68H ; ;
RETLW 69H ; ;
RETLW 6AH ;---------------------------------------;

;===================================================================;
; ГЛАВНАЯ ПРОГРАММА ;
;===================================================================;
MAIN CLRWDT ; Ожидание появления низкого уровня на ;
BTFSC PORTB,STBY ;входе ST.BY ;
GOTO MAIN ; ;
LOOP2 CLRWDT ; Ожидание появления низкого уровня на ;
BTFSC PORTB,STBY ;входе ST.BY ;
GOTO MAIN ; ;
BTFSC PORTB,PULT ; Ожидание сигнала на входе PULT ;
GOTO LOOP2 ; ;
MOVLW B'00001110' ; Переключение выводов на вход ;
TRIS PORTB ; ;
;-------------------------------------------------------------------;
; Подготовка к процессу ;
;-------------------------------------------------------------------;
BSF PORTB,CS ; set the chip select line ;
BCF PORTB,SCK ; clear the clock line ;
BCF PORTB,SI ; clear the data in line ;
; ; ;
CLRF COUNT4 ;---------------------------------------;
;-------------------------------------------------------------------;
; Подготовка к циклу записи запись WREN в рег-р состояния ;
;-------------------------------------------------------------------;
BCF PORTB,CS ; clear the chip select (active) ;
MOVLW 06H ; load WREN sequence ;
MOVWF OUTBYTE ; store in RAM location outbyte ;
CALL OUTPUT ; call the SPI output routine ;
BSF PORTB,CS ; set the chip select line ;
;-------------------------------------------------------------------;
; Запись команды WRSR в рег-р состояния ;
;-------------------------------------------------------------------;
BCF PORTB,CS ; Сброс линии CS начало записи/чтения ;
MOVLW 01H ; Команда 01Н-запись в рег-р состояния ;
MOVWF OUTBYTE ; Пересылка в буфер OUTBYTE и запись ;
CALL OUTPUT ; в SEEPROM ;
MOVLW 00H ; Запись в рег-р состояния управ слова ;
MOVWF OUTBYTE ; все 0 для разрешения записи во все ;
CALL OUTPUT ; ячейки ;
BSF PORTB,CS ; Установка линии CS окончание проц-са. ;
;-------------------------------------------------------------------; ;
; Ожидание установленное время 10 мС для окончания записи
;-------------------------------------------------------------------;
CALL DELAY ; call the delay subroutine
;*******************************************************************;
; Сам цикл записи данных в SEEPROM ;
;-------------------------------------------------------------------;
; Сначала команда Write Enable ;
;-------------------------------------------------------------------;
WR_EEPROM ; Запись команды WREN ;
CALL T_ADR1 ; Начало любого цикла обращения к SPI ;
MOVWF REGADDR
CALL T_DAT1
MOVWF REGDATA
WR_EN BCF PORTB,CS ;SEEPROM сброс линии CS (active) ;
MOVLW 06H ; load WREN sequence ;
MOVWF OUTBYTE ; store in RAM location outbyte ;
CALL OUTPUT ; call the SPI output routine ;
BSF PORTB,CS ; set the chip select line ;
;-------------------------------------------------------------------;
; Запись команды RDSR в рег-р состояния ;
;-------------------------------------------------------------------;
BCF PORTB,CS ; Проверка на всякий случай записалась ;
MOVLW 05H ;ли команда WREN. ;
MOVLW OUTBYTE ; 05H- команда чтения рег-ра. Передаем ;
CALL OUTPUT ;ком-ду , затем читаем рег.сост-ия. ;
CALL INPUT ;Если установился бит WEL то можно прис-;
BSF PORTB,CS ;тупать к записи. Если не устан-ся то ;
BTFSS RXDATA,1 ;возврат к метке WR_EN ;
GOTO WR_EN ; ;
;*******************************************************************;
; Передаем команду WRITE ;
;-------------------------------------------------------------------;
BCF PORTB,CS ; 02H - команда WRITE ;
MOVLW 02H ; load WRITE sequence ;
MOVWF OUTBYTE ; store in RAM location OUTBYTE ;
CALL OUTPUT ; call the SPI output routine ;
;-------------------------------------------------------------------;
; Write DATA in ADRESS. Собственно запись в EEPROM ;
;-------------------------------------------------------------------;
MOVF REGADDR,W ; Сначала адрес ячейки куда будут запи- ;
MOVWF OUTBYTE ; саны данные. Адрес берется из REGADDR ;
CALL OUTPUT ; ;
MOVF REGDATA,W ; Теперь данные. Они тоже берутся из ;
MOVWF OUTBYTE ; рег-ра REGDATA ;
CALL OUTPUT ; ;
BSF PORTB,CS ; set the chip select line ;
;*******************************************************************;
;Perform data polling (RDSR bit 0) Опрос бита WIP(Write in progress);
;-------------------------------------------------------------------;
BCF PORTB,CS ; clear the chip select line ;
MOVLW 05H ; load RDSR sequence ;
MOVWF OUTBYTE ; store in RAM location outbyte ;
CALL OUTPUT ; call the SPI output routine ;
; ;---------------------------------------;
MOVLW 30H ;---------------------------------------;
MOVWF COUNT1 ; Ожидание примерно 50 мкс ( при 4МГц ) ;
WAIT DECFSZ COUNT1,F ; когда установится бит WIP ;
GOTO WAIT ;---------------------------------------;
; ;---------------------------------------;
POLLING CALL INPUT ; Чтение регистра состояния SEPROM ;
BTFSC RXDATA,0 ; Проверка WIP бита в регистре состояния;
GOTO POLLING ;Если WIP=0,то установить CS и выход ;
BSF PORTB,CS ;из цикла ;
;---------------------------------------;
INCF COUNT4,F ;Приращение счетчика адресов и данных ;
BTFSS COUNT4,4 ;Если он достиг 40H то выход из цикла ;
GOTO WR_EEPROM ;записи ;
;---------------------------------------;
;*******************************************************************;
; Write disable sequence (WRDI) Запись команды WR. DISABLE ;
;-------------------------------------------------------------------;
WR_DI BCF PORTB,CS ; clear the chip select (active) ;
MOVLW 04H ; load WRDI sequence ;
MOVWF OUTBYTE ; store in RAM location outbyte ;
CALL OUTPUT ; call the SPI output routine ;
BSF PORTB,CS ; set the chip select line ;
;-------------------------------------------------------------------;
; Read status register sequence (RDSR) Проверка записалась ли коман.;
;-------------------------------------------------------------------;
BCF PORTB,CS ; Сlear the chip select line ;
MOVLW 05H ; Команда на чтение рег-ра состояния ;
MOVWF OUTBYTE ; Store in RAM location outbyte ;
CALL OUTPUT ; Call the SPI output routine ;
CALL INPUT ; read the data in status reg. ;
BSF PORTB,CS ; Если бит RXDATA<1>=0 то все ;
BTFSC RXDATA,1 ; ;
GOTO WR_DI ;---------------------------------------;
;*******Go back to main routine*********************************
GOTO START


END


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

Ответы



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

E-mail: info@telesys.ru