PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Разработка устройств (http://pccar.ru/forumdisplay.php?f=18)
-   -   Дружим магнитолу RD3-01 от пежо c планшетом (http://pccar.ru/showthread.php?t=27751)

nikey 19.12.2018 00:17

Дружим магнитолу RD3-01 от пежо c планшетом
 
Приветствую.
Раскурочил свою RD3-01, стал изучать... повключал разные ауксы по i2c и всё такое... Стал ковырять дальше... Короче раскопал в ней 3 шины - VAN, SPI, i2c... Взял ардуину уно, прошил её вот этим
https://github.com/lazarov-g/vanread.../master/main.c
кодом и подключил к SPI шине. Ардуино UNO прекрасно видит нажатия рулевых кнопок и выдаёт их на сериал монитор, но на этом, к сожалению, затык... Для управления планшетом, UNO, к сожалению не годится... Нет в ней HID клавиатуры. Нужна леонардо, с её ХИД клавиатурой. НО! код написан, что называется, на низком уровне. т.е. в нём нет инклюд SPI. Нужен специалист, который может подправить код под леонарду, или же написать свой код.
Никто не силён в SPI?

T_r_D 20.12.2018 01:08

А зачем такой изврат?
По CAN всё идёт, зачем в магнитолу лезть?
Но если так хочется, то код должен на любом атмеле работать, только возможно порты надо переназначить.

Инклюд SPI порадовал :)
Открой этот самый файл библиотеки и там будут все эти "низкоуровневые коды"

nikey 21.12.2018 02:04

Цитата:

Сообщение от T_r_D (Сообщение 407276)
А зачем такой изврат?
По CAN всё идёт, зачем в магнитолу лезть?
Но если так хочется, то код должен на любом атмеле работать, только возможно порты надо переназначить.

Инклюд SPI порадовал :)
Открой этот самый файл библиотеки и там будут все эти "низкоуровневые коды"

Вот!!! Братан, ты то мне и нужен!!! Сразу видно - понимающий спец! Ты не понял, это не изврат! Тут всё продумано! Смотри:
Про CAN, забудь... не забивай себе голову, там VAN (E-manchester, они похожи) Когда я нажимаю кнопки на руле, команды по VAN шине летят в магнитолу. В магнитоле стоит уже готовый VAN контроллер (MTC30521 + TSS463C) управляемый магнитольным процессором. Процессор обменивается данными с VAN микросхемами по SPI шине (глянь на схему в ссылке там всё понятно. Это часть схемы магнитолы) Т.е. придумывать и разрабатывать ничего не нужно!!! Всё итак готово!
Всё что мне нужно - это припаять к SPI шине TSS463C леонарду (6 проводочков) , сделать леонарду SPI слейвом, чтоб она отслеживала команды нажатий рулевых кнопок и передавала их на планшет. Как передавать команды на планшет - я, думаю разберусь... А вот как правильно настроить леонарду в качестве SPI слейва... тут у меня затык... настраивать её надо на основе того кода что в ссылке. Там указана полярность сигнала, какой бит летит первым, маски регистров, ну и всё такое.
Я в тырьнете нарыл код для SPI слейва, прошил им леонарду, вывел поток данных в монитор порта и... мама дорогая... Сколько ж там циферек!!! Вобщем загвоздка состоит в том что я не знаю - правильная ли это прошивка и правильные ли это циферки... У меня есть одна идейка... Эх ладно... попробую, потом расскажу. Эх жалко что на форум нельзя картинки заружать

seriousstas 22.12.2018 00:01

Цитата:

Эх жалко что на форум нельзя картинки заружать
Есть два варианта:
1 Выбери расширенный режим=>управление вложениями.
2 Залей на хостинг и вставь готовую ссылку - например сюда

T_r_D 23.12.2018 18:09

Как я выше и написал уже- код работает на любой атмеге.
Просто надо переконфигурировать порты/ноги.
Нужно знать только на какой ноге ЮАРТ и SPI в другой атмеге.
Тут это надо переправить:
DDRB |= (1 << DDB3) | (1 << DDB5) | (1 << DDB2) | (1 << DDB1) | ( 1 << DDB0);

PORTB |= ( 0 << PINB0);
PORTB |= ( 1 << PINB2);
SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPOL) | (1 << CPHA);
byte clr = SPSR;
clr = SPDR;
(void)clr;

DDRB настройка порта B
PORTB доконфигурирование отдельных ног порта.

SPCR настраивает режим SPI.
как настроить ссылка:
http://www.gaw.ru/html.cgi/txt/doc/m...mega103_49.htm

Как настраиваются ноги порта:
http://easyelectronics.ru/avr-uchebn...da-vyvoda.html

А дальше стоит прерывание реагирующие на появление данных в SPI порту.
Так что это код работает на любой меге, просто надо сконфигурировать под неё порты.

А вот тут мы это получаем из прирывания (точнее буфера):
while (1)
{
if( !error) {

button = register_get( GETMAIL( 1));
wheel = register_get( GETMAIL( 2));

if( wheel > oldwheel || wuloop != ( button & ( 1 << WUP))) {
wuloop = ( button & ( 1 << WUP));
oldwheel = wheel;
PORTB |= ( 1 << PINB0);
execCmd( tup);
PORTB &= ~( 1 << PINB0);
}
else if( wheel < oldwheel || wdwnloop != ( button & ( 1 << WDWN))) {
wdwnloop = ( button & ( 1 << WDWN));
oldwheel = wheel;
PORTB |= ( 1 << PINB0);
execCmd( tdwn);
PORTB &= ~( 1 << PINB0);
}
else if ( button & ( 1 << SRC)) {
execCmd( source);
}

PORTB |= ( 1 << PINB0);
и
PORTB &= ~( 1 << PINB0);
Это мигание светодиодом как я понимаю

execCmd( tdwn); это отправка в UART.
Вместо отправки в UART можно делать что угодно.
Ну условия все эти проверяют что пришло в посылке SPI.

PS. Про RD3 почитал. Там действительно нет КАН походу...
У RD4 Уже есть...

nikey 23.12.2018 23:18

Цитата:

Тут это надо переправить:
DDRB |= (1 << DDB3) | (1 << DDB5) | (1 << DDB2) | (1 << DDB1) | ( 1 << DDB0);
Пробовал... Бесполезно
Чтото я делаю не то... Там ещё по ходу кода надо чтото смотреть мож что-то надо изменить.

Цитата:

А вот тут мы это получаем из прирывания (точнее буфера):
while (1)
{
if( !error) {

button = register_get( GETMAIL( 1));
wheel = register_get( GETMAIL( 2));

if( wheel > oldwheel || wuloop != ( button & ( 1 << WUP))) {
wuloop = ( button & ( 1 << WUP));
oldwheel = wheel;
PORTB |= ( 1 << PINB0);
execCmd( tup);
PORTB &= ~( 1 << PINB0);
}
else if( wheel < oldwheel || wdwnloop != ( button & ( 1 << WDWN))) {
wdwnloop = ( button & ( 1 << WDWN));
oldwheel = wheel;
PORTB |= ( 1 << PINB0);
execCmd( tdwn);
PORTB &= ~( 1 << PINB0);
}
else if ( button & ( 1 << SRC)) {
execCmd( source);
}

PORTB |= ( 1 << PINB0);
и
PORTB &= ~( 1 << PINB0);
Это мигание светодиодом как я понимаю
Не! )))) Это не мигание ))) Я точно сам не знаю что, но это... как бы это сказать-то... код нажатия кнопок чтоли...

void loop() {

while (1)
{
if( !error) {

button = register_get( GETMAIL( 1));
wheel = register_get( GETMAIL( 2));

if( wheel > oldwheel || wuloop != ( button & ( 1 << WUP))) {
wuloop = ( button & ( 1 << WUP));
oldwheel = wheel;
PORTB |= ( 1 << PINB0); //Установить "1" на линии SS?
execCmd( tup);
PORTB &= ~( 1 << PINB0); //Установить "0" на линии SS?
Serial.println ("колесо вверх");
}
else if( wheel < oldwheel || wdwnloop != ( button & ( 1 << WDWN))) {
wdwnloop = ( button & ( 1 << WDWN));
oldwheel = wheel;
PORTB |= ( 1 << PINB0); //Установить "1" на линии SS?
execCmd( tdwn);
PORTB &= ~( 1 << PINB0); //установить 0 на линии SS?
Serial.println ("колесо вниз");
}
else if ( button & ( 1 << SRC)) {
execCmd( source); // source = 0xfd; // 1.20 kom
Serial.println ("источник");
}
else if ( ( button & ( 1 << VUP)) && ( button & ( 1 << VDWN))) {
execCmd( att);
Serial.println ("атт какойто");
}
else if ( button & ( 1 << VDWN)) {
execCmd( voldwn);
Serial.println ("громк-");
}
else if ( button & ( 1 << VUP)) {
execCmd( volup);
Serial.println ("громк+");
}
else if ( button & ( 1 << SDWN)) {
execCmd( tdwn);
Serial.println ("т вниз");
}
else if ( button & ( 1 << SUP)) {
execCmd( tup);
Serial.println ("т вверх");
}

register_set( CHANNEL_ADDR( 0) + 3, 0xf8);
}
else {
tss_init();
}
delay(10);
}

}
Это мною добавленны команды вывода на сериал порт...
Короче, когда нажимаешь кнопки на руле, то в сериал порте пишется - громкость вверх... громкость вниз... колесо вверх... колесо вниз... )))

..........................
PORTB |= ( 1 << PINB0); //Установить "1" на линии SS
execCmd( tup);
PORTB &= ~( 1 << PORTB |= ( 1 << PINB0); //Установить "1" на линии SS
execCmd( tup);
PORTB &= ~( 1 << PINB0); //Установить "1" на линии SS); //Установить "1" на линии SS

Это я прокомментировал как управление SS... но это не точно!!!

Что такое PINB0 я не знаю

nikey 24.12.2018 00:00

леонардо(32u4):
SCK он же PB1... 9 нога чипа (15вывод)
MISO он же PB3... 11 нога чипа (14вывод)
MOSI он же PB2... 10 нога (16 вывод)
SS он же PB0... 8 нога (17 вывод его нет, на нём светодиод висит. Светик выпаял и припаял проводянку)

уно (328P):
SCK он же PB5... 17 нога чипа 13вывод
MISO он же PB4... 16 нога чипа 12вывод
MOSI он же PB3... 15 нога 11вывод
SS он же PB2... 14 нога 10вывод

у чувака на схеме 17 нога чипа - моси, 18нога чипа - мисо, 19 нога чипа - SCLK... не совпадос, но работает! Правда у него корпус PDIP, а у меня на UNO маленький не знаю как называется
ПИПЕЦ!!! я запутался!!!

T_r_D 24.12.2018 06:26

Ну идея ясна думаю?
Я просто в ногах атмела разбираться не хочу.
В чём-то могу и ошибаться, просто реально давно атмелы не програмил.
На стм переполз.

Да и про сериал я прав. Про вывод туда команд.
Про диод не угадал, хотя очень было похоже.
Распиновки под рукой нету, с мобилы полутрезвый пишу :)
Посильную помощь надеюсь оказал...

nikey 24.12.2018 10:27

Да идея-то ясна, а вот нюансы!... я многого не догоняю, а в тырнетах этого не могу найтить.

Про диоды ты, можно сказать, угадал. Именно так им и мигают )
Цитата:

На стм переполз.
предатель )))
Ладно, спасибо, буду ковырять дальше. Дюже затягивает эта бодяга

T_r_D 24.12.2018 13:14

Да про диоды и гадать нечего.
Нога подтягивается то к высокому уровню, то к низкому.

А СТМ шустрее и программная среда под него покруче ардуино ИДЕ.
Хотя для ардуино можно и атмел студию пользовать, но зачем?
Если по цене ардуины та же блю пилл (stm32f103c8t6)?
Но по скорости в 5 раз быстрее и порты все аппаратные включая CAN.

nikey 24.12.2018 19:40

Понял. Я так и думал ))
T_r_D, я кажется нашёл ещё одну хрень... Смотри:

EICRA |= (1 << ISC01);
EIMSK |= (1 << INT0);

Я в прерываниях ещё не совсем шарю... но, вот вторая строка... Я так понимаю в бит под названием INT0 (регистра EIMSK) мы пишем единичку? Так?... чем мне это грозит?... У меня на 32u4 вывод PCINT0 совпадает с выводом SS он же PB0, чего быть не должно. Это опасно или я чото путаю?... В 328p вывод PCINT не совпадает с SS!
PCINT0 и INT0 - это разные вещщи?!...

Напомнило анекдот про чукчу... Карл маркс и фридрих энгельс это не четыре человека, а два! А слава КПСС - вообще не человек ))))))

T_r_D 24.12.2018 22:46

Если совпадают выводы, то так нельзя оставлять.
Ведь это внешний вывод при приходе сигнала на который будет срабатывать внешнее прерывание.

Но у тебя есть второе прерывание- INT1.
И оно на другой ноге.
Так что можно поменять.
EICRA |= (1 << ISC11);
EIMSK |= (1 << INT1);

Ну и пару ссылок чтоб было понятнее:
http://mainloop.ru/avr-atmega/avr-ex...interrupt.html
http://arduino.ru/forum/programmirov...preryvaniyam-0

PS. Не забудь разрешить обработку прирывания INT1 вместо INT0 (всё подробно в первой ссылке).
И кстати я этого в коде не вижу?
К этой ноге точно что-то подключено от трансивера?
А то код настройки прирывания есть, а включения его нет!
GICR |= 1< Но там только включение глобального прерывания есть sei();

Ещё ссылка на английском, но более наглядная:
http://www.avr-tutorials.com/interru...nal-Interrupts

Ха! Точно!
ISR(INT0_vect)
{
//interr = register_get( INTSTATUS);
//if( interr & ( 1 << ROKR) && interr & ( 1 << RNOKR))
//register_set( INTRESET, 0x83);
//inter |= ( 1 << 1) | (1 << 0);
//register_set( INTRESET, 0x00);
};
Обработчик прерывания пустой!
В общем эта настройка нафиг не нужна.
Не помню sei(); надо оставлять для конвеера SPI или нет, но вроде нет...
Так что настройку внешнего прерывания и включение глобального не имеет смысла оставлять.

T_r_D 29.12.2018 11:40

Видимо всё получилось раз тишина. :)
Удачи в разработке!

nikey 30.12.2018 00:44

Цитата:

Сообщение от T_r_D (Сообщение 407468)
Видимо всё получилось раз тишина. :)
Удачи в разработке!

Да ну... какой там! :no:
Во-первых работа не даёт нихрена вникнуть толком, что такое прерывание... до койки б доползти...
Событие, событие... какое нахрен событие... восьмую ногу (pcint0) завалили на массу (или на плюс) - это чтоль событие?...
EIMSK |= (1 << INT0)
В схеме вроде как наоборот, ардуино управляет транзюком, а не транзюк ардуиной...
короче в голове пока каша... на новый год вместо того чтоб втыкать в зомбоящщик и смотреть на педиков пенсионеров, буду ставить эксперименты.
Вот эта канитель: EIMSK |= (1 << INT0) что это?..
на вывод инт0 подали 5 вольт? так?

T_r_D 30.12.2018 14:07

Нет.
EIMSK |= (1 << INT0) разрешает обработку прибывания 0.

Я выше затупил.
Так что прирывание включилось.

Тоесть вывод INT0 настроен на реакцию на внешний импульс и срабатывание будет по заднему фронту отрицательного импульса.

Другими словами:
EICRA |= (1 << ISC01);
EIMSK |= (1 << INT0);
sei();
Включит обработку прирывания на выводе INT0 по отрицательному импульсу его спаду.

EICRA |= (1 << ISC11);
EIMSK |= (1 << INT1);
sei();
Включит обработку прирывания на выводе INT1 по отрицательному импульсу его спаду.

А ещё проще- если на выводе INT0 (или INT1) появляется отрицательное напряжение, то после прекращения его подачи обработается код прерывания:
ISR(INT0_vect)
{
//interr = register_get( INTSTATUS);
//if( interr & ( 1 << ROKR) && interr & ( 1 << RNOKR))
//register_set( INTRESET, 0x83);
//inter |= ( 1 << 1) | (1 << 0);
//register_set( INTRESET, 0x00);
};

Но поскольку в теле функции ни чего нету (всё закоменчено), то ни чего и не произойдёт.

А прерывание это аппаратный приоритет кода.
Тоесть как только будет вызвано событие прерывания, основной код остановит своё выполнение и отработается код из функции прерывания.

НО!
Поскольку в коде прерывания пусто, то настраивать и разрешать его не имеет смысла!

И на схеме видно что выводы INT0(4) и INT1(5) ни куда не подключены!
Тоесть не парься по поводу этих строк.
Можешь их из кода вообще выкинуть и функцию тоже.
Ни чего не изменится.

Видимо был рассчёт на то, что контроллер шины или выдаёт импульс на приём пакета или что очевиднее это увод в SLEEP контроллера когда на шине тихо.
Но это ни как не реализовано.
Задействованы ноги PB0-5.
А именно сигналы GPIO (PB0), CS2(PB1), CS1(PB2) это как цифровые выходы.
И PB3-5 - MOSI, MISO, SCK как SPI шина.

Ну и PD0 и PD1 как UART.

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

nikey 30.12.2018 16:52

Цитата:

И на схеме видно что выводы INT0(4) и INT1(5) ни куда не подключены!
епжтв@южм@ть!!!! оказывается PCINT0 и INT0 это разные вещщи!!!... Твоюжмать!!!... вернее, разные ноги... А чтож тогда такое это самое PCINT0...12? Ладно хрен с ними... с ними вроде разобрались

Цитата:

Так что забудь о прерывании.
При переделке кода на другой контроллер нужно поменять назначения 8 выводов если они не совпадают (те что написал выше).
это какие?... вот эти чтоль:
Цитата:

GPIO (PB0), CS2(PB1), CS1(PB2) это как цифровые выходы.
И PB3-5 - MOSI, MISO, SCK как SPI шина.
Ну и PD0 и PD1 как UART.
Так-с... начнём по-порядку:
PB0...
Этот вывод подсоединён к базе транзистора и он мне не нужен. Соответственно, там где в коде есть - "PINB0", удаляем её (вернее комментим на всякий случай).


PB1... он же SS2, управляет электронным потенциометром. Я управлять им не собираюсь. Соответственно там где в коде содержится надпись "PB1", вернее PINB1, смело удаляем эти строки. Так?...

void execCmd( const byte cmd)
{
// PORTB &= ~( 1 << PINB1); // заземляем вывод SS это точно!!!)))
// spi_transfer( 0x11); //передаём по spi
// spi_transfer( cmd); //передаём по spi
// PORTB |= ( 1 << PINB1); // отпускаем SS
// delay( CMD_WAIT_MS); //задержечка 50 милисек
// PORTB &= ~( 1 << PINB1); // опять заземляем SS это точно!!
//spi_transfer( 0x11); //передаём по spi
//spi_transfer( nocmd); //передаём по spi
// PORTB |= ( 1 << PINB1); // и отпускаем SS
};
Иначе, если этого не сделать, то в моём контроллере 32U4 эти 4 строчки будут валить вывод SCLK он же PB1 на массу. Так?...
Я их тоже закомментил чтобы не удалять совсем.

Далее идёт PB2... он же контакт SS для TSS463C
Соответственно, мне надо строчки PINB2 заменить на PINB0, потому что на моей атмеге 32U4 вывод SS - это PB0. Так же думаю что не обязательно заменять на PINB0... Можно, пожалуй и на PINB6, чтоб рядышком было

PB3-5 - MOSI, MISO, SCK как SPI шина
Вот тут затык!... нету таких строчек где было б указано PINB3, PINB4, PINB5, видимо тут как-то все назначается автомасиськи

PD0 и PD1... Опять затык!... где это в коде прописано? Нет такого!...
У меня в 32U4 юарт находится на ногах:
TXD1 - PD3 (PD1 атмега 328)
RXD1 - PD2 (PD0 атмега328)
Надеюсь я правильно понимаю что юарт это RX и TX... И в 32U4 там какаято хрень с этим юартом... толком не пойму какая там два юарта чтоли...
И, кстати!!! причём тут этот самый юарт?... разве в коде он гдето есть?

execCmd - это юарт?...

помоему вот эта строка:
execCmd( source); отправляет по SPI команду на цифровой потенциометр, чтоб он выставил определённое сопротивление, в данном случае source у нас равна 0xfd т.е - 1.20 kom
разве нет?

T_r_D 30.12.2018 21:59

Ой как ты далеко от этого!
Смотри!
Открываем даташит на 328:https://d3s11pzv7w3h1q.cloudfront.ne...GA328-PU-3.jpg

Видишь что внутри корпуса написано?
Это физические контакты.
А снаружи что они делают.
Соответственно Ищем даташит на 32U4
https://www.arduino.cc/en/uploads/Ha...PinMapping.png

И если в коде ни чего менять не хочешь то ищешь какой вывод какому соответствует и просто меняем их физически.
Если хочешь сделать удобнее их расположение, то придётся в прошивке менять выводы и порты.
Но есть выводы которые ты не сможешь поменять!
SPI и UART будут именно на тех выводах, что написаны на контроллере.
А вот цифровые входы-выходы можно менять на любые.
Тоесть выводы PB0-2 можешь назначить любые удобные поменяв их в коде,
А выводы MOSI, MISO, SCK, RX, TX будут только те, что написаны в даташите.

Смотрим на 32U4 и понимаем что выводы SPI занимают те же выводы что и нужные нам цифровые входы-выходы.
Тоесть придётся менять на другие.
Тоесть скажем PORTB |= ( 1 << PINB1);
это вывод PB1 можно сделать любым, только помни что с номером вывода меняется и порт.
PORTА |= ( 1 << PINА1);

T_r_D 30.12.2018 22:13

Тоесть шины данных ищем по даташиту, если у нового контроллера они совпадают с задействоваными нами цифровыми входами-выходами, то переназначаем цифровые порты, а не шины.
у 32U4
SCK равен PB0 который у нас занят в исходнике.
Так что PB0 придётся переносить на любой удобный нам вывод.
И так далее.

Сначала подключи все шины, потом смотри какие выводы удобно использовать чтоб дорожки не перекручивать особо.
можно их двинуть на PB4-6... Меньше циферок в коде менять.
PB0 > PB4
PB1 > PB5
PB2 > PB6
В коде соответственно
PINB0 > PINB4
PINB1 > PINB5
PINB2 > PINB6
Всё, дальше подключаешься в соответствии с ремапом и вперёд.
Даже порт не менять если тяжело по началу.

PS!
Чуть не забыл!
Если плата спаяна уже или купил готовую, то просто используй переходник UART<>USB.
Всё равно софтину свою писать для планшета, так что не важно HID это будет устройство или конвертер уровня.
Тем более что если думаешь что будет просто завести HID с одновременной эмуляцией клавы и порта воода-вывода, то сильно заблуждаешься.

nikey 31.12.2018 00:05

Блин... у меня такое чувство что ты меня держишь за полного идиота, но это не совсем так! ))) С даташитами обоих контроллеров я разве что не сплю. Я пробовал переназначать выводы (щас уже не вспомню с каких на какие, ибо пробовал по-разному), но толку - НОЛЬ!!! Видимо где-то в какой-то строчке закралась ошибочка и... в монитор порта выводятся не те команды
Короче... Я б тебе показал бы свой модифицированный код, и прокомментировал бы как он работает, но здесь на форуме его хрен вставишь... На почту могу скинуть

Цитата:

Тем более что если думаешь что будет просто завести HID с одновременной эмуляцией клавы и порта воода-вывода, то сильно заблуждаешься.
не совсем понимаю что такое завести хид, но на сайте DIXOM есть готовая библиотека с помощью которой можно управлять громкостью планшета или ноутбука... Только команды вставить где нужно. Я уже пробовал это делать. Громкостью ноутбука управляю, но т.к. код не допилен, то соответственно получается полная ерунда. Т.е. я кнопки на руле не нажимаю, а команды нажатия всёравно лезут в ноутбук... абы какие...
Хрен его знает что в коде не так... Что там с ЮАРТом? Так и не ответил...

Цитата:

В коде соответственно
PINB0 > PINB4
PINB1 > PINB5
PINB2 > PINB6
PINB0 PINB1 мне не нужны!!!! Я эти строчки тупо сотру и всё...
А вот там где в коде будет - PINB2, я напишу - PINB0! Но этого недостаточно! Чтото где-то ещё клинит... Юарт?...

Цитата:

И если в коде ни чего менять не хочешь то ищешь какой вывод какому соответствует и просто меняем их физически.
Даже если не хочу, то всёравно это сделать придётся, ибо накладки... от них придётся избавляться

Цитата:

Если хочешь сделать удобнее их расположение, то придётся в прошивке менять выводы и порты.
))) без фанатизма! )))))

T_r_D 31.12.2018 07:47

Выводы PB0-2 на промикре это SPI.
Так что цифровые выводы придётся сдвинуть как не крути. И сдвинуть их проще на PB4-6.
При этом в коде менять минимум.

А что с УАРТом не так?
В коде про него ни слова нет.
И о порте D тоже.

Если хочешь с UART работать не средствами arduino ide, точнее библиотеки оттуда, то вот это почитай:
https://alex-exe.ru/radio/avr/avr-uart/

Но зачем он тебе?
Включи порт на котором диод на микре и мигай им как принят пакет. Ну чтоб видеть что происходит по началу.
Потом прикручивай уже usb.

В принципе тебе надо всего 3 ноги изменить для промикры. Или одну если обвес ещё из двух микрух не нужен.

И посмотри скорость кварца, а то в коде стоит 16 мегагерц.
При прошивке ардуино иде вообще можно это из кода убрать.

PS. Вот нормальный пример работы с uart.
Стоит заметить что скорость зависит от частоты тактирования проца
Цитата:

define F_CPU 8000000 // Рабочая частота контроллера
#define BAUD 9600L // Скорость обмена данными
#define UBRRL_value (F_CPU/(BAUD*16))-1 //Согластно заданной скорости подсчитываем значение для регистра UBRR

#include
#include

void init_USART() {
UBRRL = UBRRL_value; //Младшие 8 бит UBRRL_value
UBRRH = UBRRL_value >> 8; //Старшие 8 бит UBRRL_value
UCSRB |=(1< UCSRC |=(1<< URSEL)|(1<< UCSZ0)|(1<< UCSZ1); //Устанавливем формат 8 бит данных
}

void send_UART(char value) {
while(!( UCSRA & (1 << UDRE))); // Ожидаем когда очистится буфер передачи
UDR = value; // Помещаем данные в буфер, начинаем передачу
}

int main(void)
{
init_USART(); //инициализация USART в режиме 9600/8-N-1
send_UART(0x53); //посылаем ASCII код знака 'S'
send_UART(0x2D); //посылаем ASCII код знака '-'
send_UART(0x45); //посылаем ASCII код знака 'E'
while(1)
{
_delay_ms(1000);
}
}


nikey 31.12.2018 13:27

Цитата:

Но зачем (UART) он тебе?
Включи порт на котором диод на микре и мигай им как принят пакет. Ну чтоб видеть что происходит по началу.
Потом прикручивай уже usb.
ЮАРТ, это что? RX и TX?... не знаю нужны они мне или нет. Ты ж сам говорил их надо переназначать зачем-то. Кстати, я так и не понял может этот ЮАРТ конфликтует с чем-то...
Цитата:

Задействованы ноги PB0-5.
А именно сигналы GPIO (PB0), CS2(PB1), CS1(PB2) это как цифровые выходы.
И PB3-5 - MOSI, MISO, SCK как SPI шина.

Ну и PD0 и PD1 как UART.
Короче... вот часть кода, которую я переделал:

Цитата:

void loop() {

while (1)
{
if( !error) {

button = register_get( GETMAIL( 1));
wheel = register_get( GETMAIL( 2));

if( wheel > oldwheel || wuloop != ( button & ( 1 << WUP))) {
wuloop = ( button & ( 1 << WUP));
oldwheel = wheel;
// PORTB |= ( 1 << PINB0); //Установить "1" на линии SS
execCmd( tup); // 0xeb... 8.00 k
// PORTB &= ~( 1 << PINB0); //Установить "0" на линии SS
Serial.println ("колесо вверх");
}
else if( wheel < oldwheel || wdwnloop != ( button & ( 1 << WDWN))) {
wdwnloop = ( button & ( 1 << WDWN));
oldwheel = wheel;
// PORTB |= ( 1 << PINB0); //Подтягивающий резистор к порту PB0 Установить "1" на линии SS
execCmd( tdwn);
// PORTB &= ~( 1 << PINB0); //установить 0 на линии SS
Serial.println ("колесо вниз");
}
else if ( button & ( 1 << SRC)) {
execCmd( source); // source = 0xfd; // 1.20 kom
Serial.println ("источник");
}
else if ( ( button & ( 1 << VUP)) && ( button & ( 1 << VDWN))) {
execCmd( att);
Serial.println ("атт какойто");
}
else if ( button & ( 1 << VDWN)) {
execCmd( voldwn);
Serial.println ("громк-");
}
else if ( button & ( 1 << VUP)) {
execCmd( volup);
Serial.println ("громк+");
}
else if ( button & ( 1 << SDWN)) {
execCmd( tdwn);
Serial.println ("т вниз");
}
else if ( button & ( 1 << SUP)) {
execCmd( tup);
Serial.println ("т вверх");
}

register_set( CHANNEL_ADDR( 0) + 3, 0xf8);
}
else {
tss_init();
}
delay(10);
}
С помощью него я в сериал порте вижу нажатия рулевых кнопок.
С частотой кварца я давно разобрался. Верхние строки кода я удалил ибо они никак не управляют ардуиной. Вернее не я а, разработчик этого кода - Лазаров. Я с ним списывался. Адаптировать его под 32U4 он, паразит не хочет. Ну это не беда.
Это код не полностью (только луп).

Цитата:

В принципе тебе надо всего 3 ноги изменить для промикры. Или одну если обвес ещё из двух микрух не нужен.
Еще раз говорю - НЕТ!... НЕ ВЫХОДИТ!!! НЕ ПОЛУЧАЕТСЯ!!! Этого не достаточно!Где-то загвоздка кроется не могу найти хоть тресни!!!
Попробую ещё раз повнимательнее, но чувствую что бесполезно

T_r_D 31.12.2018 13:41

Ок. Давай сначала.
Что из электронной схемы ты уже выкинул.
Избавимся от лишнего кода сначала.

Убери из кода который ты выше представил execCmd везде.
И если работает убери и саму функцию.

Убери это:
ISR(INT0_vect)
{
//interr = register_get( INTSTATUS);
//if( interr & ( 1 << ROKR) && interr & ( 1 << RNOKR))
//register_set( INTRESET, 0x83);
//inter |= ( 1 << 1) | (1 << 0);
//register_set( INTRESET, 0x00);
};

и это:
// Enable ATMega Interrupts on INT0
EICRA |= (1 << ISC01); // The falling edge of INT0 generates an interrupt request
EIMSK |= (1 << INT0); // Enable INT0
После этого обязательно проверь работу кода!

В коде поменяй строку на
DDRB |= (1 << DDB3) | (1 << DDB5) | (1 << DDB2)

Если работает, то поедем дальше.

Убираем из кода который ты переделывал уже, там где отсылка в КОМ порт все строки начинающиеся с execCmd.
Проверяем работает ли, если да, то убираем и функцию:
void execCmd( const byte cmd)
{
PORTB &= ~( 1 << PINB1);
spi_transfer( 0x11);
spi_transfer( cmd);
PORTB |= ( 1 << PINB1);
_delay_ms( CMD_WAIT_MS);
PORTB &= ~( 1 << PINB1);
spi_transfer( 0x11);
spi_transfer( nocmd);
PORTB |= ( 1 << PINB1);
};

и сверху void execCmd( const byte cmd);

Затем эту же строку меняем на
DDRB |= (1 << DDB3) | (1 << DDB5) | (1 << DDB6)
И во всём коде заменяем PINB2 на PINB6
И перепаиваем вывод PB2 на PB6
После проделанного пиши получилось или нет.
И если нет, то на каком шаге?

Потом спортируем на другой контроллер.
Забегая вперёд.
Для портации строка
DDRB |= (1 << DDB3) | (1 << DDB5) | (1 << DDB6)
поменяется на
DDRB |= (1 << DDB2) | (1 << DDB1) | (1 << DDB6) | (0 << DDB3) (вот это может и не надо | (0 << DDB3), но логичнее включить на вход порт, хотя он и так в 0... попробуй сначала без)
(Вот поэтому у тебя на 32U4 не заводился SPI скорее всего).

выводы SPI физически тоже поменяются, расположение PB6 поменяется физически, но уже программно останется как есть.

nikey 31.12.2018 16:39

T_r_D, что такое - execCmd?
Гуглил, бесполезно
блин... НГ... как ни крути, мешает творчеству... дети послали за тетраборатом в аптеку... ох блин...

T_r_D 31.12.2018 18:19

А-ха-ха!
Зачёт!
Ну ты в свой код посмотри. :)

у тебя куча вызовов этой функции, там где в КОМ порт пишешь.

Видимо эта функция передаёт данные на вторую микруху которую ты не используешь.

Про тетраборат порадовало :)
Лизунов в шампанском вылавливать будешь :)))))

nikey 31.12.2018 21:10

я в юности на бейсике писал, фор ту некст лет принт, гоу ту, ну и тд... это и спасает.

Погоди, я чот не догоняю... - пишешь в ком порт, а функция передаёт данные на другую микруху... у микрухи, что... ком порт чтоль есть???

Не... шампунь мы не пьём!.. а водка, думаю, растворит эту мерзкую субстанцию, навязанную нам ненавистными буржуями :-) ))). ну или накрайняк - проскочит...

T_r_D 31.12.2018 21:31

execCmd( tdwn);
// PORTB &= ~( 1 << PINB0); //установить 0 на линии SS
Serial.println ("колесо вниз");

Чей это код? :))))))
А execCmd? :)
А если посмотреть в тело функции, то понятно что он CS вешает на вторую микруху, которую ты не используешь (PB1).

Так если ты её не используешь, так зачем код?

Пробуй делать как выше написал короче. Если всё будет ок, то и от ножек избавимся и код поуменьшится.
А если совсем всё норм, то и на промикре станет пахать (ну если до низу сообщения дойдём без ошибок).

nikey 01.01.2019 16:26

Цитата:

Так если ты её не используешь, так зачем код?
Братан, да я всё понимаю!))) Но тут вот как получается...
Начинаешь удалять лишние строчки (или добавлять свои) и... код не проходит проверку. Ну сам понимаешь, к примеру, если вверху обьявлена переменная, а я внизу удалил строчку где есть на неё ссылка, то всё!... пипец... И сидишь ломаешь голову - что не так...
НГ зараза. ща буду ковырять

T_r_D 01.01.2019 17:12

Делай как описываю выше.
Сначала убери прерывание полностью.
Затем убери из кода execCmd, саму функцию и её объявление сверху.
Затем убери лишние порты.
Перепиши один порт на другой и перепаяй проводок.

Если всё работает, то переназначь выводы SPI и перекинь на другой контроллер.

Но нужно на работающем экземпляре добиться того, чтоб не использовались не нужные ноги, чтоб CS перешёл на ногу PB6 поскольку она свободна на промикре и чуть покромсать код чтоб не было лишнего.

nikey 01.01.2019 17:32

Сука, заработала! про микро мучать не стал, врубил леонардо. Леонардо сразу заработала, правда почемуто иногда ложные команды залетают, типа наводки чтоли какието.. не знаю. с ардуино уно такого нет... Там всё нормально.
Спасибо, братан, буду пробовать библиотеку подключать для управления планшетом
Начало положено)))) теперь надо запустить леонарду в режиме слейв, чтоб она не мешала магнитоле! ))

PS/ execcmd не убирал. прерывания не убирал. только порты переназначил. я и раньше это делал на про микро, но почемуто только щас на леонарде заработала...
ПРобовал на ардуине уно убирать execCmd. Работает, но в начале работы монитора порта залетают ложные нажатия, потом всё норм. Не знаю с чем это связано

nikey 02.01.2019 21:57

Подцепил библиотеку управления планшетом Александра Фёдорова с сайта DIXOM. Теперича хоть планшет, хоть ноутбук управляются с подрулевых кнопок. Надо, конечно, еще многое что допилить, но пока и так прикольно :-)
Чото с наводками надо делать...
T_r_D, прикинь, подключил планшет к леонарде, а леонарду к магнитоле (ну все как надо по схеме)... Как поперли ложные нажатия!... Песни, громкость как начали щёлкать!... Ну я поплевал на левую руку (чтоб контакт получче был) и взялся за металлическую крышку планшета. Ложные нажатия сразу прекратились и всё заработало. Надо где-то в коде массу прописать :-))))

Если серьёзно, то надо получше поизучать код - какая строчка за что отвечает. Я в общих чертах понимаю что и как, но многого всё равно не догоняю. Надо выяснить как код отлавливает нажатия кнопок...
Ты ежели что, не пропадай хоть, а то я без тебя как... баран на новые ворота

nikey 12.01.2019 00:17

Как не пытался избавиться от ложных нажатий (это колесо вверх\вниз), переделывал\исправлял код несколько раз - бесполезно. В конце концов сменил ардуину (благо что у меня их килограмм) и ложные нажатия сразу прекратились на 99 процентов. Когда машина впадает в спячку, (вернее пытается впасть, выключая главное реле, а ардуина не даёт) нажатия начинают проскакивать. на 328 чипе такого не замечал. Надо будет попробовать

yuriy19723 25.04.2021 18:53

Интересно узнать, удалось вам довести ваш проект до финиша?


Часовой пояс GMT +4, время: 01:40.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot