Easyelectronics.ru

Электроника для всех
Текущее время: 27 фев 2017, 16:33

Часовой пояс: UTC + 5 часов



    • Изготовление печатных плат
    • Создание принципиальных схем и проектирование печатных плат
    • Симуляция работы на spice моделях
    • Просмотр GERBER файлов

Начать новую тему Ответить на тему  [ Сообщений: 45 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 08 янв 2017, 17:47 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 1685
видимо, действительно, частота уходила из-за снижения напряжения.
теперь другое.
подключил бп, вывод с устройства на компьютер нормальный, как и ожидается. но не могу добиться теперь передачи с компа на устройство.
огонёк на ардуине мигает в момент печатания - то есть туда уходит. но прошивка отказывается воспринимать.
код стандарттный:
Код:
#include <util/setbaud.h>

void uart_init(void) {
    //асинхронному протоколу 8 бит данных, 2 стоп бита, без контроля четности, скорость 9600 (параметры сигналов OBDII)
    UBRR0H = UBRRH_VALUE;
    UBRR0L = UBRRL_VALUE;
   
#if USE_2X
    UCSR0A |= _BV(U2X0);
#else
    UCSR0A &= ~(_BV(U2X0));
#endif
   
    UCSR0C = _BV(UCSZ01) | _BV(UCSZ00) | _BV(USBS0); /* 8-bit data, 2 stop bits */
    //разрешить прием, передачу данных и прерывание по приёму байта
    UCSR0B = ( 1 << TXEN0 ) | ( 1 << RXEN0 ) | (1 << RXCIE0 );
}

ISR( USART_RX_vect )
{
    unsigned char rxbyte = UDR0;
    if( !FIFO_IS_FULL( uart_rx_fifo ) ) {
        FIFO_PUSH( uart_rx_fifo, rxbyte );
    }
}

ISR( USART_UDRE_vect )
{
    if( FIFO_IS_EMPTY( uart_tx_fifo ) ) {
        //если данных в fifo больше нет то запрещаем это прерывание
        UCSR0B &= ~( 1 << UDRIE0 );
    }
    else {
        //иначе передаем следующий байт
        char txbyte = FIFO_FRONT( uart_tx_fifo );
        FIFO_POP( uart_tx_fifo );
        UDR0 = txbyte;
    }
}

как отдебажить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 08 янв 2017, 18:23 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 1685
тэкс. чтение у меня вот тут
int c = getchar();
while (i<10) {
response1[i]=c;
c = getchar();
i++;
};
и вот выяснилось, что он этот цикл моментально проскакивает, а при отображении якобы полученного символа на экран - там всё черное.
то есть то ли fifo конструкция кривая, то ли прерывание странно работает, но скорей всего я тут опять на собственную глупость напоролся..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 08 янв 2017, 18:36 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 1685
блин. теперь уже на ровном месте: закомментил строчку, и перестало шиться
Код:
/usr/local/CrossPack-AVR/bin/avrdude -p atmega328p -P usb     -c avrisp2    -U flash:w:Builds/main.hex

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e950f
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "Builds/main.hex"
avrdude: input file Builds/main.hex auto detected as Intel Hex
avrdude: writing flash (3190 bytes):

Writing | ################################################## | 100% 1.03s

avrdude: 3190 bytes of flash written
avrdude: verifying flash memory against Builds/main.hex:
avrdude: load data flash data from input file Builds/main.hex:
avrdude: input file Builds/main.hex auto detected as Intel Hex
avrdude: input file Builds/main.hex contains 3190 bytes
avrdude: reading on-chip flash data:

Reading | avrdude: stk500v2_command(): unknown status 0xc9
avrdude: stk500v2_loadaddr(): failed to set load address
avrdude: stk500v2_cmd(): short reply, len = 2
################################################## | 100% 6.39s

avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0000
         0x0c != 0xa4
avrdude: verification error; content mismatch

avrdude done.  Thank you.

make: *** [program] Error 1

причем сама прошивка, похоже, прошивается. не работает именно проверка.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 08 янв 2017, 20:21 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2011, 12:53
Сообщения: 229
avrdude -p atmega328p -P usb -c avrisp2 -U flash:w:Builds/main.hex - почему тут avrisp

Reading | avrdude: stk500v2_command(): unknown status 0xc9 - а тут stk500v2
avrdude: stk500v2_loadaddr(): failed to set load address
avrdude: stk500v2_cmd(): short reply, len = 2


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 08 янв 2017, 20:28 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2011, 12:53
Сообщения: 229
goreprogrammist писал(а):
тэкс. чтение у меня вот тут
int c = getchar();
while (i<10) {
response1[i]=c;
c = getchar();
i++;
};
и вот выяснилось, что он этот цикл моментально проскакивает, а при отображении якобы полученного символа на экран - там всё черное.
то есть то ли fifo конструкция кривая, то ли прерывание странно работает, но скорей всего я тут опять на собственную глупость напоролся..


тут похоже перед циклом нужно переменную i обнулить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 08 янв 2017, 20:38 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 1685
потому что шью авриспом. но с программатором само чудесным образом починилось. хз в чём было дело. просто продолжал шить с ошибкой, а на очередной итерации - и проверка заработала.

с циклом - там всё обнуляется.
нет. там затык был с тем, как релизован этот getchar. а именно, он выдаёт int. посмотрел его устройство - там отрицательные значения бывают в случае ошибок. но при этом на на вход putc должен даваться байт, но беззастенчиво подают то, что приняли в getc.

короче, сделал проверку, чтобы получаемое значение не было отрицательным - и всё заработало.

по-хорошему надо гуглить, как устроен int с отрицательными значениями в avrgcc. и что будет, если на функцию, ожидающую байт, передать вместо байта int.

сейчас у меня другая насущная проблема. в подстроке байт в формате hex (в смысле два символа). их надо перевести в десятичный вид и умножить на 0,01 и представить в виде строки. похоже, придется вводить промежуточные переменные..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 08 янв 2017, 20:44 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2011, 12:53
Сообщения: 229
unsigned int в помощь
http://easyelectronics.ru/file/yazyk-pr ... hnik/122-2


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 08 янв 2017, 21:01 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2011, 12:53
Сообщения: 229
умножение на 0,01 это деление на 100, и то и то сожрет память если не заменить сдвигом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 08 янв 2017, 21:13 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 1685
мне не жалко. по идее тут всего вагон.
упражняюсь вот с этим прямо на компе:
Код:
#include <stdio.h>
int main(void)
{
int MAP=100;
char str[5];
sprintf(str, "%f width 4", MAP*0.01);
str[4]=0;
printf(str);
}

компилятор ругается так:
clang hw.c -o my
hw.c:8:8: warning: format string is not a string literal (potentially insecure) [-Wformat-security]
printf(str);

а при запуске - Abort trap: 6
что не так?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 08 янв 2017, 21:39 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2011, 12:53
Сообщения: 229
sprintf(str, "%f width 4", MAP*0.01); а так вообще можно? sprintf это функция для форматирования строки а не для математики


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 08 янв 2017, 22:19 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 1685
видимо, можно. добился, что на компе работает.
а на ардуине - шиш. и вроде бы даже в результате этой функции в строке появились левые символы, хотел увеличить длину, чтобы посмотреть (начиналось "? wi"), но в самый интересный момент опять перестал работать программатор. сначала не видел порта (грешил на хлипкий усб-переходник), а потом и вовсе вот так:
Код:
avrdude: stk500v2_command(): command failed
avrdude: stk500v2_program_enable(): bad AVRISPmkII connection status: Unknown status 0x00
avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check.


avrdude done.  Thank you.


старая прошивка работает, новая не прошивается. хз что делать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 08 янв 2017, 23:14 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 1685
забавно. откопал второй программтор, который теперь у меня работает через роутер и хаб (да, я гнусный извращенец)
им прошилось ок)
и теперь, при попытке сделать
sprintf(str, "%f width 4", MAP);
я вижу "? width 4" вместо значения
а при попытке
sprintf(str, "%f", MAP);
я вижу просто ?
на компе во втором случае у меня всё работает ок, как задумывалось. в первом случае - вылезает ошибка при исполнении файла.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 08 янв 2017, 23:21 
Старожил

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 1118
goreprogrammist писал(а):
Код:
#include <stdio.h>
int main(void)
{
int MAP=100;
char str[5];
sprintf(str, "%f width 4", MAP*0.01);
str[4]=0;
printf(str);
}

компилятор ругается так:
clang hw.c -o my
hw.c:8:8: warning: format string is not a string literal (potentially insecure) [-Wformat-security]
printf(str);

а при запуске - Abort trap: 6
что не так?


sprintf сформировал количество символов, которое не влезло в твой маленький массивчик из 4 байтиков. Он напечатал в строку примерно так "37.058941 width 4", получилось символов штук 20. 4 символа поместились в массив, а именно "37.0", а дальше печатаемые символы вбились куда-то в другие переменные. Кроме того, строка не была закончена нулевым символом \0, и печать такой строки также приведет к непредсказуемому поведению.

Чтобы ограничить количество печатаемых цифр, придется сильно постараться, если границы числа заранее неизвестны. Я такие штуки делал только своим кодом. Т.е., вбивал в строку, а потом проводил анализ - искал знак минус, точку, прикидывал значение, а потом принимал решение, как выводить. Длина строки должна быть такой, чтобы заведомо вмещать форматный вывод. Для ограничения "%f" есть модификатор "%.3f" - это выведет целую часть, точку и 3 (или сколько надо) знака после запятой. Ограничить целую часть - способа нет.
Код:
char str[20];
sprintf(str, "%.3f\0", MAP*0.01);
{...}


Упс, кажется насчет нуля я проглядел.
Если надо просто выплюнуть строку, используй puts(str). Правильно компилятор предупреждает.


