Easyelectronics.ru

Электроника для всех
Текущее время: 25 янв 2017, 02:21

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



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

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

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 1668
видимо, действительно, частота уходила из-за снижения напряжения.
теперь другое.
подключил бп, вывод с устройства на компьютер нормальный, как и ожидается. но не могу добиться теперь передачи с компа на устройство.
огонёк на ардуине мигает в момент печатания - то есть туда уходит. но прошивка отказывается воспринимать.
код стандарттный:
Код:
#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
Сообщения: 1668
тэкс. чтение у меня вот тут
int c = getchar();
while (i<10) {
response1[i]=c;
c = getchar();
i++;
};
и вот выяснилось, что он этот цикл моментально проскакивает, а при отображении якобы полученного символа на экран - там всё черное.
то есть то ли fifo конструкция кривая, то ли прерывание странно работает, но скорей всего я тут опять на собственную глупость напоролся..


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

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 1668
блин. теперь уже на ровном месте: закомментил строчку, и перестало шиться
Код:
/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
Сообщения: 235
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
Сообщения: 235
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
Сообщения: 1668
потому что шью авриспом. но с программатором само чудесным образом починилось. хз в чём было дело. просто продолжал шить с ошибкой, а на очередной итерации - и проверка заработала.

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

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

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

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


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

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


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

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


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

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 1668
мне не жалко. по идее тут всего вагон.
упражняюсь вот с этим прямо на компе:
Код:
#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
Сообщения: 235
sprintf(str, "%f width 4", MAP*0.01); а так вообще можно? sprintf это функция для форматирования строки а не для математики


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

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


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

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 966
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
Сообщения: 1668
а 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
Сообщения: 966
Уже должно работать. Похоже, у тебя библиотека урезанная.

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
Сообщения: 1668
как нехорошо. блин. а как бы проследить, урезана она, или не особо?
хотя вроде другоо объяснения тому что на компе работает, а тут - нет, не существует?
обидно..
но можно же замутить свою функцию?


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

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


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

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


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

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

Sent from my XT1058 using Tapatalk


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

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


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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