[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. 12 мая 2002 г. 23:31
В ответ на: Видите как полезно читать мануалы(+) отправлено L.A. 12 мая 2002 г. 23:21





;********************************************************************<br>; Filename: SPI10.ASM *<br>; Программа для записи данных в SERIAL EEPROM Atmel 25020 *<br>; Генератор IntRC 4МГц *<br>; *<br>;********************************************************************<p> list p=12c508<br> #include <p12c508.inc><p> __CONFIG _CP_OFF & _WDT_ON & _MCLRE_OFF & _IntRC_OSC<p>; ;-------------------------------------------;<br>;Регистры специальных ; АЛГОРИТМ РАБОТЫ ;<br>; функций ; ;<br>INDF EQU 00H ; При одновременном нажатии 2-х кнопок ;<br>TMR0 EQU 01H ;PULT и PLAY/ST.BY происходит запись данных ;<br>PCL EQU 02H ;в ячейки 10H - 3FH SEPROM '25020' ;<br>STATUS EQU 03H ; В каждую ячейку заносится число, соотв-ее ;<br>FSR EQU 04H ;номеру ячейки. ;<br>OSCCAL EQU 05H ; ;<br>PORTB EQU 06H ; ;<br>;Регистры ОЗУ ; ;<br>COUNT1 EQU 07H ; ;<br>COUNT2 EQU 08H ; ;<br>COUNT3 EQU 09H ;<br>COUNT4 EQU 0AH ;<br>OUTBYTE EQU 0BH ; ;<br>RXDATA EQU 0CH ; ;<br>REGSTAT EQU 0DH ; ;<br>REGADDR EQU 0EH ; ;<br>REGDATA EQU 0FH ; ;<br>; ; ;<br>;Биты спец. регистров ; ;<br>C EQU 0 ; ;<br>Z EQU 2 ; ;<br>PD EQU 3 ; ;<br>T0 EQU 4 ; ;<br>PA0 EQU 5 ; ;<br>GPWUF EQU 7 ; ;<br>SI EQU 4 ; ;<br>SCK EQU 5 ; ;<br>SO EQU 1 ; ;<br>CS EQU 0 ; ;<br>PULT EQU 3 ; ;<br>STBY EQU 2 ;-------------------------------------------;<p> ORG 00H<br> MOVWF OSCCAL<br> GOTO START<p> ORG 40H ;---------------------------------------;<br>START MOVLW B'00111111' ;PORTB<0> - PORTB<3> - входы ;<br> TRIS PORTB ;Входы подвеш-ся к U пит. ;<br> MOVLW B'00001101' ;Предварительный делитель на вхо- ;<br> OPTION ;де WDT 1:32 ;<br> GOTO MAIN ;---------------------------------------;<p>;===================================================================;<br>;  2БЛОК ПОДПРОГРАММ 0 ;<br>;===================================================================;<br>;-------------------------------------------------------------------;<br>; DELAY подпрограмма ожидания . Время ожидания ок. 10 мС ;<br>; при 4 МГц кварце ;<br>;-------------------------------------------------------------------;<br>DELAY MOVLW 0FH ;---------------------------------------;<br> MOVWF COUNT1 ; ;<br>DEC1 MOVLW 0FAH ; ;<br> MOVWF COUNT2 ; ;<br>DEC2 DECFSZ COUNT2,F ; ;<br> GOTO DEC2 ; ;<br> DECFSZ COUNT1,F ; ;<br> GOTO DEC1 ;---------------------------------------;<br> RETLW 0<br>;*******************************************************************;<br>; OUTPUT подпрограмма записи байта в EEPROM ;<br>;-------------------------------------------------------------------;<br>OUTPUT CLRWDT ; Подготовка - сброс линий SCK и SI ;<br> BCF PORTB,SCK ;( линии подключенной к входу SI микросх;<br> BCF PORTB,SI ;SERIAL EEPROM ) ;<br> BCF STATUS,C ; ;<br>; ;---------------------------------------;<br> MOVLW 08H ;---------------------------------------;<br> MOVWF COUNT1 ; Запись 08H в счетчик битов COUNT1 ;<br>IC03 BTFSC OUTBYTE,7 ; Проверка бита OUTBYTE<7> Если он ;<br> BSF PORTB,SI ;равен 1 ,то установка бит PORTB,SI ;<br> BSF PORTB,SCK ;Затем перед- ся строб имп. ;<br> RLF OUTBYTE,F ;Затем сдвиг влево рег-р OUTBYTE. ;<br> BCF PORTB,SCK ;Затем сбрас- ся строб имп. ;<br> BCF PORTB,SI ; После этого сброс бита PORTB,SI ;<br> DECFSZ COUNT1,F ; уменьшение счетчика битов и продолж. ;<br> GOTO IC03 ;передачи. ;<br>; ;---------------------------------------;<br> RETLW 0<br>;*******************************************************************;<br>; INPUT подпрограмма чтения байта ;<br>;-------------------------------------------------------------------;<br>INPUT CLRWDT ; Подготовка - сброс линий SCK и SI ;<br> BCF PORTB,SCK ;( линии подключенной к входу SI микросх;<br> BCF PORTB,SI ;SERIAL EEPROM ) и очистка RXDATA ;<br> CLRF RXDATA ;---------------------------------------;<br>; ;---------------------------------------;<br>IC55 CLRF COUNT1 ; Занесение 8 в счетчик битов COUNT1 ;<br> BSF COUNT1,3 ; Передача перед.фронта строба ;<br>IC60 BSF PORTB,SCK ; Очистка С для записи инф-ции ;<br> BCF STATUS,C ; Проверка данных на входе ;<br> BTFSC PORTB,SO ; Если SO=1,то устан-ть С ;<br> BSF STATUS,C ; Задний фронт строб. импульса ;<br> BCF PORTB,SCK ; Бит С перех. в бит RXDATA<0> ;<br> RLF RXDATA,F ; Уменьш. BIT_COUNT на 1 и,если он =0 ;<br> DECFSZ COUNT1,F ;то закончить ;<br> GOTO IC60 ;---------------------------------------;<br>;<br> RETLW 0<br>;-------------------------------------------------------------------;<br>; T_ADR1 таблица адресов прошивки<br>;-------------------------------------------------------------------;<br>T_ADR1 MOVF COUNT4,W ; ;<br> ADDWF PCL,F ; ;<br> RETLW 10H ; ;<br> RETLW 15H ; ;<br> RETLW 20H ; ;<br> RETLW 25H ; ;<br> RETLW 30H ; ;<br> RETLW 35H ; ;<br> RETLW 40H ; ;<br> RETLW 45H ; ;<br> RETLW 50H ; ;<br> RETLW 55H ; ;<br> RETLW 60H ; ;<br> RETLW 65H ; ;<br> RETLW 70H ; ;<br> RETLW 75H ; ;<br> RETLW 80H ; ;<br> RETLW 85H ; ;<br>;-------------------------------------------------------------------;<br>; T_DAT1 таблица данных прошивки ;<br>;-------------------------------------------------------------------;<br>T_DAT1 MOVF COUNT4,W ; ;<br> ADDWF PCL,F ; ;<br> RETLW 00H ; ;<br> RETLW 56H ; ;<br> RETLW 57H ; ;<br> RETLW 58H ; ;<br> RETLW 59H ; ;<br> RETLW 60H ; ;<br> RETLW 61H ; ;<br> RETLW 62H ; ;<br> RETLW 63H ; ;<br> RETLW 64H ; ;<br> RETLW 65H ; ;<br> RETLW 66H ; ;<br> RETLW 67H ; ;<br> RETLW 68H ; ;<br> RETLW 69H ; ;<br> RETLW 6AH ;---------------------------------------;<p>;===================================================================;<br>; ГЛАВНАЯ ПРОГРАММА ;<br>;===================================================================;<br>MAIN CLRWDT ; Ожидание появления низкого уровня на ;<br> BTFSC PORTB,STBY ;входе ST.BY ;<br> GOTO MAIN ; ;<br>LOOP2 CLRWDT ; Ожидание появления низкого уровня на ;<br> BTFSC PORTB,STBY ;входе ST.BY ;<br> GOTO MAIN ; ;<br> BTFSC PORTB,PULT ; Ожидание сигнала на входе PULT ;<br> GOTO LOOP2 ; ;<br> MOVLW B'00001110' ; Переключение выводов на вход ;<br> TRIS PORTB ; ;<br>;-------------------------------------------------------------------;<br>; Подготовка к процессу ;<br>;-------------------------------------------------------------------;<br> BSF PORTB,CS ; set the chip select line ;<br> BCF PORTB,SCK ; clear the clock line ;<br> BCF PORTB,SI ; clear the data in line ;<br>; ; ;<br> CLRF COUNT4 ;---------------------------------------;<br>;-------------------------------------------------------------------;<br>; Подготовка к циклу записи запись WREN в рег-р состояния ;<br>;-------------------------------------------------------------------;<br> BCF PORTB,CS ; clear the chip select (active) ;<br> MOVLW 06H ; load WREN sequence ;<br> MOVWF OUTBYTE ; store in RAM location outbyte ;<br> CALL OUTPUT ; call the SPI output routine ;<br> BSF PORTB,CS ; set the chip select line ;<br>;-------------------------------------------------------------------;<br>; Запись команды WRSR в рег-р состояния ;<br>;-------------------------------------------------------------------;<br> BCF PORTB,CS ; Сброс линии CS начало записи/чтения ;<br> MOVLW 01H ; Команда 01Н-запись в рег-р состояния ;<br> MOVWF OUTBYTE ; Пересылка в буфер OUTBYTE и запись ;<br> CALL OUTPUT ; в SEEPROM ;<br> MOVLW 00H ; Запись в рег-р состояния управ слова ;<br> MOVWF OUTBYTE ; все 0 для разрешения записи во все ;<br> CALL OUTPUT ; ячейки ;<br> BSF PORTB,CS ; Установка линии CS окончание проц-са. ;<br>;-------------------------------------------------------------------; ;<br>; Ожидание установленное время 10 мС для окончания записи<br>;-------------------------------------------------------------------;<br> CALL DELAY ; call the delay subroutine<br>;*******************************************************************;<br>; Сам цикл записи данных в SEEPROM ;<br>;-------------------------------------------------------------------;<br>; Сначала команда Write Enable ;<br>;-------------------------------------------------------------------;<br>WR_EEPROM ; Запись команды WREN ;<br> CALL T_ADR1 ; Начало любого цикла обращения к SPI ;<br> MOVWF REGADDR<br> CALL T_DAT1<br> MOVWF REGDATA<br>WR_EN BCF PORTB,CS ;SEEPROM сброс линии CS (active) ;<br> MOVLW 06H ; load WREN sequence ;<br> MOVWF OUTBYTE ; store in RAM location outbyte ;<br> CALL OUTPUT ; call the SPI output routine ;<br> BSF PORTB,CS ; set the chip select line ;<br>;-------------------------------------------------------------------;<br>; Запись команды RDSR в рег-р состояния ;<br>;-------------------------------------------------------------------;<br> BCF PORTB,CS ; Проверка на всякий случай записалась ;<br> MOVLW 05H ;ли команда WREN. ;<br> MOVLW OUTBYTE ; 05H- команда чтения рег-ра. Передаем ;<br> CALL OUTPUT ;ком-ду , затем читаем рег.сост-ия. ;<br> CALL INPUT ;Если установился бит WEL то можно прис-;<br> BSF PORTB,CS ;тупать к записи. Если не устан-ся то ;<br> BTFSS RXDATA,1 ;возврат к метке WR_EN ;<br> GOTO WR_EN ; ;<br>;*******************************************************************;<br>; Передаем команду WRITE ;<br>;-------------------------------------------------------------------;<br> BCF PORTB,CS ; 02H - команда WRITE ;<br> MOVLW 02H ; load WRITE sequence ;<br> MOVWF OUTBYTE ; store in RAM location OUTBYTE ;<br> CALL OUTPUT ; call the SPI output routine ;<br>;-------------------------------------------------------------------;<br>; Write DATA in ADRESS. Собственно запись в EEPROM ;<br>;-------------------------------------------------------------------;<br> MOVF REGADDR,W ; Сначала адрес ячейки куда будут запи- ;<br> MOVWF OUTBYTE ; саны данные. Адрес берется из REGADDR ;<br> CALL OUTPUT ; ;<br> MOVF REGDATA,W ; Теперь данные. Они тоже берутся из ;<br> MOVWF OUTBYTE ; рег-ра REGDATA ;<br> CALL OUTPUT ; ;<br> BSF PORTB,CS ; set the chip select line ;<br>;*******************************************************************;<br>;Perform data polling (RDSR bit 0) Опрос бита WIP(Write in progress);<br>;-------------------------------------------------------------------;<br> BCF PORTB,CS ; clear the chip select line ;<br> MOVLW 05H ; load RDSR sequence ;<br> MOVWF OUTBYTE ; store in RAM location outbyte ;<br> CALL OUTPUT ; call the SPI output routine ;<br>; ;---------------------------------------;<br> MOVLW 30H ;---------------------------------------;<br> MOVWF COUNT1 ; Ожидание примерно 50 мкс ( при 4МГц ) ;<br>WAIT DECFSZ COUNT1,F ; когда установится бит WIP ;<br> GOTO WAIT ;---------------------------------------;<br>; ;---------------------------------------;<br>POLLING CALL INPUT ; Чтение регистра состояния SEPROM ;<br> BTFSC RXDATA,0 ; Проверка WIP бита в регистре состояния;<br> GOTO POLLING ;Если WIP=0,то установить CS и выход ;<br> BSF PORTB,CS ;из цикла ;<br> ;---------------------------------------;<br> INCF COUNT4,F ;Приращение счетчика адресов и данных ;<br> BTFSS COUNT4,4 ;Если он достиг 40H то выход из цикла ;<br> GOTO WR_EEPROM ;записи ;<br> ;---------------------------------------;<br>;*******************************************************************;<br>; Write disable sequence (WRDI) Запись команды WR. DISABLE ;<br>;-------------------------------------------------------------------;<br>WR_DI BCF PORTB,CS ; clear the chip select (active) ;<br> MOVLW 04H ; load WRDI sequence ;<br> MOVWF OUTBYTE ; store in RAM location outbyte ;<br> CALL OUTPUT ; call the SPI output routine ;<br> BSF PORTB,CS ; set the chip select line ;<br>;-------------------------------------------------------------------;<br>; Read status register sequence (RDSR) Проверка записалась ли коман.;<br>;-------------------------------------------------------------------;<br> BCF PORTB,CS ; Сlear the chip select line ;<br> MOVLW 05H ; Команда на чтение рег-ра состояния ;<br> MOVWF OUTBYTE ; Store in RAM location outbyte ;<br> CALL OUTPUT ; Call the SPI output routine ;<br> CALL INPUT ; read the data in status reg. ;<br> BSF PORTB,CS ; Если бит RXDATA<1>=0 то все ;<br> BTFSC RXDATA,1 ; ;<br> GOTO WR_DI ;---------------------------------------;<br>;*******Go back to main routine*********************************<br> GOTO START<p><br> END<p><br>

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

Ответы



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

E-mail: info@telesys.ru