Atmega 162 assembly dili usart ile veri(karakter) gönderme

Başlatan sitkitanseltunc, 24 Ağustos 2017, 13:42:46

sitkitanseltunc

Elimdeki atmega 162 den pcdeki usart terminaline yaklaşık .2 saniye aralıklarla 8,N,1 asenkron seri iletişim formatıyla "A" karakterini göndermeye çalışıyorum. Ama PCdeki terminalden hiçbir veri alamıyorum. Assembly dilinde yazdığım program kodu aşağıda. Nerede hata yaptığımı söyleyebilir misiniz?

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


.cseg
.org 0
RJMP RESET

RESET:
   LDI GECICI,0x04
   OUT SPH, GECICI
   LDI GECICI,0xFF
   OUT SPL, GECICI
   LDI GECICI, 0b00000010
   OUT DDRD, GECICI
   LDI GECICI, 0x40
   OUT PORTD, GECICI
   LDI GECICI, 51
   OUT UBRR, GECICI
   LDI GECICI, (1<<RXEN | 1<<TXEN)
   out UCSR1B,GECICI
   LDI GECICI, (0<<UCSZ12)
   OUT UCSR1B,GECICI
   LDI GECICI, (1<<URSEL1) | (1<<UCSZ10) | (1<<UCSZ11)
   OUT UCSR1C,GECICI
USART_GONDERME:
   sbis UCSR1A, UDRE
   RJMP USART_GONDERME
   LDI GECICI,0b01000001
   OUT UDR,GECICI
   RCALL ZAMAN_GEC
   RJMP USART_GONDERME

ZAMAN_GEC:
   LDI SAYAC2, 255
SAY2:

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

mehmet

Mesajınıza kod eklemek için "KOD" butonunu
kullanınız...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

sitkitanseltunc


Kabil ATICI


yukarıdaki kodun derleme esnasında çok sorun çıkaracağı açık. Çünkü kodlama başka bir işlemci için yapılmış.

Program konusunda keşke daha basit bir işlemci ile başlasaydın.
Çünkü bu işlemcinin 2 tane seri portu var. Bu nedenle hangisini kullanacağını belirtmen gerekirdi.
Kod kenarlarına herhangi bir açıklama yapmadan, senin yapacağını kestirmek zor. 2 saniye olayı için timer kullan.


kullandığın seri port hangisi
kontroller saat frekansın nedir,
baud hızın nedir, yok ben hesapladım çalışıyor diyorsan sen bilirsin.


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

   .CSEG
   .ORG $0000
RJMP RESET

RESET:
   ldi r16,low(ramend)      ;yığın tanımlamm (ram küçük)
   out   spl,r16            ;spi yükle
   ldi r16,high(ramend)      ;yığın tanımlamm (ram büyük)
   out   sph,r16            ;spi yükle
   LDI GECICI, 0b00000010
   OUT DDRD, GECICI
   LDI GECICI, 0x40
   OUT PORTD, GECICI

şu şekilde başla.
diğer kod örneklerinin çoğunlukla datasheet sayfalarında bulunacaktır.

UBRR--
iki registerden oluşuyor
UBRR1L
UBRR1H olarak...

örneğin UART1 için (registeri o şekilde seçmişsin)

  LDI GECICI, (1<<RXEN1 | 1<<TXEN1)
   out UCSR1B,GECICI



madem tx1 kullanılıyor...
   LDI GECICI,0b01000001
   OUT UDR1,GECICI
ambar7

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr