Проблемка с 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
Спасибо, как раз сам добрался до этих файлов, сижу туплю, пробую разобраться.