Sari la conținut
ELFORUM - Forumul electronistilor

Comunicatie seriala, variabila floating point


alibiduda

Postări Recomandate

Revin cu update.

Se pare ca e ceva in neregula cu modulele RS485 sau altceva ce imi scapa momentan.

Am facut un sketch de test de sincronizare  adica, modulul cu LCD trimite un caracter catre cel cu senzor si cand acesta il receptioneaza trimite alt caracter inapoi care e afisat pe LCD. A functionat ok dar dupa o pauza de cateva ore fara sa il ating nu a mai vrut in nici un fel sa receptioneze caracterul trimis de modulul cu senzor. Am schimbat modulele RS485 intre ele, microcontrolerele intre ele , nimic se comporta exact la fel intr-o directie mergea perfect dar inapoi nu se mai intorcea nimic. Din acel moment tot ce incercam sa trimit intre module ori se pierdea pe drum ori ajuncea altceva. Am scos modulele rs485 din ecuatie si tot la fel.

Pana la urma am trecut pe porturile hardware serial direct fara module rs485 si in sfarsit comunicatia s-a stabilizat. Am reusit sa trimit temperatura prin metoda 2 octeti.

Acum e traziu dar vreau sa testez si celelate metode (4 octeti si libraria), principalul meu scop e sa invat programarea.

Nu imi expilc ce s-a intamplat pur si simplu nu a fost alimentat, nu l-am atins si nu a fost nimeni in preajma lui timp de cateva ore.

Cel putin  acum am o baza stabila de unde sa incep. Sper ca pana maine sa nu intre iar dracii in el.

Link spre comentariu
  • Răspunsuri 22
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Acum 14 ore, alibiduda a spus:

Pana la urma am trecut pe porturile hardware serial direct

La 15m distanta nu prea va merge comunicatia cu nivele TTL chiar la viteze mici,

Pune macar RS232.
De RS485 oricum nu ai nevoie pentru ca ai doar doua dispozitive care comunica intre ele.

Link spre comentariu

Astea sunt sketch-urile la care a luat-o razna. Vineri seara a functionat fara probleme, totul a ramas neatins. Sambata dimineata am alimentat si nu mai primea inpoi caracerul "A". Comanda reqtemp ajungea, de trimis trimitea. Am verificat conexiunile de nenumarate ori pin cu pin cu ohmetrul, am scimbat modulele intre ele si rescris sketch-urile. Le-am schimbat locul pe breadboard. Din pacate fotografii nu am facut, eram prea nervos.

Asta este fotografia actuala modulele RS485 sunt deconectate.

Pana la urma nu mai conteza ce a fost, bine ca acum e stabil si pot testa.

Imi cer scuze ca nu progresez mai repede dar timpul meu de "joca" e limitat si de obicei seara tarziu.

 

 

@Liviu.Mihaiu nu am de gand sa renunt la RS485 doar momentan pana reusesc sa pun la punct programare pe partea de citre si afisare senzor. Dupa cum spuneam sunt incepator cu progamarea  si trebuie sa ma documentez mult pana reusesc sa fac ceva nou.

 

Microcontrolerul care afisaza.

 

#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2);

#define TX_485 8 // Pin DI modul RS 485
#define RX_485 7 // pin RO modul RS 485
#define RS485_control 3 // pin DE+RE control RS485

SoftwareSerial RS485_serial (RX_485, TX_485);
#define RS485transmit HIGH
#define RS485receive LOW

int reqtemp = 1;
char val = 0;

void setup()
{
  lcd.init();
  lcd.clear();
  lcd.backlight();
  Serial.begin(9600);
  RS485_serial.begin(4800);
  pinMode(RS485_control, OUTPUT);
    
}

void loop()
{   lcd.clear();
    
    digitalWrite(RS485_control, RS485transmit);
    RS485_serial.print(reqtemp);
    Serial.print(reqtemp);
    delay(50);
    digitalWrite(RS485_control, RS485receive);

    
    if (RS485_serial.available () > 0)
    {
        val = RS485_serial.read();
      }
      
      Serial.println(val);
         
    lcd.setCursor(1, 0);
    lcd.print(val);
    
    delay(2000);
     
    
  
}

 

Microcontrolerul care "citeste temperaura".

 

#include <SoftwareSerial.h>
//#include <OneWire.h>
//#include <DallasTemperature.h>

#define TX_485 8 // pin DI modul RS 485
#define RX_485 7 // pin RO modul RS 485
#define RS485_control 3 // pin DE+RE control RS485

SoftwareSerial RS485_serial (RX_485, TX_485);

#define RS485transmit HIGH
#define RS485receive LOW


/*const int pin_sensor = 5;
OneWire bus (pin_sensor);
DallasTemperature sensors (&bus);
DeviceAddress sensor;*/

int command = 0;
char val = "A" ;

void setup()
{
 // sensors.begin();
  Serial.begin(9600);
  RS485_serial.begin(4800);
  pinMode(RS485_control, OUTPUT);
  
  /*  if (!sensors.getAddress(sensor, 0))
  {
    Serial.println("DS18B20 deconectat");
  }*/

}
void loop()
{
   /* sensors.requestTemperatures();
    temp = sensors.getTempC(sensor);*/
    digitalWrite(RS485_control, RS485receive);
    if (RS485_serial.available () > 0)
    {
      command = RS485_serial.parseInt();
      Serial.println(command);
      if (command == 1)
    {
      digitalWrite(RS485_control, RS485transmit);
      RS485_serial.print("A");
      Serial.println(" A trimis");
     }
    }
    
}

 

Link spre comentariu

Mi se pare logic sa apelezi un eventual delay, dupa ce ai trecut linia pe receive, nu inainte. Posibil sa iti vina raspunsul cand este inca pe mod transmit.

Daca nu ai o functie sa verifici cand ai terminat de transmis, si asta e motivul delay-ului, poti incerca un delay mai mic, de 2-3 ms ( ( 8 + 1) / 4800 ms ), apoi sa treci linia pe mod receive si eventual sa mai astepti ulterior raspunsul.

Link spre comentariu

Nu are cum să scape răspunsul, pt. că fără delay citirea intrării seriale se face de zeci de mii de ori pe secundă, şi doar dacă intră ceva în buffer se procesează condiţia if, iar asta durează probabil 2-3us după care iar verifică la nesfârşit intrarea serială. 

Pe de altă parte dacă treci pe recepţie şi ai timp mort cu delay-ul s-ar putea să pierzi datele de intrare dacă sunt transmise în acest timp.

În mod normal ar trebui sincronizată cumva rularea ori cu millis() ori prin altă metodă. Dacă un byte de date are nevoie de 2ms să intre în buffer la 4800baud nu are rost să verifici mai des de atâta. În practică 50ms ar fi suficiente ca interval şi rămâne destul timp între pt. a face şi restul, cum ar fi afişarea plus bucătăria internă. 

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări