Перейти к содержанию

Проблема С Uart Atmega32


Рекомендуемые сообщения

Доброго времени суток.

Толи на меня затмение нашло, толи чёрт его знает... Отправляю байт с компа, чип получает его и отправляет назад без каких либо проблем.

При попытке использовать полученный байт (например как команду) я столкнулся с непонятной проблемой.

Для ясности приведу используемый код.

Инициализация:

#include <stdlib.h>

#include <avr/io.h>

#include <avr/signal.h>

#include <avr/pgmspace.h>

#include <avr/interrupt.h>

#include <util/delay.h>

volatile unsigned char nextChar;

volatile unsigned char dat;

#define UBRR 25

void uart_init(void)

{

cli();

UCSRB |= (1<<RXEN)|(1<<TXEN)|(1<<RXCIE); // UART TX Actiate

UCSRC |= (1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1

UBRRH = (unsigned char) (UBRR << 8); // 38400 Baud Rate on 16 Mhz

UBRRL = (unsigned char) (UBRR);

sei();

}

//Чтение из UART:

ISR(USART_RXC_vect) // get a char from UART

{

nextChar = UDR;

}

//Запись в UART:

void put(unsigned char data) // Put a char

{

while (!(UCSRA & (1<<UDRE)));

UDR = data;

}

//Тело программы:

int main (void)

{

DDRA = 0xFF; //Port A pins as OUTPUT

DDRC = 0xFF; //Port C pins as OUTPUT

DDRB = 0x00; //Set PORTB1 pin as INPUT

PORTB = 0xFF; //Enable internal pull ups

DDRD = (0 << DDD0) | (1 << DDD1) | (0 << DDD2) | (0 << DDD3) | (1 << DDD4) | (1 << DDD5) | (1 << DDD6) | (0 << DDD7);

uart_init();

while (1)

{

if (nextChar != dat){

dat = nextChar; // добавлено при попытке найти ошибку

nextChar = 0; // добавлено при попытке найти ошибку

if (dat == 200) // enable laser

{

// OCR1A = 480; // Servo 0

PORTD |= (1<<PD6);

}

if (dat == 210) // disable laser

{

// OCR1A = 960; // Servo 45

PORTD &= (0<<PD6);

}

if (dat == 220) // enable led projector

{

// OCR1A = 1440; // Servo 90

// PORTC |= (1<<PC1);

}

if (dat == 230) // disable led projector

{

// OCR1A = 1920; // Servo 135

// PORTC &= ~(1 << PC1);

}

if (dat == 240) // disable led projector

{

// OCR1A = 2400; // Servo 180

// PORTC &= ~(1 << PC1);

}

put(dat);

dat = 0; // добавлено при попытке найти ошибку

}

}

Итак проблема. Как ECHO код работает. Тоесть put(dat); возвращает оправленный байт назад. Но попытка прочесть байт, типа "if (dat == 240) {}" ничего не приносит. (Данные отправляю при помощи HTerm, как десятичное число.)

Может кто нибудь подсказать что я не учёл?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Досконально копаться не хочу, поэтому предположение раз

if (nextChar != dat)

у Вас "put(dat);" находиться внутри этого условия, а Ваш шибко умный компилятор при создании "nextChar" и "dat" присваивает им значение "0". То есть "put(dat);" не будет вызвана ни когда.

Изменено пользователем rtfcnf

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Досконально копаться не хочу, поэтому предположение раз

if (nextChar != dat)

у Вас "put(dat);" находиться внутри этого условия, а Ваш шибко умный компилятор при создании "nextChar" и "dat" присваивает им значение "0". То есть "put(dat);" не будет вызвана ни когда.

Спасибо за ответ. Проблема оказалась не в этом, после длительных танцев с бубнами, нашёл, что в одной из процедур инициализации

(в приведённом коде её не было, так-как она не касалась ни UART ни тестовых LED, а только инициализировала таймеры для серво-приводов)

было написано

 POTRD = 0; 

Что по непонятным для меня причинам не мешало работать UART, но не позволяло включить ни один

тестовый LED из подключённых к порту D.

Ссылка на комментарий
Поделиться на другие сайты

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

>>Что по непонятным для меня причинам не мешало работать UART

Выводы порта и регистр порта разные вещи. При включении UART, используемые UART выводы порта отключаются от регистра порта, поэтому Ваша команда "POTRD = 0;" и не мешала работе UART

Изменено пользователем rtfcnf

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...