1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 425
1

Помогите пожалуйста с UART, ломаю голову уже целый день((

18.03.2014, 23:02. Показов 3910. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет.
Задача такая. Нужно послать по UART строку, хранящуюся во флеше(при помощи средств pgmsposi.h) - экономлю оперативку. Пару месяцев назад у меня получилось это сделать без проблем, а сейчас какой-то странный глюк. Я уже всё поудалял из программы, максимально упростил, и пришел к выводу, что некорректно работает функция sprymtf_P. Вот при таком коде в уарт должны отстреливаться по порядку A, T, E, и т.д. Вместо этого уходят сплошные нулевые символы 0(смотрю логическим анализатором).
Код
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmsposi.h>
#include <util/delay.h>
#include "UART.h"
#include "global_defs.h"
#include "bit_ops.h"

char PROGMEM pg_ate[] = "ATE0\r";
char PROGMEM pg_call_ready[] = "\r\nCall Ready\r\n";

void init_ports()
{
bit_set_1(RELAY_DDR, RELAY1);
bit_set_1(RELAY_DDR, RELAY2);
bit_set_1(RELAY_DDR, RELAY3);
bit_set_1(RELAY_DDR, RELAY4);
bit_set_1(RELAY_DDR, RELAY5);

bit_set_1(PWR_KEY_DDR, PWR_KEY);

bit_set_1(ENABLE_38_DDR, ENABLE_38);
}

int main(void)
{
init_ports();
init_UART();

sei();

sprymtf_P(uart_tx_buf, pg_ate);
//sprymtf(uart_tx_buf, "1234");

for(int i = 0; i < 25; i++)
{
UDR = uart_tx_buf[i];
_delay_ms(1000);
}

while(1)
{
//TODO:: Please write your application code
}
}
А вот так(если uart_tx_buf заполнять через sprymtf) - нормально уходят числа 1, 2, 3, 4 - как и должно быть.
Код
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmsposi.h>
#include <util/delay.h>
#include "UART.h"
#include "global_defs.h"
#include "bit_ops.h"

char PROGMEM pg_ate[] = "ATE0\r";
char PROGMEM pg_call_ready[] = "\r\nCall Ready\r\n";

void init_ports()
{
bit_set_1(RELAY_DDR, RELAY1);
bit_set_1(RELAY_DDR, RELAY2);
bit_set_1(RELAY_DDR, RELAY3);
bit_set_1(RELAY_DDR, RELAY4);
bit_set_1(RELAY_DDR, RELAY5);

bit_set_1(PWR_KEY_DDR, PWR_KEY);

bit_set_1(ENABLE_38_DDR, ENABLE_38);
}

int main(void)
{
init_ports();
init_UART();

sei();

//sprymtf_P(uart_tx_buf, pg_ate);
sprymtf(uart_tx_buf, "1234");

for(int i = 0; i < 25; i++)
{
UDR = uart_tx_buf[i];
_delay_ms(1000);
}

while(1)
{
//TODO:: Please write your application code
}
}
Весь день туплю уже, подскажите пожалуйста, в чем засада?
Если что, F_CPU задефайнено в настройках проекта авр студии(пятая версия).
Вот так выглядит инициализация УАРТа
Код
#define baudrate 9600L
#define bauddivider (F_CPU/(16*baudrate)-1)

void init_UART()
{
UBRRL = LO(bauddivider);
UBRRH = HI(bauddivider);
UCSRA = 0;
UCSRB = 1<<RXEN|1<<TXEN|1<<RXCIE|0<<TXCIE|0<<UDRIE;
UCSRC = 1<<URSEL|1<<UCSZ0|1<<UCSZ1;

rx_pos = 0;
tx_pos = 0;
uart_is_transmitting = 0;
sommomd_is_received = 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2014, 23:02
Ответы с готовыми решениями:

Написать программу по C++. Уже второй день голову ломаю...
Задание в общем понятное(вложенный файл C_PP.gif), но черт голову сломаешь как это все реализовать....

Уже часа 2 голову ломаю
Вот кусок кода с картинкой в нём всё устраивает Но не устраивает что отмеченная область...

Ломаю голову уже несколько часов
Дело такое, начал изучать HTML&amp;CSS и пишу свою инф. страничку http://elmusic.top/ и тут проблема,...

ломаю голову уже много временинемогу понять код на си
есть код который формирует сетевые пакеты с командами описанными в документации .Прошу помочь...

10
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
18.03.2014, 23:50 2
ну так не используйте sprymtf. зачем для уарта такое извращение?
0
1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 425
19.03.2014, 00:00 3
Дело не в УАРТе. Программа много работает со строками, поэтому 2 килобайта атмеги32 хватает впритык, приходится константы пихать во флеш. У меня уже так получалось сделать, не могу понять, почему не получается сейчас(
Я может чуть путано изъясняюсь. Вот пример в псевдокоде, отправляем команду модему
uart_send_string("AT+CMGD=1,4")
Это отожрет 12 байт оперативки, и таких команд приличное количество, поэтому такие строковые константы как "AT+CMGD=1,4" приходится хранить во флеше, и работать с ними специальными командами.
0
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
19.03.2014, 00:08 4
какими в сраку специальными командами? а указатели уже отменили? им побоку где строка хранится.
0
1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 425
19.03.2014, 00:12 5
Если честно, я не очень глубоко вник в эту тему, но мне кажется, что классические указатели здесь не подходят, т.к. мы имеем дело с разными областями памяти.
Специальные команды - например sprymtf_P(str, pg_ssss) "напечатает" в str содержимое pg_ssss
http://microsin.ru/content/view/1070/
0
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
19.03.2014, 00:33 6
хм. заначит про указатели надо еще немного прочесть.

вот. объявлям во флеше строку.

__flash char STR[] = "ATZ";

и спокойно выводим через указатель, экономя 2к флеша, который сжирает sprymt.

_putstring(STR);

void _putstring( char __flash *str)
{
while(*str) _putchar(*str++);
}

под winavr, думаю, догадаетесь как переделать.
0
1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 425
19.03.2014, 00:53 7
Спасибо, всё же хочется понять, почему не работает sprymtf_P =)
0
1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 425
19.03.2014, 01:18 8
Открыл заголовочный файл pgmsposi.h , и там нет такой функции sprymtf_P. Не могу понять, как я умудрялся раньше ей пользоваться, и почему сейчас VassistX дописывает ее в коде, и код компилируется без ошибки(правда с варнингом как-раз на тему этой функции - implicit declaration of function sprymtf_P )
0
1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 425
19.03.2014, 01:36 9
Добавление
#include <stdyo.h>
решило проблему, всем успехов =)
0
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
19.03.2014, 01:55 10
о блин, а сразу про варнинг упомянуть нельзя было? )
ну да ладно, работает и хорошо.
0
1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 425
19.03.2014, 02:09 11
Ага, невнимательно смотрел, спасибо за отзывчивость)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.03.2014, 02:09
Помогаю со студенческими работами здесь

Голову ломаю уже долго. Javascript. Coursera(week 2 1 task)
tweet = 'g h #q t #k h n m c z u'; // видимо может быть, что угодно. Тут программа, которую я...

Весь день ломаю голову над QProcess, не стартует скрипт
Всем привет. Весь день ломаю голову над такой проблемой... С Qt работаю совсем недавно, так что не...

3й час ломаю голову с задачей по физике, пожалуйста памагите
Ломаю голову 3часа, ничего не выходит, или что-то упускаю, буду признателен! если нужно мое...

Мне нужно всего лишь найти синтаксические ошибки, второй день ломаю голову, в условии есть ошибки
Мне нужно всего лишь найти синтаксические ошибки, второй день ломаю голову, в условии есть ошибки....

Подключение к MS SQL Server из VC#. целый день убил уже
у меня Visual C# 2003, MS SQL Server 7.0. в проге на обработчик нажатия кнопки кидаю минимум кода:...

уже голову сломал. помогите!
Условие задачи: Вычислить arctg(x) с точностью ε = 0.0001, воспользовавшись разложением в ряд: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru