Обсуждаем контроллеры компании Atmel.
Ответить

Re: Вопрос по SPI на asm

Пн мар 18, 2019 09:41:42

из-за одинаковости аватарок создается впечатление, что у кого-то раздвоение личности и они между собой ведут беседу :)))

Re: Вопрос по SPI на asm

Пн мар 18, 2019 10:35:33

Гг, я тоже сначала в замешательстве был:)

Re: Вопрос по SPI на asm

Пн мар 18, 2019 21:56:51

еще вопрос по этой теме. организовал постоянную передачу данных между этими 2 МК. смысл таков, гоняю бегущий огонек передавая через SPI. задумывал так, по портам Д обоих МК одиночный огонек бегает
от бита D1 по бит D7 (при первоначальном запуске программ загорается D0) а в протеусе получилось, что огонек бегает от D7 по D1. короче не пойму почему огонек бегает наоборот((((


Код:
;проект 1
;
;настройка SPI , МК настроим в режим Slave
;
;
;многократный прием байта по SPI от  МК(Master) к нашему МК(Slave). оба атмега8
;режим работы SPI 0
;скорость работы fclk/128
;
;
;
;два мк атмега8 соединены шинами для SPI обмена. (MOSI к MOSI, MISO к MISO, SS к SS, SCK к SCK)
;на порты D  обоих посажены светодиоды через резисторы, что бы потом видеть, что байты передались

;вначале программы передаем с обоих мк одно и тоже число друг другу 0b00000001 и смотрим в протеусе горят нужные светодиоды
;на портах  D обоих мк. 
;в прерывании SPI после того как считаем полученое число из регистра данных SPDR (переданное от другого МК)и запишем его в порт D  мы организовываем логический сдвиг
;нашей 1 влево  и записываем его обратно на передачу в регистра данных SPDR
;
;по факту при запуске программы 1 раз загорается 0 пин регистра Д и дальше при обмене по SPI по очереди огонек бежит от пина 1 по пин 7 , нулевой пин больше не загорается
;
;;****************************************************************************************
.cseg
.include "m8Adef.inc"
;
;;***********************************************************************
.org   $000 rjmp RESET                  ;Reset Handler
;.org   $001 reti                       ;rjmp EXT_INT0 ; IRQ0 Handler
;.org   $002 reti                       ;rjmp EXT_INT1 ; IRQ1 Handler
;.org   $003 reti                       ;rjmp TIM2_COMP ; Timer2 Compare Handler
;.org   $004 reti                       ;rjmp TIM2_OVF ; Timer2 Overflow Handler
;.org   $005 reti                        ;rjmp TIM1_CAPT ; Timer1 Capture Handler
;.org   $006 reti                       ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
;.org   $007 reti                       ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
;.org   $008 reti                       ;rjmp TIM1_OVF ; Timer1 Overflow Handler
;.org   $009 reti                       ;rjmp TIM0_OVF ; Timer0 Overflow Handler
.org   $00a rjmp SPI_STC             ; SPI Transfer Complete Handler
;.org   $00b reti                       ;rjmp USART_RXC ; USART RX Complete Handler
;.org   $00c reti                       ;rjmp USART_UDRE ; UDR Empty Handler
;.org   $00d reti                       ;rjmp USART_TXC ; USART TX Complete Handler
;.org   $00e reti                       ;rjmp ADC ; ADC Conversion Complete Handler
;.org   $00f reti                       ;rjmp EE_RDY ; EEPROM Ready Handler
;.org   $010 reti                       ;rjmp ANA_COMP ; Analog Comparator Handler
;.org   $011 reti                       ;rjmp TWSI ; Two-wire Serial Interface Handler
;.org   $012 reti                       ;rjmp SPM_RDY ; Store Program Memory Ready Handler




;***********************************************************************
RESET:

  cli                         ;запретить все прерывания

     ldi r16, low(RAMEND)     ;загрузка указателя стека
     out SPL, r16

     ldi r16, high(RAMEND)    ;загрузка указателя стека
     out SPH, r16

     ldi r16, 0b11111111      ;порт D на выход целиком
     out DDRD, r16





     ldi r17, (1<<PB4)                  ;
     out DDRB, r17                      ; бит PB4(MISO)  устанавливаем в 1, у ведомого МК (MISO) ставится на выход а  (MOSI), (SS), (SCK) на вход



 
     ldi r16, (1<<SPE)|(1<<SPR1)|(1<<SPR0)|(1<<SPIE)       ; выставим бит номер 6(SPE) в 1, включим модуль SPI,  бит номер 4(MSTR) сброшен в 0, наш  МК в режим (Slave). разрешим прерывание битом (SPIE)
     out SPCR, r16                      ; биты номер 3(CPOL) и 2(СPHA) сброшены в 0, настроен режим работы 0 по умолчанию
                                        ; бит номер 5(DORD) сброшен в 0 по умолчанию, поэтому первым в передаче данных  передается 7-ой старший бит
                              ; бит (SPI2X) регистра SPSR по умолчанию сброшен в 0,  биты (SPR1) , (SPR0) регистра SPCR выставим в 1 и работает режим скорости fclk/128


   
     
     ldi r16, 0b00000001                ; запишем число в регистр данных SPDR для отправки мастеру, чтоб видеть что передача произошла
     out SPDR, r16
 

 
 
 
 
 
  sei                         ;разрешаем прерывания


;***********************************************************************************************

MAIN:


     rjmp MAIN


;**********************************************************************************************



SPI_STC:


       in r16, SPDR              ; читаем регистр данных SPDR и пишем прочтеное в r16
       out PORTD, r16            ; пишем число из регистра r16 в свой в PORTD


       in r17, pinD              ; читаем pinD и пишем прочтеное в r17 ( число полученое от ведомого МК)

       sbrc r17, 7               ; если этот бит очищен, пропускает следующую команду ( проверяем не дошла ли еденица до 7 пина нашего бегущего огонька)
     
      ldi r17, 0b00000001       ; раз  в 7 пине регистра r17 стоит единица, то пора регистр выставить в первоначальную позицию записав в него 0b00000001


 

       lsl r17                   ; сдвиг влево ( смещаем нашу еденицу на 1 бит влево ( например было 0b00000001  стало 0b00000010 )
       out SPDR, r17             ; запишем число в регистр данных SPDR и передача байта по SPI автоматически началась




  reti



Код:
;проект 1
;
;
;настройка SPI , МК настроим в режим Master
;
;
;многократный прием байта по SPI от  МК(Master) к нашему МК(Slave). оба атмега8
;режим работы SPI 0
;скорость работы fclk/128
;
;
;
;два мк атмега8 соединены шинами для SPI обмена. (MOSI к MOSI, MISO к MISO, SS к SS, SCK к SCK)
;на порты D  обоих посажены светодиоды через резисторы, что бы потом видеть, что байты передались

;вначале программы передаем с обоих мк одно и тоже число друг другу 0b00000001 и смотрим в протеусе горят нужные светодиоды
;на портах  D обоих мк. 
;в прерывании SPI после того как считаем полученое число из регистра данных SPDR (переданное от другого МК)и запишем его в порт D  мы организовываем логический сдвиг
;нашей 1 влево  и записываем его обратно на передачу в регистра данных SPDR
;
;по факту при запуске программы 1 раз загорается 0 пин регистра Д и дальше при обмене по SPI по очереди огонек бежит от пина 1 по пин 7 , нулевой пин больше не загорается
;
;
;****************************************************************************************
.cseg
.include "m8Adef.inc"
;
;;***********************************************************************
.org   $000 rjmp RESET                  ;Reset Handler
;.org   $001 reti                       ;rjmp EXT_INT0 ; IRQ0 Handler
;.org   $002 reti                       ;rjmp EXT_INT1 ; IRQ1 Handler
;.org   $003 reti                       ;rjmp TIM2_COMP ; Timer2 Compare Handler
;.org   $004 reti                       ;rjmp TIM2_OVF ; Timer2 Overflow Handler
;.org   $005 reti                        ;rjmp TIM1_CAPT ; Timer1 Capture Handler
;.org   $006 reti                       ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
;.org   $007 reti                       ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
;.org   $008 reti                       ;rjmp TIM1_OVF ; Timer1 Overflow Handler
;.org   $009 reti                       ;rjmp TIM0_OVF ; Timer0 Overflow Handler
.org   $00a rjmp SPI_STC                               ; SPI Transfer Complete Handler
;.org   $00b reti                       ;rjmp USART_RXC ; USART RX Complete Handler
;.org   $00c reti                       ;rjmp USART_UDRE ; UDR Empty Handler
;.org   $00d reti                       ;rjmp USART_TXC ; USART TX Complete Handler
;.org   $00e reti                       ;rjmp ADC ; ADC Conversion Complete Handler
;.org   $00f reti                       ;rjmp EE_RDY ; EEPROM Ready Handler
;.org   $010 reti                       ;rjmp ANA_COMP ; Analog Comparator Handler
;.org   $011 reti                       ;rjmp TWSI ; Two-wire Serial Interface Handler
;.org   $012 reti                       ;rjmp SPM_RDY ; Store Program Memory Ready Handler




;***********************************************************************
RESET:

  cli                         ;запретить все прерывания

     ldi r16, low(RAMEND)     ;загрузка указателя стека
     out SPL, r16

     ldi r16, high(RAMEND)    ;загрузка указателя стека
     out SPH, r16




     ldi r16, 0b11111111      ; порт D  на выход
     out DDRD, r16
 
                            


     ldi r17, (1<<PB3)|(1<<PB5)|(1<<PB2)
     out DDRB, r17                      ; биты  РВ3(MOSI), РВ5(SCK), РВ2(SS) настроим  на выход (Для ведущего настроить MOSI, SCK, SS на выход, MISO на вход)
 


     ldi r16, (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0)|(1<<SPIE)    ; выставим бит номер 6(SPE) в 1, включим модуль SPI, выставим бит номер 4(MSTR) в 1 настроим наш МК в режим Master. бит SPIE разрешает прерывание по SPI
     out SPCR, r16                      ; биты номер 3(CPOL) и 2(СPHA) сброшены в 0, настроен режим работы 0 по умолчанию
                                        ; бит номер 5(DORD) сброшен в 0 по умолчанию, поэтому первым в передаче данных  передается 7-ой старший бит
                              ; бит (SPI2X) регистра SPSR по умолчанию сброшен в 0,  биты 1(SPR1) , 0(SPR0) регистра SPCR выставим в 1 и работает режим скорости fclk/128


     cbi PortB,2                        ; сбросим в 0 бит  РВ2(SS) активизируем ведомый МК низким уровнем сигнала на передачу данных
                           

 


     
     ldi r16, 0b00000001               
     out SPDR, r16           ; запишем число в регистр данных SPDR и передача байта по SPI автоматически началась
 

 
 
 
 
 
  sei                         ;разрешаем прерывания


;***********************************************************************************************

MAIN:


     rjmp MAIN

;*********************************************************************************************** 


SPI_STC:


       in r16, SPDR              ; читаем регистр данных SPDR и пишем прочтеное в r16
       out PORTD, r16            ; пишем число из регистра r16 в свой в PORTD


       in r17, pinD              ; читаем pinD и пишем прочтеное в r17 ( число полученое от ведомого МК)

       sbrc r17, 7               ; если этот бит очищен, пропускает следующую команду ( проверяем не дошла ли еденица до 7 пина нашего бегущего огонька)
     
      ldi r17, 0b00000001       ; раз  в 7 пине регистра r17 стоит единица, то пора регистр выставить в первоначальную позицию записав в него 0b00000001


 

       lsl r17                   ; сдвиг влево ( смещаем нашу еденицу на 1 бит влево ( например было 0b00000001  стало 0b00000010 )
       out SPDR, r17             ; запишем число в регистр данных SPDR и передача байта по SPI автоматически началась




  reti

Re: Вопрос по SPI на asm

Вт мар 19, 2019 04:57:08

а направление (старшим/младшим разрядом вперед) правильно задано? (бит DORD регистра SPCR)

Добавлено after 1 hour 55 seconds:
с компа глянул... вроде правильно...

Re: Вопрос по SPI на asm

Вт мар 19, 2019 05:36:46

Думаю, что после занесения 00000001 в R17 сразу идет сдвиг, поэтому младшенький светик и не горит. Нужно что то типа
Код:
   CLC   
   sbrc r17, 7               ; если этот бит очищен, пропускает следующую команду ( проверяем не дошла ли еденица до 7 пина нашего бегущего огонька)
   SEC
    ROL R17
;      ldi r17, 0b00000001       ; раз  в 7 пине регистра r17 стоит единица, то пора регистр выставить в первоначальную позицию записав в ;него 0b00000001

;       lsl r17                   ; сдвиг влево ( смещаем нашу еденицу на 1 бит влево ( например было 0b00000001  стало 0b00000010
       out SPDR, r17             ; запишем число в регистр данных SPDR и передача байта по SPI автоматически началась

Re: Вопрос по SPI на asm

Ср мар 20, 2019 22:27:16

akl так проблема в том , что огонек бежит от старшего бита к младшему, а должен от младшего к старшему)

Добавлено after 50 minutes 12 seconds:
млин) не поленился поставил протеус 8 чтоб проверить) все на нем работает как надо) от младшего к старшему огонек бежит всем спс)

Re: Вопрос по SPI на asm

Чт мар 21, 2019 00:22:44

из-за одинаковости аватарок создается впечатление, что у кого-то раздвоение личности и они между собой ведут беседу :)))

Ещё одна "нашенская" аватарка;)

Re: Вопрос по SPI на asm

Чт мар 21, 2019 06:58:45

bafomet911 писал(а):Ещё одна "нашенская" аватарка
вроде, самое большое количество личностей внутри одного человека психиатрия зафиксировала то ли 40, то ли около того... так шта есть еще куда двигаться

Re: Вопрос по SPI на asm

Чт мар 21, 2019 12:45:59

sergo80zxc писал(а):вот исправленные исходники)
А под спойлер взять исходники не ку?
Ответить