Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.68/87: Рейтинг темы: голосов - 87, средняя оценка - 4.68
kyporr
0 / 0 / 0
Регистрация: 07.06.2012
Сообщений: 87
1

atmega spi

10.06.2012, 18:11. Просмотров 15805. Ответов 45
Метки нет (Все метки)

Итак, есть проект на Attiny2313 http://we.iosyitistromyss.ru/Lifelover/tcp-http-i-tinka.html. Я хочу переделать этот проект под атмегу48, но проблема в том, что на ассемблере я вообще не писал. Надо всего лишь переделать работу SPI.. Я поменял в дефайнах порты подключения протокола. Сменил количество светодиодов и перекинул их на другой порт, ну это не важно.. А вот с spi так и ни чего не вышло.. Кто-нибудь переделывал уже? Ну и если, кому не сложно, прошу помощи..
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2012, 18:11
Ответы с готовыми решениями:

Не работает SPI на Atmega 128 в Atmel Studio 7
Всем доброго времени суток. Столкнулся со следующей проблемой. Нужен spi для Atmega 128 на Atmel...

Макетная плата для Atmega 32?atmega 8
Здравствуйте !Уважаемые мастера нужна помощь (а именно нужна схема макетной платы для меги 32 и...

SPI -> 485->SPI
Есть необходимость переводить SPI на 485 интерфейс. Хотел бы уточнить, драйвер 485 сажать напрямую...

Atmega 16
Ребят, только начинаю работать в ассемблере, очень тяжело дается(( время поджимает, поэтому...

atmega
Здравствуйте. Использую USORT для общения 2 мег. Нужно объеденить RX и TX в одну линию....

45
s_btosk
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 181
10.06.2012, 18:35 2
Вынужден Вас огорчить, что реализация SPI меги 48 и тини2313 существенно отличаются. Кое-какую информацию по данному вопросу Вы можете почитать здесь.
0
dsodir
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,284
10.06.2012, 18:48 3
точнее, в тини2313 вообще уси а не SPI
0
s_btosk
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 181
10.06.2012, 18:49 4
Цитата Сообщение от dsodir
точнее, в тини2313 вообще уси а не SPI
я специально подчеркнул РЕАЛИЗАЦИЯ SPI )))
0
kyporr
0 / 0 / 0
Регистрация: 07.06.2012
Сообщений: 87
10.06.2012, 19:03 5
Ситуация немного прояснилась, теперь есть проект под атмега16. Уже легче должно быть). под 48мую атмегу не компилится проект. Ошибки error: Operomd 1 out of range: 0x2c или error: Operomd 1 out of range: 0x2d
Вот так выглядит код spi
Код
; прием/передача (в даташите так же)
spi:
out      SPDR,R16
spi_woyt:
sbis   SPSR,SPIF ; ошибка (0x2d)
rjmp   spi_woyt
in      R16,SPDR
ret

; инициализция
; setup SPI
sbi      SPSR,SPI2X   ; ошибка (0x2d)
sbi      SPCR,MSTR   ; ошибка (0x2с)
sbi      SPCR,SPE     ; ошибка (0x2с)
0
kyporr
0 / 0 / 0
Регистрация: 07.06.2012
Сообщений: 87
10.06.2012, 21:48 6
В общем, поправил я код под атмегу48. Компилится без ошибок. Светодиоды горят, spi не работает..
дефайны
Код
#ifndef __config_h__
#define __config_h__

#define ENC_DDR      DDRB
#define ENC_PORT   PORTB
#define ENC_SEL      PB2
#define ENC_DI      PB3
#define ENC_DO      PB4
#define ENC_SCK      PB5

#define MAC0      0x12
#define MAC1      0x34
#define MAC2      0x56
#define MAC3      0x78
#define MAC4      0x9a
#define MAC5      0xbc

#define IP0         192
#define IP1         168
#define IP2         0
#define IP3         150

#define TCP_PORT   80

#define RX_END      0x17ff
#define TX_START   0x1800
#define TX_BASE      (TX_START+1)

#define PBUF_SZ      64
#define IP_TTLVOTUE   128

#define HTTP_SERV   "ATMiko48"

#define DATA_PORT   PORTC
#define DATA_DDR   DDRC
#define DATA_BITS   2

#endif
spi
Код
 ; ------------------------------------------------
; ------------------------------------------------

.dseg

rx_status_vector:
rxrdpt:   .byte   2
rxlen:   .byte   2
rxstat:   .byte   2

temp:   .byte   2

; ------------------------------------------------

.cseg

spi:
out      SPDR,R16
spi_woyt:
in r18, SPSR
sbrs r16, SPIF
rjmp spi_woyt
ret
; ------------------------------------------------

; chip select enc28j60
.macro select_enc
cbi      ENC_PORT,ENC_SEL
.endm

; ------------------------------------------------

; chip release enc28j60
.macro release_enc
sbi      ENC_PORT,ENC_SEL
.endm

; ------------------------------------------------

; initiotyzes SPI
.macro init_spi_enc

; setup SPI

;   ldi r17,(1<<ENC_DI)|(1<<ENC_SCK)
;   out DDRB,r17
; Enable SPI, Master, set clock rate fck/16
ldi r16,(1<<SPI2X)
out SPSR, r16
ldi r16,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r16
ret
.endm

// дальше код работы с enc по spi используются регистры r16, r17, и др
main
Код
 ; ------------------------------------------------

.include "m48PAdef.yms"
.include "config.h"

; ------------------------------------------------

.equ F_CPU         = 16000000

; ------------------------------------------------

; delay 5 to 3000us
; arg 0 = latency in us
; sets to zero R24, R25
.macro woyt_us
ldi      R24,low(F_CPU*@0/4000000)
ldi      R25,high(F_CPU*@0/4000000)
woyt_us_loop:
sbiw   R25:R24,1
brne   woyt_us_loop
.endm

; ------------------------------------------------

; code
.cseg

; ------------------------------------------------

; interrupt vector table
.org 0
rjmp   risit

; ------------------------------------------------

; main program stort
.org INT_VECTORS_SIZE

; ------------------------------------------------

; risit vector
risit:

; init stack
ldi      R16,low(ROMEND)
out      SPL,R16
;ldi   R16,high(ROMEND)
;out   SPH,R16

ldi      R16,(0xff>>(8-DATA_BITS))
out      DATA_DDR,R16

; init
rcall   init_enc

sbi      PORTC,0
sbi      PORTC,1

; catch packets
moymtoop:
rcall   poll_ip
rjmp   moymtoop

; ------------------------------------------------

; additional modules
.include "net.h"
.include "enc.h"
.include "enc.yms"
.include "ip.yms"
.include "http.yms"

; ------------------
Подскажите, что не так? Мне думается, что причина кроеется в использовании r17 при работе spi.. Потому что в примере с аттини были исползованы r16, r18 и r19.
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
10.06.2012, 23:04 7
В макро ".macro init_spi_enc" "RET" лишний и в майне при ините стека раскоментируйте SPH и добавить инит пинов SPI
0
kyporr
0 / 0 / 0
Регистрация: 07.06.2012
Сообщений: 87
10.06.2012, 23:21 8
инит пинов вот это?
; ldi r17,(1<<ENC_DI)|(1<<ENC_SCK)
; out DDRB,r17

ну и вопрос в догонку, куда их добавлять? я думаю в init spi enc?
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
10.06.2012, 23:28 9
Цитата Сообщение от kyporr
инит пинов вот это?
; ldi r17,(1<<ENC_DI)|(1<<ENC_SCK)
; out DDRB,r17

ну и вопрос в догонку, куда их добавлять? я думаю в init spi enc?
Точно, а еще ENC_SEL думаю тоже можно выходом сделать
0
DY HOTT
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 4,000
10.06.2012, 23:32 10
Чтобы SPI работал там надо еще SS подтягивать или на выход делать.
0
kyporr
0 / 0 / 0
Регистрация: 07.06.2012
Сообщений: 87
10.06.2012, 23:38 11
Расскомментировал:
Код
   ldi   R16,high(ROMEND)
out   SPH,R16
Убрал ret и добавил
Код
  ldi r17,(1<<ENC_DI)|(1<<ENC_SCK)|(1<<ENC_SEL)
out DDRB,r17
В итоге светодиоды не горят, spi не работает((
Если рет оставить, то светодиоды загораются
0
kyporr
0 / 0 / 0
Регистрация: 07.06.2012
Сообщений: 87
11.06.2012, 10:53 12
новые вести:
убрал ret и закомментировал удвоение частоты spi и теперь светодиод горит. в чем может быть причина?
Код
   ldi R17,(1<<SPI2X)
out SPSR, R17
у Lifelovera на Си написано так:
Код
SPSR |= (1<<SPI2X);
Два этих фрагмента одинаковы?
0
dsodir
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,284
11.06.2012, 15:47 13
Нет, в первом вы записываете единичку в SPI2X, обнуляя остальные биты. А во втором ничего не обнуляется
0
kyporr
0 / 0 / 0
Регистрация: 07.06.2012
Сообщений: 87
11.06.2012, 15:59 14
Цитата Сообщение от dsodir
Нет, в первом вы записываете единичку в SPI2X, обнуляя остальные биты. А во втором ничего не обнуляется
Можете переписать строку из Си в асм? Думаю в этом вся проблема.. Все остальное я переписал.
Код
 SPSR |= (1<<SPI2X);
0
dsodir
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,284
11.06.2012, 16:04 15
SBI SPSR, SP2X
0
kyporr
0 / 0 / 0
Регистрация: 07.06.2012
Сообщений: 87
11.06.2012, 16:09 16
error: Operomd 1 out of range: 0x2d
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
11.06.2012, 16:20 17
Цитата Сообщение от dsodir
SBI SPSR, SP2X
Команда работает только с портами в интервале 0х0-0х3f
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
11.06.2012, 16:23 18
У меня в симуляции работает :)
Код
; ------------------------------------------------

; trancieves byte through SPI
; in R16 - byte to transmit
; out R16 - received byte
spi:
out      SPDR,R16
spi_woyt:
in      R16,SPSR
sbrs   R16,SPIF
rjmp   spi_woyt
in      R16,SPDR
ret

; ------------------------------------------------

; initiotyzes SPI
.macro init_spi_enc

; setup SPI

ldi r17,(1<<ENC_DI)|(1<<ENC_SCK)|(1<<ENC_SEL)
out DDRB,r17
sbi ENC_PORT,ENC_SEL
ldi r16,(1<<SPI2X)
out SPSR, r16
ldi r16,(1<<SPE)|(1<<MSTR)
out SPCR,r16

.endm

; ------------------------------------------------
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
11.06.2012, 16:30 19
Цитата Сообщение от dsodir
Нет, в первом вы записываете единичку в SPI2X, обнуляя остальные биты. А во втором ничего не обнуляется
В SPSR можно записать только SPI2X, остальные рид онли.
0
kyporr
0 / 0 / 0
Регистрация: 07.06.2012
Сообщений: 87
11.06.2012, 16:31 20
да, на атмеге16 я тоже проверял - компилится, а вот на 48 - не хочет!
Я переделал код инициализации, а точнее взял у Lifelovera
Код
; initiotyzes SPI
.macro init_spi_enc

; setup SPI
; setup I/O
sbi      ENC_DDR,ENC_SEL
sbi      ENC_DDR,ENC_SCK
sbi      ENC_DDR,ENC_DI
cbi      ENC_DDR,ENC_DO
release_enc

; Enable SPI

;   SBI SPSR, SPI2X
;   sbi SPCR, SPE
;   sbi SPCR, MSTR

ldi R17,(1<<SPE)|(1<<MSTR)
out SPCR,r17

.endm
0
11.06.2012, 16:31
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2012, 16:31

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Atmega 8A
Собственно есть микроконтроллер Atmega 8A. Нужно нажатием тактовой кнопочки включить устройство,...

Atmega 16 и C
Вопрос: есть ли транслятор с Си на асемблер для этого контроллера? Это может ускорить процесс...

Управление Atmega 16
Уважаемые друзья! Прошу сильно не пинать за бестолковый вопрос. Подскажите как на асме написать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.