[an error occurred while processing this directive]
|
Ты вот пишешь - ldi tmp,0x5F/ldi tmp,0x03. А я напишу ldi tmp,low(ramend)/ldi tmp,high(ramend), и даже не почешусь вычислять, скока это вешать в граммах - численное значение ramend прописано в штатном .inc-файле, и пусть ассемблер себе это сам вычисляет - у него это получится заведомо безошибочно. Точно так же я не буду вычислять значение UBRR, а просто впишу формулу из Datasheet:
.equ fosc = 18432000 ;XTAL frequency, HZ
.equ baud = 115200 ;UART Baud rate, Bauds
.equ bauddiv = (fosc/(16*baud))-1 ;UBRR value for the required Baud rate
ldi tmp,low(bauddiv) ;Set up UART Baud rate
sts UBRR0L,tmp
ldi tmp,high(bauddiv)
sts UBRR0H,tmp
Точно так же я не стану заморачиваться с вычислениями значений управляющих регистров, а поручу это ассемблеру:
ldi tmp,(1 << oc1a)|(1 << oc1b) ;OC1A and OC1B pins are outputs
out ddrb,tmp
ldi tmp,(1 << TXEN0)|(1 << RXEN0)|(1 << RXCIE0)
sts UCSR0B,tmp ;Enable UART transmiter and receiver, enable Rx Complete int
Это избавляет от вполне вероятных ошибок ручного вычисления значений констант и делает текст гораздо более информативным. Ну а насчет вычислений адресов переходов тебе DASM сказал исчерпывающе