Проблемка с USART
- Войдите на сайт для отправки комментариев
Чт, 28/11/2013 - 03:10
Попробовал адаптировать код небезызвесного 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...
не особо программист - а, что код делает? кроме отправки чего-то куда-то по прерыванию или прекращению отправки по прерыванию и миганию светодиодом, мало что понял.
ну так он больше ничего и не делает, но проблема в том, что не шлет ничего в юарт, или что-то шлет но в мониторе ничего не видно.
Если использовать обращение к портам, а не к пинам, то при переносе скетча нужно взять даташит на оба МК и шаг за шагом проверить соответствие программирования портов, короче, чтобы оба МК программировались одинаково.
У меня только один МК, а данные посылаю на комп. Хотел использовать этот код вместо стандартного Serial.
От этого МК не перестанет быть другим МК. Я в том смысле, что для одного МК хорошо, то другому - смерть :) Хотя как повезет, конечно.
Потому я и написал, если не работает, нужно брать ДШ обоих МК и сравнивать, что пишется в один и проверять, тоже ли самое нужно писать в такой же порт на другом МК. Это самый простой метод (впрочем других и не знаю)
>> Попробовал адаптировать код небезызвесного DI HALT к своей меге 2560
Упомянутый товарищ наверняка создал более одного кода. Дайте ссылку на описание его кода.
Чем стандартный Serial не нравится? В ардуино всё с исходниками, посмотрите реализацию Serial и исправьте под себя.
>> Попробовал адаптировать код небезызвесного DI HALT к своей меге 2560
Упомянутый товарищ наверняка создал более одного кода. Дайте ссылку на описание его кода.
Чем стандартный Serial не нравится? В ардуино всё с исходниками, посмотрите реализацию Serial и исправьте под себя.
Вот статья с которой я брал код, подправил только названия регистров и битов.http://easyelectronics.ru/avr-uchebnyj-kurs-rabota-na-preryvaniyax.html
Serial не нравится тем, что я не знаю его принцип работы, а мне нужна шустрая передача на прерываниях.
Исходники Serial я не нашел, потому и взял код DI HALT`a.
Исходники Serial я не нашел, потому и взял код DI HALT`a.
я нашёл исходники сериала - в *\arduino-1.0.5\hardware\arduino\cores\arduino всё добро лежит в файлах HardwareSerial.cpp и HardwareSerial.h
какой-то странный подход: сериал работает, но я не знаю, как он устроен и не буду его использовать. я знаю другое, и буду его использовать, но оно не работает
какой-то странный подход: сериал работает, но я не знаю, как он устроен и не буду его использовать. я знаю другое, и буду его использовать, но оно не работает
Может и странный, но если дальше мне понадобится поднять какое-то подобие RTOS и я буду использовать какой-то код, который , возможно, шлет данные в цикле, где большую часть времени просто тупит, то лучше уж я сейчас заставлю работать код, в котором нет ничего лишнего, и который постоен так, как мне нужно.
>> я нашёл исходники сериала - в *\arduino-1.0.5\hardware\arduino\cores\arduino всё добро лежит в файлах HardwareSerial.cpp и HardwareSerial.h
Спасибо, как раз сам добрался до этих файлов, сижу туплю, пробую разобраться.