Advertisement
Guest User

UNO programator v2

a guest
Apr 15th, 2017
486
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.96 KB | None | 0 0
  1. #include <SoftwareSerial.h>
  2.  
  3. ///Promenne potrebne pro funkci
  4. byte prichozi[64];
  5. long podpisProcesoru = 0;
  6.  
  7. //piny virtualniho UARTu
  8. SoftwareSerial programator = SoftwareSerial(10, 11);
  9. long baud = 115200;
  10.  
  11. //Pin ktery pripojite na RESET hosta, tedy arduina ktere bude progamovano
  12. int rst = 2;
  13.  
  14. void setup() {
  15.  
  16.  
  17.  pinMode(rst, OUTPUT);
  18.  digitalWrite(rst, HIGH);
  19.  
  20.  Serial.begin(9600);
  21.  
  22.  
  23. }
  24.  
  25. void loop() {
  26.  
  27.     delay(1000);
  28.     if(beginProgramming()){
  29.       Serial.println("Synchronizovan s cipem");
  30.       if(getParams()){
  31.         Serial.println("Parametry ziskany");
  32.         Serial.print("\nPodpis procesoru: ");
  33.         Serial.print(podpisProcesoru, HEX);
  34.         Serial.print("\n");
  35.        
  36.         }else Serial.println("Chyba ziskavani parametru!");
  37.        
  38.      
  39.       }else Serial.println("Chyba synchronizace s cipem!");
  40.    
  41.  delay(5000);
  42.  
  43. }
  44.  
  45. int beginProgramming(){
  46.  
  47.   vynulujBuffer();
  48.  
  49.   //Nastavi rychlost UARTu a rst jako vystup
  50.   programator.begin(baud);
  51.   //Posle pulz pro reset procesoru
  52.   digitalWrite(rst, LOW);
  53.   delay(200);
  54.   digitalWrite(rst, HIGH);
  55.   delay(500);
  56.  
  57.  
  58.   //Polse 2 prikazy na ktere ma Arduino odpovedet - STK_GET_SYNC, Sync_CRC_EOP
  59.   programator.write(0x30);
  60.   programator.write(0x20);
  61.  
  62.   //Pocka dokud neodpovi na prikazy a nacte je do bufferu
  63.   while(!programator.available()){;}
  64.   delay(50);
  65.   for(int i = 0; i <= programator.available(); i++){
  66.       prichozi[i] = programator.read();
  67.   }
  68.  
  69.  
  70.   //vyhodnoti jestli jsme dostali OK odpoved
  71.   if(prichozi[0] == 0x14 && prichozi[1] == 0x10){
  72.       return 1;
  73.   }else return 0;
  74.  
  75.  
  76. }
  77.  
  78. int getParams(){
  79.  
  80.     vynulujBuffer();
  81.  
  82.  
  83.    ///////////////// DELAY PRO UNO
  84.      delay(20);
  85.    
  86.    //Programovaci mod
  87.    programator.write(0x50);
  88.    programator.write(0x20);
  89.  
  90.    //Vycisti softwareSerial buffer, zapise ho do prichozi
  91.    while(!programator.available()){;}
  92.    delay(50);
  93.    for(int j = 0; j <= programator.available(); j++){
  94.       prichozi[j] = programator.read();
  95.    }
  96.  
  97.    
  98.     //vyhodnoti jestli jsme dostali OK odpoved
  99.  if(prichozi[0] == 0x14 && prichozi[1] == 0x10){
  100.  
  101.       vynulujBuffer();
  102.  
  103.  
  104.     ///////////////// DELAY PRO UNO
  105.      delay(20);
  106.      
  107.      //Precti podpis procesoru
  108.      programator.write(0x75);
  109.      programator.write(0x20);
  110.  
  111.      //Vycisti softwareSerial buffer, zapise ho do prichozi
  112.      while(!programator.available()){;}
  113.      delay(50);
  114.      //programator.available() se zde nechtela obnovit primo ve for(), nevim proc ale musi se to udelat takto
  115.      int byty = programator.available();
  116.      for(int k = 0; k <= byty; k++){
  117.         prichozi[k] = programator.read();
  118.      }
  119.    
  120.      
  121.      //Vyzjisti z bufferu device signature
  122.       if(prichozi[0] == 0x14 && prichozi[4] == 0x10){
  123.         podpisProcesoru = ((unsigned long)prichozi[1] << 16) | ((unsigned long)prichozi[2] << 8) | ((unsigned long)prichozi[3]);
  124.  
  125.         quitProgramM();
  126.        
  127.         return 1;
  128.       }else return 0;
  129.   }else return 0;
  130.   }
  131.  
  132.  
  133. int programFlash(uint8_t pocatecniAdresaA, uint8_t pocatecniAdresaB, uint8_t velikostStrankyA, uint8_t velikostStrankyB){
  134.  
  135.     vynulujBuffer();
  136.  
  137.    ///////////////// DELAY PRO UNO
  138.      delay(20);
  139.    
  140.    //Programovaci mod
  141.    programator.write(0x50);
  142.    programator.write(0x20);
  143.  
  144.    //Vycisti softwareSerial buffer, zapise ho do prichozi
  145.    while(!programator.available()){;}
  146.    delay(50);
  147.    for(int j = 0; j <= programator.available(); j++){
  148.       prichozi[j] = programator.read();
  149.    }
  150.  
  151.    
  152.     //vyhodnoti jestli jsme dostali OK odpoved
  153.  if(prichozi[0] == 0x14 && prichozi[1] == 0x10){
  154.  
  155.       vynulujBuffer();
  156.  
  157.      ///////////////// DELAY PRO UNO
  158.      delay(20);
  159.      
  160.      //Precti podpis procesoru
  161.      programator.write(0x75);
  162.      programator.write(0x20);
  163.  
  164.      //Vycisti softwareSerial buffer, zapise ho do prichozi
  165.      while(!programator.available()){;}
  166.      delay(50);
  167.      //programator.available() se zde nechtela obnovit primo ve for(), nevim proc ale musi se to udelat takto
  168.      int byty2 = programator.available();
  169.      for(int k = 0; k <= byty2; k++){
  170.         prichozi[k] = programator.read();
  171.      }
  172.    
  173.      
  174.      //Vyzjisti z bufferu device signature
  175.       if(prichozi[0] == 0x14 && prichozi[4] == 0x10){
  176.        
  177.         vynulujBuffer();
  178.  
  179.         ///////////////// DELAY PRO UNO
  180.         delay(20);
  181.        
  182.         programator.write(0x55);
  183.  
  184.         /////////// TYTO DVA BYTY NASTAVUJI POCATECNI POZICI NA KTERE ZACNE BOOTLOADER ZAPISOVAT ///////////
  185.         programator.write(pocatecniAdresaA);
  186.         programator.write(pocatecniAdresaB);
  187.         ///////////////////////////////////////////////////////////////////////////////////////////////////
  188.  
  189.         ///////////////// DELAY PRO UNO
  190.         delay(20);
  191.      
  192.         programator.write(0x20);
  193.  
  194.         //Vycisti softwareSerial buffer, zapise ho do prichozi
  195.         while(!programator.available()){;}
  196.             delay(50);
  197.             //programator.available() se zde nechtela obnovit primo ve for(), nevim proc ale musi se to udelat takto
  198.             int byty3 = programator.available();
  199.             for(int k = 0; k <= byty3; k++){
  200.             prichozi[k] = programator.read();
  201.         }
  202.  
  203.         if(prichozi[0] == 0x14 && prichozi[1] == 0x10){
  204.  
  205.           vynulujBuffer();
  206.  
  207.           ///////////////// DELAY PRO UNO
  208.           delay(20);
  209.              
  210.           //Programuj stranku
  211.           programator.write(0x64);
  212.          
  213.           /////////// TYTO DVA BYTY NASTAVUJI VELIKOST STRANKY ///////////
  214.           programator.write(velikostStrankyA);
  215.           programator.write(velikostStrankyB);
  216.           ///////////////////////////////////////////////////////////////////////////////////////////////////
  217.  
  218.  
  219.           ///////////////// DELAY PRO UNO
  220.            delay(20);
  221.      
  222.           programator.write(0x46);
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.           ///////////////////////////////////////////////////////////////////////////////////////////////////
  230.           ///////////////////////////////////////////////////////////////////////////////////////////////////
  231.           ///// ZDE SI DOPLNTE KOD PRO ZAPISOVANI DAT, DATA JSOU POSILANA PRES programator.write() A    /////
  232.           /////               NASLEDUJI HNED PO PRIKAZECH KTERE JSEM JIZ ZAPSAL                         /////
  233.           ///////////////////////////////////////////////////////////////////////////////////////////////////
  234.           ///////////////////////////////////////////////////////////////////////////////////////////////////
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.           //Vycisti softwareSerial buffer, zapise ho do prichozi
  242.         while(!programator.available()){;}
  243.             delay(50);
  244.             //programator.available() se zde nechtela obnovit primo ve for(), nevim proc ale musi se to udelat takto
  245.             int byty3 = programator.available();
  246.             for(int k = 0; k <= byty3; k++){
  247.             prichozi[k] = programator.read();
  248.         }
  249.  
  250.         //Zjisti zda bylo programovani uspesne
  251.         if(prichozi[0] == 0x14 && prichozi[1] == 0x10){
  252.           return 1;  
  253.         }else return 0;
  254.        
  255.         }
  256.  
  257.       }else return 0;
  258.   }else return 0;
  259.   }
  260.  
  261.  
  262. int quitProgramM(){
  263.  
  264.   vynulujBuffer();
  265.  
  266.  
  267.    ///////////////// DELAY PRO UNO
  268.    delay(20);
  269.      
  270.   //Opustime programovaci mod
  271.   programator.write(0x51);
  272.   programator.write(0x20);
  273.  
  274.   while(!programator.available()){;}
  275.             delay(50);
  276.             //programator.available() se zde nechtela obnovit primo ve for(), nevim proc ale musi se to udelat takto
  277.             int byty4 = programator.available();
  278.             for(int k = 0; k <= byty4; k++){
  279.             prichozi[k] = programator.read();
  280.         }
  281.  
  282.         //Zjisti zda bylo programovani uspesne
  283.         if(prichozi[0] == 0x14 && prichozi[1] == 0x10){
  284.           return 1;  
  285.         }else return 0;
  286.        
  287.   }
  288.  
  289.  
  290.  
  291.  void vynulujBuffer(){
  292.   for(int i = 0; i < 64; i++){
  293.       prichozi[i] = 0x00;
  294.     }
  295.  
  296.    while(programator.available()){
  297.     char c = programator.read();
  298.     }  
  299.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement