Реализация MIDI через UART на ATMega8

Обсуждаем цифровые устройства...
Ответить
Serg_nn
Родился
Сообщения: 3
Зарегистрирован: Пт сен 12, 2008 14:50:01
Контактная информация:

Реализация MIDI через UART на ATMega8

Сообщение Serg_nn »

Подскажите пожалуйста как отослать, что то по миди, сколько всего перечитал, перепробовал.. Не получается. Дайте рабочий код на ассемблере..

Вот мой, но не работает он:

Код: Выделить всё

			.include "m8def.inc"	; Используем ATMega8

			.MACRO outi				
			LDI 	R16,@1 			
			OUT 	@0,R16 			
			.ENDMACRO	
		
			.equ 	XTAL = 8000000
			.equ 	baudrate = 31250
			.equ 	bauddivider = XTAL/(16*baudrate)-1

			
			.CSEG
			.ORG 	0x0000			
			RJMP 	Reset			
									
			.ORG	INT0addr		; External Interrupt Request 0
			RETI
			.ORG	INT1addr		; External Interrupt Request 1
			RETI
			.ORG	OC2addr			; Timer/Counter2 Compare Match
			RETI
			.ORG	OVF2addr		; Timer/Counter2 Overflow
			RETI
			.ORG	ICP1addr		; Timer/Counter1 Capture Event
			RETI
			.ORG	OC1Aaddr		; Timer/Counter1 Compare Match A
			RETI
			.ORG	OC1Baddr		; Timer/Counter1 Compare Match B
			RETI
			.ORG	OVF1addr		; Timer/Counter1 Overflow
			RETI
			.ORG	OVF0addr		; Timer/Counter0 Overflow
			RETI
			.ORG	SPIaddr			; Serial Transfer Complete
			RETI
			.ORG	URXCaddr		; USART, Rx Complete
			RETI
			.ORG	UDREaddr		; USART Data Register Empty
			RETI
			.ORG	UTXCaddr		; USART, Tx Complete
			RETI
			.ORG	ADCCaddr		; ADC Conversion Complete
			RETI
			.ORG	ERDYaddr		; EEPROM Ready
			RETI
			.ORG	ACIaddr			; Analog Comparator
			RETI
			.ORG	TWIaddr			; 2-wire Serial Interface
			RETI
			.ORG	SPMRaddr		; Store Program Memory Ready
			RETI
			

			
.ORG	INT_VECTORS_SIZE		; Конец таблицы прерываний

uart_init:	LDI 	R18, low(bauddivider)
	OUT 	UBRRL,R18
	LDI 	R18, high(bauddivider)
	OUT 	UBRRH,R18
	LDI 	R18,0
	OUT 	UCSRA, R18
	LDI 	R18, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)
	OUT UCSRB, R18
	LDI R18, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
	OUT UCSRC, R18
RET

tx_sent:
	uart_snt: SBIS UCSRA,UDRE
	RJMP uart_snt ; ждем готовности - флага UDRE
	OUT UDR, R16
RET

		
delay:
	ldi r16,30
	delay1:
	ldi r17,200
	delay2:
	ldi r18,200
	delay3:
	dec r18
	brne delay3
	dec r17
	brne delay2
	dec r16
	brne delay1
ret 

Reset:	OUTI 	SPL,low(RAMEND) 		

	RCALL 	uart_init	;
	SBI DDRB,1

Main:
	LDI R16, 0x90
	RCALL tx_sent
	LDI R16, 0x3C
	RCALL tx_sent
	LDI R16, 0x7F
	RCALL tx_sent

	RCALL delay

	LDI R16, 0x80
	RCALL tx_sent
	LDI R16, 0x3C
	RCALL tx_sent
	LDI R16, 0x7F
	RCALL tx_sent

	RCALL delay

RJMP Main
Реклама
YurkaM
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Пн сен 01, 2008 14:49:03
Откуда: Казахстан

Сообщение YurkaM »

Ну как минимум, ошибка в задании стека. У меги указатель двухбайтный SPL и SPH. Дальше не смотрел...
Реклама
Serg_nn
Родился
Сообщения: 3
Зарегистрирован: Пт сен 12, 2008 14:50:01
Контактная информация:

Сообщение Serg_nn »

Так я и прошу привести рабочий код, или исправить ошибки
Serg_nn
Родился
Сообщения: 3
Зарегистрирован: Пт сен 12, 2008 14:50:01
Контактная информация:

Сообщение Serg_nn »

На форуме никто не знает как сделать?
Реклама
Эиком - электронные компоненты и радиодетали
AlexBoss
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт окт 14, 2008 03:13:45
Откуда: Донецк

Сообщение AlexBoss »

Ваш код прекрасно работает если корректно настроить стек:
Reset:
OUTI SPL,low(RAMEND)
outi sph,high(RAMEND) ; это просто необходимо!
.....
а дальше все в норме.

Правда компилятор матерится на строку:
.ORG INT_VECTORS_SIZE ; Конец таблицы прерываний
т.к. такая переменная в m8def.inc не описана, но в ней и нет ни какого смысла поскольку процедура uart_init: и так будет расположена сразу за векторами прерываний. Так что эту строку можно безболезненно удалить.
Реклама
YurkaM
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Пн сен 01, 2008 14:49:03
Откуда: Казахстан

Сообщение YurkaM »

AlexBoss писал(а):Ваш код прекрасно работает если корректно настроить стек:...
Автору на это было указано ещё месяц назад.
т.к. такая переменная в m8def.inc не описана
Всё там описано. Вы очевидно пользуетесь древними xxdef.inc файлами. А зря. Многие названия регистров и битов поменялись, и компилятор будет постоянно "материться"...
Реклама
Аватара пользователя
Alexeus
Вымогатель припоя
Сообщения: 690
Зарегистрирован: Вс мар 04, 2007 01:17:12

Сообщение Alexeus »

tx_sent:
uart_snt: SBIS UCSRA,UDRE <----------------------|
RJMP uart_snt ; ждем готовности - флага UDRE <----|
OUT UDR, R16
RET

при попадании в эту метку произойдет зацикливание. никогда не выйдет на out UDR,R16
Ответить

Вернуться в «Цифровая техника»