AVR Assmebly Spi iletişim sorunu

Başlatan sitkitanseltunc, 04 Ekim 2017, 09:53:19

sitkitanseltunc

Spi aracılığıyla bir atmega162'yi master ve bir atmega16a'yı slave olarak kullanarak assembly dilinde seri iletişim kurmaya çalışıyorum ama bir türlü başarılı olmadı. Kodu ekledim bana nerede hata yaptığımı söyleyebilir misiniz? Master'ın MOSI'si Slave'in MOSI'sine,Master'ın MISO'sU Slave'in MISO'suna, Master'ın SCK'yi Slave'in SCK'ine bağlı ve iki breadbord'daki groundlar birbirine bağlı. Slave'in SS pini Master'ın A.0 pinine bağlı. 

Master
.include "m162def.inc"
.def SAYAC1 = R17
.def GECICI = R16
.def SAYAC2 = R18
.def temp = r20

.cseg
.org 0
ldi temp, low(RAMEND)
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp
LDI GECICI,0b11111111
OUT DDRA,GECICI


   

SPI_MasterInit:
; Set MOSI and SCK output, all others input
ldi temp, (0<<UMSEL0)
out UCSR0C, temp
ldi r17,(1<<DDB5)|(1<<DDB7)
out DDRB,r17
; Enable SPI, Master, set clock rate fck/4
ldi r17,(1<<SPE)|(1<<MSTR)|(0<<SPR0)|(0<<SPR1)|(1<<CPOL)|(1<<CPHA)
out SPCR,r17
ldi r18,0b11111010
SPI_MasterTransmit:
RCALL ZAMAN_GEC
LDI   GECICI,0x00
OUT PORTA, GECICI
; Start transmission of data (r16)
out SPDR,r18
Wait_Transmit:
; Wait for transmission complete
sbis SPSR,SPIF
rjmp Wait_Transmit
in r23,SPDR
LDI   GECICI,0x01
OUT PORTA, GECICI
rjmp SPI_MasterTransmit

ZAMAN_GEC:
   LDI SAYAC2, 255
SAY2:

   LDI SAYAC1, 255
SAY1:
   
   
   DEC SAYAC1
   NOP
   NOP
   BRNE SAY1
   DEC SAYAC2
   BRNE SAY2
   RET


Slave:
.include "m16adef.inc"
.def SAYAC1 = R17
.def GECICI = R19
.def SAYAC2 = R18
.def temp = r20
.def dummy = r22

.cseg
.org 0
ldi temp, low(RAMEND)
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp
ldi GECICI,0b11111111
out DDRA,GECICI
ldi r22,0b11111010

SPI_SlaveInit:
; Set MISO output, all others input
ldi temp, (0<<UMSEL)
out UCSRC, temp
ldi r17,(1<<DDB6)
out DDRB,r17
; Enable SPI
ldi r17,(1<<SPE)|(1<<CPOL)|(1<<CPHA)
out SPCR,r17
ret
SPI_SlaveReceive:
; Wait for reception complete
sbis SPSR,SPIF
rjmp SPI_SlaveReceive
; Read received data and return
in r16,SPDR
rcall YAK
;CP r16,r22
;BRBS 1,YAK
rjmp SPI_SlaveReceive

YAK:
LDI   GECICI,0xFF
OUT PORTA, GECICI
rcall ZAMAN_GEC
LDI   GECICI,0x00
OUT PORTA, GECICI
;rjmp SPI_SlaveReceive
RET

ZAMAN_GEC:
   LDI SAYAC2, 127
SAY2:

   LDI SAYAC1, 255
SAY1:
   
   
   DEC SAYAC1
   BRNE SAY1
   DEC SAYAC2
   BRNE SAY2
   RET

 


muhittin_kaplan

Merhaba.
Kodları [ c o d e]  ile [/ c o d e ] etiketleri arasına almanız gerekir.

RaMu

#2
Kodlarınızı tag içene almanız önemli.


MOSI Master Output Slave Input    Efendi Çıkışı Köle Girişi
MISO Master Input  Slave Output   Efendi Girişi Köle Çıkışı

(NOT: Alttaki 3 satırı yanlış yazmışım, en altta doğrusunu ekledim)
       MASTER        SLAVE
Yani MOSI            MISO ya
       MISO            MOSI ye bağlanacak,
       SCK              SCK
ve en önemlisi
      GND              GND ye bağlanacak.

Doğrusu:

     MASTER        SLAVE
Yani MOSI            MOSI ya
       MISO            MISO ya bağlanacak,
       SCK              SCK
ve en önemlisi
      GND              GND ye bağlanacak.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

sitkitanseltunc

Ben önceden MicroBasic Pro ile spi iletişimi yaptım bir atmega162 ve atmega16a arasında. MicroBasic'le yazdığımda MOSI'Yİ MOSI'YE MISO'yu MISO'ya bağladım ve sorunsuz çalıştı. Evet groundlar bağlı ve SCK'ler de bağlı.

sitkitanseltunc

Tamam sorunu hallettim. Master olarak kullandığım atmega162'de sorun varmış. Onu yeni bir atmega162'yle değiştirdim. Ayrıca her iletinin başlamasından önce veriyi master'ın SPDR'ına yeniden yüklemem gerektiğini anladım. Şu anda SPI iletişim sorunsuz çalışıyor.

XX_CİHAN_XX

Alıntı yapılan: RaMu - 04 Ekim 2017, 20:43:03
       MASTER        SLAVE
Yani MOSI            MISO ya
       MISO            MOSI ye bağlanacak,
       SCK              SCK
ve en önemlisi
      GND              GND ye bağlanacak.

Bu ifade de bir yanlışlık var. SPI haberleşmelerinde MOSI -> MOSI ve MISO -> MISO şeklinde bağlanır. Zaten bu ifadelerin de açılımını verdiğiniz üzre Master için çıkış, Slave için giriş olan pin aynı pin (Ya da tam tersi) olduğu için SPI'da, UART'da olduğu gibi çaprazlama yapılmaz.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

RaMu

@sitkitanseltunc
@XX_CİHAN_XX
Doğru söylüyorsunuz. Düzeltme için teşekkürler.

Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

kudretuzuner

#7
Merhaba,
Başka başlık açmadan SPI hakkında sorayım dedim.Master datayı yolladıktan sonra slave'in verilen datayı işlemesini anladım ama işlemi gerçekleştirdikten sonra mastere bilgi(data)yollaması gerekir mi? Yoksa programlayıcının isteğine mi kalmıştır.Profesyonel işlerde standart nedir?
Bu aralar spı ilgimi çekti yeni öğrenmekteyim.Teşekkürler.

https://www.youtube.com/watch?v=hBBW4KfuSg0
https://youtu.be/hBBW4KfuSg0
Amatör

XX_CİHAN_XX

Alıntı yapılan: kudretuzuner - 05 Ekim 2017, 11:46:02
Merhaba,
Başka başlık açmadan SPI hakkında sorayım dedim.Master datayı yolladıktan sonra slave'in verilen datayı işlemesini anladım ama işlemi gerçekleştirdikten sonra mastere bilgi(data)yollaması gerekir mi? Yoksa programlayıcının isteğine mi kalmıştır.Profesyonel işlerde standart nedir?
Bu aralar spı ilgimi çekti yeni öğrenmekteyim.Teşekkürler.

I2C'deki ACK bilgisi gibi birşeyden mi bahsediyorsunuz tam anlamadım ama bunu kastediyorsanız böyle bir şey gerekmiyor. Burada işin espirisi master ve slave'in eş zamanlı olarak aynı clock sinyalinde birbirlerine veri iletebilmeleridir. Senkron veri iletimi söz konusudur. Veri sonunda herhangi bir ACK sinyali üretmek gerekmemektedir. I2C ye göre çok daha yalın bir protokoldür.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Kabil ATICI

Burada iletişimin ne şekilde yürütüleceği size kalmış. Eğer yapılması gereken işlem kritik değilse arkasını aramaya gerek yoktur. Ama yapılması gereken işlem kritik bir öneme sahipse, o zaman slave 'den bir geri bildirim alınması gerekebilir.


Kaldı ki böyle bir haberleşmede çoğu kez birden fazla slave tarafından  spi hattının paylaşılacağı  anlamına gelir ki bu (slave aletlerden)  her yapılan işlem için geri bildirim istemek sistemi yavaşlatacaktır. Hangi slave aletden geri bildirim isteyeceğiniz size kalmıştır. Örneğin bir led yandı bilgisini istemezsiniz, yada LED ekrana yazıldı bilgisini istemezsiniz. Ama bir flash üzerine yazılan bilginin onayına ihtiyaç duyabilirsiniz.
ambar7

kudretuzuner

Merhaba,
spi haberleşmede mesafe nedir? RS485'in max mesafesi nedir? Teşekkürler.
Amatör

mehmet

RS-485 de sadece iki sinyal arasındaki
fark 200mV dan fazla olduğu sürece
mesafenin bir önemi yok. 100 metreden
bile uzun mesafelerle haberleşmek
mümkün olabilmektedir.
Harici gürültüden etkilenmesi çok
düşüktür.

Spi de harici gürültüler verileri etkileyecektir.
Uygun blendajli kablo ile sinyal
seviyeleri fazla düşmeden taşınabilir.
Ancak mesafenin 10 metrenin üzerine
çıkabileceğini sanmıyorum.

RS-485 in güzel yanı; gndler
birlestirilmedigi için farklı besleme
kaynakları kullanmak mümkün olmaktadır.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Kabil ATICI

spi mesafe olarak birkaç 10 cm üzerinde önerilmez.
ambar7