Hallo! I'm currently writing a big lab in university. Serial communication is just a part of a my project. The thing is, I have to do my task in ASM. But I'm still using Arduino as a board. I wrote a code (added it to a message). It has basic things to work with USART-interface. Based on interrupts. I debugged code and tested it with virtual Atmega 1280 (the one installed on my Arduino Mega) and virtual terminal in Proteus. And serial transmission also worked great.
But when I uploaded project to my Arduino and connected it via a virtual com (the one that maps a real one) and terminal in Proteus, I received absolutely nothing! No output to a virtual terminal.
The lights near FTDI that usually tell about RX-TX, don't give any output also.
What might be a reason of it? I had some suspicions connected with ftdi. I connect my Arduino to PC via usb that is recognized like a virtual com-port. Can it be possible that USART output(I use USART0) somehow goes to pins marked like 0 and 1 and doesn't go through ftdi to the actual port I'm using?
Thank you, I appreciate any answer and help of yours!
Code. Don't mind mess with timer, it's okay.
.include "m1280def.inc" ;
;-------DATASEGMENT------------------------------------
.dseg
b: .byte 0xEE
;-------CODESEGMENT:Interuption Vector Table ----------
.cseg
.ORG 0
rjmp MAIN
.ORG $0022
rjmp timerMatchA ; Timer matches A number
.ORG $0032
rjmp receiveInt ; Byte received
.ORG $0034
rjmp emptyInt ; Shift buffer is empty
.ORG $0036
rjmp transmitInt ; Byte transmitted
.ORG INT_VECTORS_SIZE
;-------CODESEGMENT:Interuption Handler ---------------
timerMatchA:
; push r16
; push r17
; in r17, SREG
; ldi r16, 0
; out TCCR1B, r16
; ldi r16, 1<<RXEN|1<<TXEN|1<<RXCIE|1<<TXCIE|1<<UDRIE
; out UCSRB, r16
; ldi r16, 0
; out TCNT1H, r16
; out TCNT1L, r16
; out SREG, r17
; pop r17
; pop r16
reti
receiveInt:
reti
emptyInt:
push r16
push r17
in r17, SREG
brts load1
rcall loadSensor2
rjmp sendByte
load1:
rcall loadSensor1
sendByte:
sts UDR0, r16
ldi r16, 1<<RXEN0|0<<TXEN0|1<<RXCIE0|0<<TXCIE0|0<<UDRIE0
sts UCSR0B, r16
out SREG, r17
pop r17
pop r16
reti
transmitInt:
reti
loadSensor1:
mov r16, r18
ret
loadSensor2:
mov r16, r19
ret
;--------CODESEGMENT:CONSTANTS-------------------------
.equ XTAL = 8000000
.equ BAUD = 9600
.equ NUM = XTAL/(16*BAUD) - 1
.equ TimerMaxValue = 1000/140
;--------CODESEGMENT:CODE------------------------------
UpdateSensor1:
inc r18
ldi r18, 0x42
ret
UpdateSensor2:
ldi r19, 0x43
inc r19
ret
MAIN:
cli
ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
ldi r16, 0
sts TCNT1H, r16
sts TCNT1L, r16
ldi r16, high(TimerMaxValue)
sts OCR1AH, r16
ldi r16, low(TimerMaxValue)
sts OCR1AL, r16
ldi r16, 0
sts TCCR1A, r16
ldi r16, 0
sts TIMSK1, r16
; Setting baud rate
ldi r16, low(NUM)
sts UBRR0L, r16
ldi r16, high(NUM)
sts UBRR0H, r16
; /Setting baud ratw
; Initial inicialization of TX-RX values
ldi r16, 0
sts UCSR0A, r16
; /Initial inicialization of TX-RX values
; Standard packet size
ldi r16, 1<<UCSZ00|1<<UCSZ01
sts UCSR0C, r16
; /Standard packet size
; TX enabled, RX enabled, interrupts on end of RX and TX enabled.
ldi r16, 1<<RXEN0|1<<TXEN0|1<<RXCIE0|1<<TXCIE0|0<<UDRIE0
sts UCSR0B, r16
; /TX enabled, RX enabled, interrupts on end of RX and TX enabled.
sei
ldi r16, 0b11110000
mov r15, r16
next:
ldi r16, 1<<WGM12|1<<CS12|0<<CS11|1<<CS10
sts TCCR1B, r16
lds r19, TCCR1b
;wait1:
in r16, TIFR1
sbrs r16, OCF1A
; jmp wait1
bst r15, 7
rcall UpdateSensor1
ldi r16, 0
sts TCCR1B, r16
sts TCNT1H, r16
sts TCNT1L, r16
ldi r16, 1<<RXEN0|1<<TXEN0|1<<RXCIE0|1<<TXCIE0|1<<UDRIE0
sts UCSR0B, r16
ldi r16, 0xFF
out TIFR1, r16
ldi r16, 1<<WGM12|1<<CS12|0<<CS11|1<<CS10
sts TCCR1B, r16
lds r16, OCR1AL
;wait2:
in r16, TIFR1
sbrs r16, OCF1A
; jmp wait2
bst r15, 0
rcall UpdateSensor2
ldi r16, 0
sts TCCR1B, r16
sts TCNT1H, r16
sts TCNT1L, r16
ldi r16, 1<<RXEN0|1<<TXEN0|1<<RXCIE0|1<<TXCIE0|1<<UDRIE0
sts UCSR0B, r16
ldi r16, 0xFF
out TIFR1, r16
rjmp next
;--------EEPROMSEGMENT---------------------------------
.eseg