Software serial sur atmega328p

Salut à vous tous,
Dernièrement j'ai voulu téléverser un programme utilisant la librairie software serial sur un atmega328p, mais avant j'ai testé plusieurs programmes avec des leds et ça fonctionnait très bien sans le moindre problème, mais arrivé à la librairie software serial que j'utilise pour une sim 800l, ça ne marche pas du tout, alors que cette même sim 800l marche très bien avec un nano
Pour résumer
L'AT méga 328p fonctionne très bien (avec des leds Ect)
La sim 800l fonctionne très bien aussi ( et avec 2 arduino différents )
L'AT méga 328p branché à la sim 800l par le biais des broches digital 9 et 10 déclaré sur le software serial ne marche pas,
J'ai bien essayé d'inverser le rx et TX et de changer le branchement, j'ai essayé d'autre broches digital tels que (10,11) et (2,3) mais ça ne marche toujours pas

Je ne sais si ça serait mieux si j'envoyais le code mais en tout cas le voici


#include <SoftwareSerial.h>



SoftwareSerial sim800(10,9);
#define relais 5
#define LEDverte 7
#define LEDrouge 6


String smsStatus,senderNumber,receivedDate,msg;

boolean isReply = false;

void setup() {
 
  Serial.begin(115200);
  Serial.println("Arduino serial initialize");
 
  sim800.begin(9600);
  Serial.println("SIM800L software serial initialize");

  pinMode(LEDverte, OUTPUT); //Relay 1
  pinMode(LEDrouge, OUTPUT);
  smsStatus = "";
  senderNumber="";
  receivedDate="";
  msg="";

  sim800.print("AT+CMGF=1\r"); //SMS text mode
  delay(1000);
  //delete all sms
  sim800.println("AT+CMGD=1,4");
  delay(1000);
  sim800.println("AT+CMGDA= \"DEL ALL\"");
  delay(1000);
   for (unsigned int n=0;n<5;n++){
  digitalWrite(LEDrouge,HIGH);
  digitalWrite(LEDverte,HIGH);
  delay (500);
  digitalWrite(LEDrouge,LOW);
  digitalWrite(LEDverte,LOW);
  delay (100);
   }
 
}

void loop() {
//////////////////////////////////////////////////
while(sim800.available()){
 
  parseData(sim800.readString());
}
//////////////////////////////////////////////////
while(Serial.available())  {
  sim800.println(Serial.readString());
}
//////////////////////////////////////////////////
} //main loop ends

//***************************************************
void parseData(String buff){
 
  Serial.println(buff);

  unsigned int len, index;
  //////////////////////////////////////////////////
  //Remove sent "AT Command" from the response string.
  index = buff.indexOf("\r");
  buff.remove(0, index+2);
  buff.trim();
  //////////////////////////////////////////////////
 
  //////////////////////////////////////////////////
  if(buff != "OK"){
    index = buff.indexOf(":");
    String cmd = buff.substring(0, index);
    cmd.trim();
   
    buff.remove(0, index+2);
   
    if(cmd == "+CMTI"){
      //get newly arrived memory location and store it in temp
      index = buff.indexOf(",");
      String temp = buff.substring(index+1, buff.length());
      temp = "AT+CMGR=" + temp + "\r";
      //get the message stored at memory location "temp"
      sim800.println(temp);
    }
    else if(cmd == "+CMGR"){
      extractSms(buff);

        doAction();
        //delete all sms
        sim800.println("AT+CMGD=1,4");
        delay(1000);
        sim800.println("AT+CMGDA= \"DEL ALL\"");
        delay(1000);
       
     
    }
  //////////////////////////////////////////////////
  }
  else{
  //The result of AT Command is "OK"
  }
}

//************************************************************
void extractSms(String buff){
   unsigned int index;
   
    index = buff.indexOf(",");
    smsStatus = buff.substring(1, index-1);
    buff.remove(0, index+2);
   
    senderNumber = buff.substring(0, 13);
    buff.remove(0,19);
   
    receivedDate = buff.substring(0, 20);
    buff.remove(0,buff.indexOf("\r"));
    buff.trim();
   
    index =buff.indexOf("\n\r");
    buff = buff.substring(0, index);
    buff.trim();
    msg = buff;
    buff = "";
    msg.toLowerCase();
}

void doAction(){
  if(msg == "nz4hy31e"){  
    digitalWrite(LEDverte, HIGH);
    digitalWrite(relais, HIGH);
    Serial.println(" vert has been ON");
    digitalWrite(LEDrouge, LOW);
    Serial.println(" rouge has been OFF");
  }
  else if(msg == "kp34io01"){
    digitalWrite(LEDverte, LOW);
    digitalWrite(relais, LOW);
    Serial.println(" vert has been OFF");
    digitalWrite(LEDrouge, HIGH);
    Serial.println(" rouge has been ON");
  }


 
  smsStatus = "";
  senderNumber="";
  receivedDate="";
  msg="";  
}

Salut.
Il faudrait savoir ce que tu entends par Atmega328P.
Quel schéma, et surtout quel oscillateur ?


Voilà c exactement le même circuit que j'ai reproduit pour téléverser le programme, c'est un oscillateur 16mhz que j'utilise

Il faudrait déjà tester un delay() de plusieurs secondes, afin de vérifier que l'oscillateur est bien pris en compte. Les fuses ont ils été bien programmés ?

Ça veut dire quoi "fuses" ?
Comme vous l'avez sans doute remarqué dans le code programme, les deux leds clignotent 5 fois à des intervalles précis, et il n'y a pas de problème sur ce point

Le code est une chose, mais un delay(10000) donne t'il un vraiment délai de 10s ?

Oui j'ai testé il n'y a pas de problème la dessus

Tu as testé comment ?
Pour qu'une transmission série s'effectue correctement, la précision de l'horloge doit être de 5%, 2.5% côté émetteur, 2.5% côté récepteur, mais on admet que 2% de part et d'autre permet d'avoir une marge correcte.
Il n'y a rien qui différencie une carte ARDUINO d'un ATMEGA328P muni de son oscillateur, mis à part la précision de l'oscillateur. Tu l'auras compris, je mets en doute ton oscillateur.

Vois -tu ce texte sur le serial monitor ?

Pour tester j'ai mis une led sur HIGH pendant 10 secondes et j'ai chronométré, du moins c'est ce que j'ai compris
Je ne peux pas accéder au serial monitor alors que je suis sur l'AT méga 328p il n'y a que sur arduino ou je peux y accéder

C'est à dire que tu ne parviens pas à écrire sur le serial monitor, ou que tu n'as pas de convertisseur USB / Série branché sur RX TX ?

Je ne sais pas comment y accéder, est ce qu'il suffit de les brancher ainsi ?

  • de l'usb au vcc
  • de l'usb au gnd
    Les fils vert et blanc au rx et tx

Non, comme indiqué par @hbachetti il faut utiliser un convertisseur USB / Série branché sur RX TX.
Un module dans ce genre là, par exemple

Ah OK,
Cependant j'ai essayé autre chose, changer l'oscillateur ainsi que les deux condo, et ça a marché, même la librairie software serial a bien fonctionné, mais ce qui est étrange c'est que l'intégralité de l'AT méga a cessé de fonctionner juste après, même les leds ne clignotent plus au départ j'ai essayé de réimplanter le programme ArduinoISP et lors de la gravure de la séquence d'initialisation il m'affiche cela


avrdude : Expected signature for Atmega328p is 1E 95 0F
Double check chip, or use -F to override this check.
Erreur lors de la gravure de la séquence d'initialisation

C très étrange, je n'ai rien changé au cablage

Câblage à revérifier. Peut être un faux contact ?

Je ne pense pas qu'il s'agit d'un faux contact, j'ai pris environ une heure à m'en assurer à l'aide de mon multimetre ect, j'ai même refait le circuit en son intégralité

Il serait étonnant que l'ATMEGA328 ait été détérioré suite à un changement d'oscillateur.

Oh pitié pas ça,
Y'a-t-il un moyen pour vérifier histoire d'en avoir le cœur net ?

Mettre ton ATMEGA328 sur une UNO, si tu en possède une, et que les deux sont DIL.

en fait ça a remarché après avoir recommencé le câblage plusieurs fois, et changer d'oscillateurs, comme il y'a plusieurs connexions la probabilité d'un faux contact est très élevé même si je n'en ai pas remarqué un, je me demande des fois si le problème peut venir des breadbords qui ne sèrrent pas trop les pins lorsqu'ils y sont implantés