Страница 1 из 1

Mega8. перевести с "С+" на ASM. пользов-е UART

Добавлено: Чт дек 25, 2008 14:23:53
Alexeus
Я начал изучать мк на асм (по известному курсу :) ) и на "С" не совсем понимаю что написано. Мне нужно на меге8 задействовать ЮАРТ и передавать (через буфер 232 ессес-но) данные на ПК. Нашел в пример кусок кода на "С", но кто бы мне помог разъяснить или перевести в АСМ его? пжлст :)

#include <mega8>

// Standard Input/Output functions
#include <stdio>
#include <delay>
// Declare your global variables here


void uart_putc(char data) {
while (!(UCSRA & 0x20)); // Wait untill USART data register is empty
// Transmit data
UDR = data;
}

void main(void)
{

PORTB=0x00;
DDRB=0x00;


PORTC=0x00;
DDRC=0x00;

PORTD |= 0x03; // RXD è TXD ïîäòÿãèâàþòñÿ â +U
DDRD &= ~0x01; // RXD âõîä
DDRD |= 0x02;

TCCR0=0x00;
TCNT0=0x00;


TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;


ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;


ACSR=0x80;
SFIOR=0x00;

while (1)
{
// Place your code here
uart_putc (0x52);
delay_ms(200);
};
}

Добавлено: Чт дек 25, 2008 14:36:51
OBIVAN
void uart_putc(char data) {
while (!(UCSRA & 0x20)); // Wait untill USART data register is empty
// Transmit data
UDR = data;
}
Что касается этой части то можно попробовать так:

uart_putc:
sbis ucsra,udre
rjmp uart_putc
out udr,data
ret

Добавлено: Чт дек 25, 2008 14:41:29
Alexeus
смущает безусловный переход rjmp- он ни от чего не зависит- постоянно будет посылать на метку, даже если регистр установлен. команда sbis должна пропускать дальше по коду, а дальше у вас rjmp...

Добавлено: Чт дек 25, 2008 14:49:08
OBIVAN
Она и пропустит rjmp только тогда когда установится разряд

Добавлено: Чт дек 25, 2008 14:59:03
Alexeus
ну Ок. пропустит до rjmp и сразу произойдет безусловный переход опять на метку выше. А в каком случае суждено сработать "out udr,data" ведь он ниже rjmp`a стоит и до него очередь никогда не дойдет...

Добавлено: Чт дек 25, 2008 15:09:01
OBIVAN
[quote="Alexeus"]ну Ок. пропустит до rjmp и сразу произойдет безусловный переход
С этого места поясняю пропустит не до rjmp а сам rjmp, проверял в
свое время все вроде отлично работало

Добавлено: Чт дек 25, 2008 15:22:02
Alexeus
а, в смысле, "через" rjmp перешагнет и не будет безусловного перехода, а сразу после sbis будет out udr,data? это синтаксис команды sbis такой?

Добавлено: Чт дек 25, 2008 15:36:25
OBIVAN
Да так и будет :)

Добавлено: Чт дек 25, 2008 16:36:36
Pooher
это синтаксис команды sbis такой?
Это принцип дейсвия у неё такой.
Даташиты читать надо, чтоб потом людей не путать и самому таких вопросов не задавать. :)

Добавлено: Чт дек 25, 2008 18:45:45
Alexeus
да читаем потихоньку... профессионалами не рождаются, вот и задаем пока глупые вопросы. Зато теперь все предельно ясно. :)