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 } } Код
#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
|
|
18.03.2014, 23:02 | |
Ответы с готовыми решениями:
10
Написать программу по C++. Уже второй день голову ломаю... Уже часа 2 голову ломаю
ломаю голову уже много временинемогу понять код на си |
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
|
19.03.2014, 02:09 | |
Помогаю со студенческими работами здесь
11
3й час ломаю голову с задачей по физике, пожалуйста памагите Мне нужно всего лишь найти синтаксические ошибки, второй день ломаю голову, в условии есть ошибки Подключение к MS SQL Server из VC#. целый день убил уже уже голову сломал. помогите! Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |