Конфликт spi и serial (usb uart)

qdesnik
Offline
Зарегистрирован: 06.06.2018

Всем привет! Программа читает данные из игры и шлет в ардуинку (мега 328), мк ловит нужный пакет данных и дергает ногами как надо.
Появилась необходимость добавить дисплей (12864 на st7920). Подключил отдельно по spi, написал все что там необходимо, все работает.
Но когда объединяю скетчи, на дисплей инфа выводится нормально, но остальными ногами (из основного кода) начинает хаотично дергать.
Получается когда идут данные по spi в основном порту сыпется мусор.
пробовал spi на другие ноги (хардварные ноги меги заняты, на них не пробовал. либа u8glib.
подскажите куда копать. спасибо.
п.с. пишу с телефона, код смогу приложить позже

b707
Offline
Зарегистрирован: 26.05.2017

qdesnik пишет:
код смогу приложить позже

Без кода разговаривать бессмысленно. Мой ХШ подсказывает, что дело скорее всего не в конфликте, а в неудвчном обьединении скетчей. Но ХШ - инструмент неточный :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

пока Клапа занимаеца общественными работами, я смарю, тут многие опять себе ХШ отрастили... 

qdesnik
Offline
Зарегистрирован: 06.06.2018
#include "U8glib.h"
U8GLIB_ST7920_128X64_4X u8g(8, 10, 9);
//U8GLIB_ST7920_128X64 u8g(13, 11, 12, U8G_PIN_NONE);

#define RPM_PIN 23
#define RPM_MAX 45
#define RPM_MIN 170

#define SPEED_PIN 22
#define SPEED_MAX1 65
#define SPEED_MIN1 180
#define SPEED_MAX 1
#define SPEED_MIN 64

#define LTR_PIN 24
#define LTR_MAX 70
#define LTR_MIN 165

#define TEMP_PIN 25
#define TEMP_MAX 80
#define TEMP_MIN 165

#define ONOFF_PIN 12

#include <Servo.h>

Servo rpmServo;
Servo speedServo;
Servo ltrServo;
Servo tempServo;

void setup(){

  
  digitalWrite(ONOFF_PIN, 1);
  
  Serial.begin(57600);
  
  pinMode(ONOFF_PIN, OUTPUT);
  
   rpmServo.attach(RPM_PIN);
  speedServo.attach(SPEED_PIN, 450, 2145);
  ltrServo.attach(LTR_PIN);
  tempServo.attach(TEMP_PIN); 
  
  }
 
void loop(){ 

   u8g.firstPage();  
  do {
    draw();
     
  } while( u8g.nextPage() );

  
  if (Serial.find("U")) {
          
          int x = Serial.readBytes(bufferArray, a);
          
          if (x == 33) {  
 
        
         if (bufferArray[0]  == 'R'){
           unsigned int rpmSmTools = ((bufferArray[1]-48)*10000) + ((bufferArray[2]-48)*1000) + // Take values 1-5.
                               ((bufferArray[3]-48) *100) + ((bufferArray[4]-48)*10) + (bufferArray[5]-48);
           Rpm = rpmSmTools;
           //Serial.println("You have set the Rpm to a Value of:");     
           //Serial.println(rpmSmTools);
           }
           
         if (bufferArray[6] == 'G'){
           unsigned int gearSmTools = ((bufferArray[7]-48)*1);
           Gear = gearSmTools;
            //Serial.println("You have set the Gear to a Value of:");     
            //Serial.println(gearSmTools);
            }
        
         if (bufferArray[8]  == 'S'){
           unsigned int speedSmTools = ((bufferArray[9]-48)*100) + ((bufferArray[10]-48)*10) + (bufferArray[11]-48); // Take values 1-5.
           Speed = speedSmTools;                     
           //Serial.println("You have set the Speed to a Value of:");     
           //Serial.println(speedSmTools);
            }
            
          if (bufferArray[12]  == 'F'){
           unsigned int fuelSmTools =  ((bufferArray[13]-48)*10) + (bufferArray[14]-48); // Take values 1-5.
           Ltr = Ltrmax * fuelSmTools / 100; 
           //Serial.println("You have set the Fuel to a Value of:");     
           //Serial.println(fuelSmTools);
             }

           if (bufferArray[15] == 'T'){
           unsigned int tempSmTools = ((bufferArray[16]-48)*100) + ((bufferArray[17]-48)*10) + (bufferArray[18]-48); // Take values 1-5.
           Temp = tempSmTools;                      
           //Serial.println("You have set the Water to a Value of:");     
           //Serial.println(tempSmTools);
             }

           if (bufferArray[19]  == 'M'){
           unsigned int maxrpmSmTools = ((bufferArray[20]-48)*10000) + ((bufferArray[21]-48)*1000) + // Take values 1-5.
                               ((bufferArray[22]-48) *100) + ((bufferArray[23]-48)*10) + (bufferArray[24]-48);
           Rpmmax = maxrpmSmTools + 300;
           //Serial.println("You have set the max to a Value of:");     
           //Serial.println(maxrpmSmTools);
           }

           if (bufferArray[25]  == 'O'){
           unsigned int otempSmTools = ((bufferArray[26]-48)*100) + ((bufferArray[27]-48)*10) + (bufferArray[28]-48); // Take values 1-5.
           Otemp = otempSmTools;                     
           //Serial.println("You have set the Speed to a Value of:");     
           //Serial.println(otempSmTools);
            }

           if (bufferArray[29]  == 'P'){
           unsigned int opresSmTools = ((bufferArray[30]-48)*100) + ((bufferArray[31]-48)*10) + (bufferArray[32]-48); // Take values 1-5.
           Opres = opresSmTools;                     
           //Serial.println("You have set the Speed to a Value of:");     
           //Serial.println(opresSmTools);
            }
  }     
 } 
  
   //if (Serial.available()>40)
 Serial.flush(); 
 
  if (Speed < 140){
  speedServo.write(constrain(map(Speed, 0, Speedsto, SPEED_MIN1, SPEED_MAX1), SPEED_MAX1, SPEED_MIN1));
 }
 else {
  speedServo.write(constrain(map(Speed, Speedsto, Speedmax, SPEED_MIN, SPEED_MAX), SPEED_MAX, SPEED_MIN));
 }
 
 rpmServo.write(constrain(map(Rpm, 0, Rpmmax, RPM_MIN, RPM_MAX), RPM_MAX, RPM_MIN));
 ltrServo.write(constrain(map(Ltr, 0, Ltrmax, LTR_MAX, LTR_MIN), LTR_MAX, LTR_MIN));
 tempServo.write(constrain(map(Temp, 0, Tempmax, TEMP_MAX, TEMP_MIN), TEMP_MAX, TEMP_MIN));
 
 void draw(void) {
  
  u8g.drawFrame(0,0,128,25);
  
  char nameArray[15] = "Creator";
  char carArray[15] = "Pushka-Gonka";
  char trackArray[15] = "Trassa E95";

  // graphic commands to redraw the complete screen should be placed here  
  //u8g.setFont(u8g_font_unifont);
  //u8g.setFont(u8g_font_osb21);
  
  u8g.setFont(u8g_font_gdb12);
  u8g.drawStr( 13, 18, "Reality Club");
  
  u8g.setFont(u8g_font_profont15);
  u8g.drawStr( 0, 35, "Name:");

  u8g.setPrintPos(40, 35 );
  u8g.print(nameArray);

  u8g.setFont(u8g_font_profont15);
  u8g.drawStr( 0, 48, "Car:");

  u8g.setPrintPos(33, 48 );
  u8g.print(carArray);
  
  u8g.setFont(u8g_font_profont15);
  u8g.drawStr( 0, 60, "Track:");

  u8g.setPrintPos(45, 60 );
  u8g.print(trackArray);
  
}
 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ну как минимум ONOFF_PIN занимает ногу, которую юзает аппаратный SPI на Uno, а именно ногу MISO (пин 12).

qdesnik
Offline
Зарегистрирован: 06.06.2018

DIYMan пишет:

Ну как минимум ONOFF_PIN занимает ногу, которую юзает аппаратный SPI на Uno, а именно ногу MISO (пин 12).

у меня мега 2560, но аппаратными ногами spi я пользуюсь для светодиодов, а дисплей через софтварный spi висит на 8,9,10 пинах.

или хардварные ноги трогать нельзя, если я использую софтвар?

kalapanga
Offline
Зарегистрирован: 23.10.2016

qdesnik пишет:

у меня мега 2560, но аппаратными ногами spi я пользуюсь для светодиодов, а дисплей через софтварный spi висит на 8,9,10 пинах.

А почему не наоборот? И может я плохо гляжу, но что-то я в скетче никаких светодиодов не вижу.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

qdesnik пишет:

DIYMan пишет:

Ну как минимум ONOFF_PIN занимает ногу, которую юзает аппаратный SPI на Uno, а именно ногу MISO (пин 12).

у меня мега 2560, но аппаратными ногами spi я пользуюсь для светодиодов, а дисплей через софтварный spi висит на 8,9,10 пинах.

или хардварные ноги трогать нельзя, если я использую софтвар?

Посмотри, какие таймеры юзает серво, и проследи, чтобы эти таймеры не были завязаны на те же ноги, на которых висит дисплей. И вопрос: зачем тебе медленный softSPI для дисплея (который и так небыстрый), если у тебя искаропки есть аппаратный SPI? Интересный такой вопрос, знаешь ли ;)

qdesnik
Offline
Зарегистрирован: 06.06.2018

DIYMan пишет:

qdesnik пишет:

DIYMan пишет:

Ну как минимум ONOFF_PIN занимает ногу, которую юзает аппаратный SPI на Uno, а именно ногу MISO (пин 12).

у меня мега 2560, но аппаратными ногами spi я пользуюсь для светодиодов, а дисплей через софтварный spi висит на 8,9,10 пинах.

или хардварные ноги трогать нельзя, если я использую софтвар?

Посмотри, какие таймеры юзает серво, и проследи, чтобы эти таймеры не были завязаны на те же ноги, на которых висит дисплей. И вопрос: зачем тебе медленный softSPI для дисплея (который и так небыстрый), если у тебя искаропки есть аппаратный SPI? Интересный такой вопрос, знаешь ли ;)

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

насчет скорости не важно абсолютно, инфа обновляется раз в 5+ минут.

как проверить тамеры где какие?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

qdesnik пишет:

как проверить тамеры где какие?

Юзаешь библиотеку Servo? Читай: https://www.arduino.cc/en/Reference/servo

qdesnik
Offline
Зарегистрирован: 06.06.2018

DIYMan пишет:

qdesnik пишет:

как проверить тамеры где какие?

Юзаешь библиотеку Servo? Читай: https://www.arduino.cc/en/Reference/servo

спасибо, прочел.. 9,10 нога отключается шим... (это не мой случай)

в меге без потерь ног до 12 серво, у меня 4 штуки...

но я подключал spi и на 2-3-4 и на 5-6-7, симптомы точно такие

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

qdesnik пишет:

DIYMan пишет:

qdesnik пишет:

как проверить тамеры где какие?

Юзаешь библиотеку Servo? Читай: https://www.arduino.cc/en/Reference/servo

спасибо, прочел.. 9,10 нога отключается шим... (это не мой случай)

в меге без потерь ног до 12 серво, у меня 4 штуки...

но я подключал spi и на 2-3-4 и на 5-6-7, симптомы точно такие

Попробуй просто - отключи пока в коде все сервы, и посмотри - будет ли чего странного твориться.

qdesnik
Offline
Зарегистрирован: 06.06.2018

Оключал все сервы, менял на хардварные выводы - не помогло.

Библиотеки не правил и не разбирался - проект не терпит, время поджало.

Предположу из той инфы, что вычитал, нужно копать и объединять библиотеки spi и u8glib..

всем спасибо за ответы!