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

Обсуждаем контроллеры компании Atmel.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 76
Зарегистрирован: Чт янв 31, 2019 18:49:04
Откуда: Воронежская область

Сообщение bafomet911 »

Гг, я тоже сначала в замешательстве был:)
Изображение
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 113
Зарегистрирован: Пт апр 04, 2014 09:34:08
Откуда: Санкт-Петербург

Сообщение sergo80zxc »

еще вопрос по этой теме. организовал постоянную передачу данных между этими 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
глаза боятся, а руки что то не делают))
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

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

Добавлено after 1 hour 55 seconds:
с компа глянул... вроде правильно...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Эиком - электронные компоненты и радиодетали
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Думаю, что после занесения 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 автоматически началась
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 113
Зарегистрирован: Пт апр 04, 2014 09:34:08
Откуда: Санкт-Петербург

Сообщение sergo80zxc »

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

Добавлено after 50 minutes 12 seconds:
млин) не поленился поставил протеус 8 чтоб проверить) все на нем работает как надо) от младшего к старшему огонек бежит всем спс)
глаза боятся, а руки что то не делают))
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 76
Зарегистрирован: Чт янв 31, 2019 18:49:04
Откуда: Воронежская область

Сообщение bafomet911 »

[uquote="ARV",url="/forum/viewtopic.php?p=3594293#p3594293"]из-за одинаковости аватарок создается впечатление, что у кого-то раздвоение личности и они между собой ведут беседу :)))[/uquote]
Ещё одна "нашенская" аватарка;)
Изображение
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

sergo80zxc писал(а):вот исправленные исходники)
А под спойлер взять исходники не ку?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Ответить

Вернуться в «AVR»