Проблемка с USART

GOST
Offline
Зарегистрирован: 29.09.2013

Попробовал адаптировать код небезызвесного DI HALT к своей меге 2560, но не сложилось. Помогите найти ошибку.

#define F_CPU 16000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "avrlibdefs.h"
#include "avrlibtypes.h"

#define buffer_MAX 16							// Длина текстового буффера
char buffer[buffer_MAX] = "0123456789ABCDEF"; 	// А вот и он сам
u08 buffer_index=0;

//Прерывание по опустошению буффера УАПП
ISR (USART_UDRE_vect)
{
	buffer_index++;			// Увеличиваем индекс

	if(buffer_index == buffer_MAX)  	// Вывели весь буффер?
	{
		UCSR0B &=~(1<<UDRIE0);	// Запрещаем прерывание по опустошению - передача закончена
	}
	else
	{
		UDR0 = buffer[buffer_index];	// Берем данные из буффера.
	}
}


int main(void)
{

	#define baudrate 9600L
	#define bauddivider (F_CPU/(16*baudrate)-1)
	#define HI(x) ((x)>>8)
	#define LO(x) ((x)& 0xFF)

	//Init UART
	UBRR0L = LO(bauddivider);
	UBRR0H = HI(bauddivider);
	UCSR0A = 0;
	UCSR0B = 1<<RXEN0|1<<TXEN0|0<<RXCIE0|0<<TXCIE0;
	UCSR0C = 1<<UMSEL00|1<<UCSZ00|1<<UCSZ01;

	//Это так, просто помигать.
	#define LED1 7
	#define LED_PORT PORTB
	#define LED_DDR DDRB

	LED_DDR = 1<<LED1;

	sei();

	buffer_index=0;			// Сбрасываем индекс
	UDR0 = buffer[0];		// Отправляем первый байт
	UCSR0B|=(1<<UDRIE0);		// Разрешаем прерывание UDRE

	while(1)
	{
		LED_PORT=0<<LED1;
		_delay_ms(1000);
		LED_PORT=1<<LED1;
		_delay_ms(1000);
	}
}

Код пишу в атмел студии, хекс заливаю через avrdude...

Клапауций
Offline
Зарегистрирован: 10.02.2013

не особо программист - а, что код делает? кроме отправки чего-то куда-то по прерыванию или прекращению отправки по прерыванию и миганию светодиодом, мало что понял.

GOST
Offline
Зарегистрирован: 29.09.2013

ну так он больше ничего и не делает, но проблема в том, что не шлет ничего в юарт, или что-то шлет но в мониторе ничего не видно.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Если использовать обращение к портам, а не к пинам, то при переносе скетча нужно взять даташит на оба МК и шаг за шагом проверить соответствие программирования портов, короче, чтобы оба МК программировались одинаково.

GOST
Offline
Зарегистрирован: 29.09.2013

kisoft пишет:
Если использовать обращение к портам, а не к пинам, то при переносе скетча нужно взять даташит на оба МК и шаг за шагом проверить соответствие программирования портов, короче, чтобы оба МК программировались одинаково.

У меня только один МК, а данные посылаю на комп. Хотел использовать этот код вместо стандартного Serial.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

От этого МК не перестанет быть другим МК. Я в том смысле, что для одного МК хорошо, то другому - смерть :) Хотя как повезет, конечно.

Потому я и написал, если не работает, нужно брать ДШ обоих МК и сравнивать, что пишется в один и проверять, тоже ли самое нужно писать в такой же порт на другом МК. Это самый простой метод (впрочем других и не знаю)

toc
Offline
Зарегистрирован: 09.02.2013

>> Попробовал адаптировать код небезызвесного DI HALT к своей меге 2560

Упомянутый товарищ наверняка создал более одного кода. Дайте ссылку на описание его кода.

Чем стандартный Serial не нравится? В ардуино всё с исходниками, посмотрите реализацию Serial и исправьте под себя.

GOST
Offline
Зарегистрирован: 29.09.2013

toc пишет:

>> Попробовал адаптировать код небезызвесного DI HALT к своей меге 2560

Упомянутый товарищ наверняка создал более одного кода. Дайте ссылку на описание его кода.

Чем стандартный Serial не нравится? В ардуино всё с исходниками, посмотрите реализацию Serial и исправьте под себя.

Вот статья с которой я брал код, подправил только названия регистров и битов.http://easyelectronics.ru/avr-uchebnyj-kurs-rabota-na-preryvaniyax.html

Serial не нравится тем, что я не знаю его принцип работы, а мне нужна шустрая передача на прерываниях.

Исходники Serial я не нашел, потому и взял код DI HALT`a.

Клапауций
Offline
Зарегистрирован: 10.02.2013

GOST пишет:

Исходники Serial я не нашел, потому и взял код DI HALT`a.

я нашёл исходники сериала - в *\arduino-1.0.5\hardware\arduino\cores\arduino всё добро лежит в файлах HardwareSerial.cpp и HardwareSerial.h

com
Offline
Зарегистрирован: 06.09.2013

какой-то странный подход: сериал работает, но я не знаю, как он устроен и не буду его использовать. я знаю другое, и буду его использовать, но оно не работает

GOST
Offline
Зарегистрирован: 29.09.2013

com пишет:

какой-то странный подход: сериал работает, но я не знаю, как он устроен и не буду его использовать. я знаю другое, и буду его использовать, но оно не работает

Может и странный, но если дальше мне понадобится поднять какое-то подобие RTOS и я буду использовать какой-то код, который , возможно, шлет данные в цикле, где большую часть времени просто тупит, то лучше уж я сейчас заставлю работать код, в котором нет ничего лишнего, и который постоен так, как мне нужно.

GOST
Offline
Зарегистрирован: 29.09.2013

>>  я нашёл исходники сериала - в *\arduino-1.0.5\hardware\arduino\cores\arduino всё добро лежит в файлах HardwareSerial.cpp           и HardwareSerial.h

Спасибо, как раз сам добрался до этих файлов, сижу туплю, пробую разобраться.