Последний раз редактировалось iev91 08 янв 2017, 23:38, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 08 янв 2017, 23:32 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 1685
а sprintf(str, "%d", 0.1);
выдаёт -13107(d)

попробовал
char str[15];
sprintf(str, "%3f\0", 0.1);
str[14]=0; //наученный вчерашним опытом, я заканчивал массив нулём
lcdPuts(str);
и теперь выдало " ?" (пробел появился)
может, какие-то ключи нужны?

мне надо числа от 0.00 до 2.55 выводить. MAP - один байт. умножаем на 0,01.

фак. точку не заметил.
sprintf(str, "%.3f\0", 0.1);

в выводе пробел перед знаком вопроса исчез. то есть выдает только знак вопроса.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 08 янв 2017, 23:40 
Старожил

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 1118
Уже должно работать. Похоже, у тебя библиотека урезанная.

Borland C 3.1
Код:
#include <stdio.h>
#include <math.h>

char str[15];

void main(void) {
   sprintf(str, "%.3f\0", 0.1);
   puts(str);
}

печатает результат 0.100


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 08 янв 2017, 23:51 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 1685
как нехорошо. блин. а как бы проследить, урезана она, или не особо?
хотя вроде другоо объяснения тому что на компе работает, а тут - нет, не существует?
обидно..
но можно же замутить свою функцию?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 09 янв 2017, 00:02 
Старожил

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 342
Откуда: Германия
В эмбедед printf(%f) часто не реализована.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 09 янв 2017, 00:13 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 1685
замутил. еще предстоит *0.02 (вроде тоже можно справиться.
а вот далее - еще нужно *0.07698 - какое-то знакомое число?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 12 янв 2017, 06:40 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 1685
А вот еще вопрос. Ардуина. Своим уартом она напрямую общается с к-лайн интерфейсом. Но туда же, к этим же ногам, подключен преобразователь уарт-усб. Смогу ли я его в качестве сниффера использовать, сделав screen образовавшемуся порту?

Sent from my XT1058 using Tapatalk


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дисплей HD44780 и то, что было ардуиной
СообщениеДобавлено: 12 янв 2017, 15:08 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 1685
и ещё один хитрый вопрос: чтобы время в тестах на компьютере не терять, можно ли при сборке .c файла на компьютере указать, чтобы он собирал со sprintf от avr-gcc? или это совсем уровень гуру?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 45 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: alexsam, RomanST77, яверт


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB