- Labornetzteil AliExpress         
Seite 5 von 5 ErsteErste ... 345
Ergebnis 41 bis 43 von 43

Thema: Probleme mit Bootloader Beispielquellcode

  1. #41
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.09.2005
    Beiträge
    276
    Anzeige

    Powerstation Test
    Hab ich .... und sende unter Delphi

    Gento

  2. #42
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Beiträge
    209
    uih, kannst du da freundlicherweise sagen was du wie gemacht hast, daß es funktioniert?

  3. #43
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.09.2005
    Beiträge
    276
    Ohne zu Debuggen bleibt der Code < 1 K Word

    Debugen=0 dann ohne LCD Anzeigen zwischendurch


    Baud=19200 reicht vom Speed und ist sicherer , wird ja nicht jeden Tag bei Kunden upgedatet.
    Bei mir geht jede Baudzahl nach oben auch.

    Um mir nicht selbst ins Knie zu schießen habe ich die relevanten stellen geschwärtzt. "****"


    Code:
    ' Bootloader für Mega 32
    
    
    $crystal = 16000000
    $baud = 19200                                                                   '38400                                                                   'this loader uses serial com
    $regfile = "m32def.dat"
    
    Config Portb = Output
    Config Lcd = 20 * 2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.6 , Rs = Portb.5
    Config Lcdbus = 4
    
    Config Pind.0 = Input                                                           'RxD für RS232
    Config Pind.1 = Output                                                          'TxD für RS232
    
    Const Debugen = 0                                                               'Zu Testzwecke auf 1 setzen
    
    
    $loader = $3c00                                                                 '$3800= 2048 word    $3c00= 1024 words
    
    
    Const Maxwordbit = 6                                                            'Z6 is maximum bit                                   '
    Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    
    Const Maxword = 128                                                             'Nur für Mega 32
    Const Maxwordshift = Maxwordbit + 1
    
    'Dim the used variables
    Dim Blockstatus As Byte
    Dim Fehlerversuche As Byte
    Dim Blocknummer As Byte
    Dim Blocklocalnummer As Byte
    Dim Vor_checksumme_vom_pc As Byte
    Dim Checksumme_vom_pc As Byte
    Dim Buffer(128) As Byte
    Dim Checksumme As Byte
    Dim Schleife As Byte
    Dim Spmcrval As Byte                                                            ' self program command byte value
    
    Dim Zeiger As Long                                                              'this is the Z pointer word
    Dim Vl As Byte
    Dim Vh As Byte                                                                  ' these bytes are used for the data values
    Dim Wrd As Word
    Dim Page As Word                                                                'these vars contain the page and word address
    Dim Ladeziel As Byte
    Dim Kruept As Byte
    
    
    
    
    Disable Interrupts                                                              'we do not use ints
    
    
    'some constants used in serial com
    Const Nak = &H15
    Const Ack = &H06
    Const Can = &H18
    
    
    $timeout = 100000                                                               'we use a timeout
    'When you get LOADER errors during the upload, increase the timeout value
    'for example at 16 Mhz, use 200000
    
    
    Waitms 100
    Initlcd
    Cursor Off Noblink
    Cls
    Locate 1 , 1
    Lcd "Init"
    Blocklocalnummer = 0
    For Schleife = 0 To 15
      #if Debugen = 0
       Lcd "."
      #endif
      #if Debugen = 1
       Lcd "?"
      #endif
    
      Blockstatus = Waitkey()                                                       'Wartet ob der PC die Ladesequenz beginnt
      Print Chr(blockstatus);                                                       'Echo zurück
      If Blockstatus = 123 Then                                                     'Wenn Ladesequenz=123 dann wird der normale Flash geladen
                         Ladeziel = 0                                               '
                         Goto Loader
                       End If
      #if Debugen = 1
      If Blockstatus = 124 Then                                                     'Wenn Ladesequenz=124 dann wird ind EEPROM geladen
                         Ladeziel = 1                                               '
                         Goto Loader
                       End If
      #endif
    Next Schleife
    
    Goto _reset                                                                     'Wenn zu lange gewartet dann springe ins normale Program
    '################################################################################################################################
    Loader:
      Locate 1 , 1
      Lcd "Update              "                                                    'die eigendliche Laderoute
      Do
         Blockstatus = Waitkey()
      Loop Until Blockstatus = 0
    
    
    
      If Ladeziel = 0 Then
         Spmcrval = 3 : Gosub Do_spm                                                ' erase  the first page
         Spmcrval = 17 : Gosub Do_spm                                               ' re-enable page
      End If
    
    
    Fehlerversuche = 10                                                             'number of retries
    '######################  Einleseschleife ###############################################
    Do
      Checksumme = 0                                                                'checksum is 0 when we start
      Print Chr(nak);                                                               ' firt time send a nack
      Do
        Blockstatus = Waitkey()                                                     'wait for statuse byte
    
        Select Case Blockstatus
           Case 1 To 3:                                                             ' 1=normal 2=Invers  3=Krüpt
                Incr Blocklocalnummer                                               'increase local block count
                Checksumme = 1                                                      'checksum is 1
    
                Blocknummer = Waitkey()                                             'hole Block Nr die übertragen werden soll .Start ist 1
    
                Checksumme = Checksumme + Blocknummer                               'get block
                Vor_checksumme_vom_pc = Waitkey()
                Checksumme = Checksumme + Vor_checksumme_vom_pc                     'get checksum first byte
                    For Schleife = 1 To 128                                         'get 128 bytes
                      Buffer(schleife) = Waitkey()
                      Checksumme = Checksumme + Buffer(schleife)
                      If Blockstatus = 2 Then Buffer(schleife) = Not Buffer(schleife)
                      If Blockstatus = 3 Then
                                        Kruept = ********
                                        Kruept = Kruept - *****
                                        Buffer(schleife) = Buffer(schleife) ******** Kruept
                                     End If
                    Next
                Checksumme_vom_pc = Waitkey()                                       'Warte auf Checksumme vom PC
                #if Debugen = 1
                Locate 1 , 1
                Lcd "Uebertrage Block:"
                Lcd Blocknummer
                Locate 2 , 1
                Lcd "Bstatus :"
                Lcd Blockstatus
                Lcd "   "
                #endif
                If Blocklocalnummer = Blocknummer Then                              'are the blocks the same?
                                                    If Checksumme_vom_pc = Checksumme Then       'is the checksum the same?
                                                                                        Gosub Schreibe_seite       'yes go write the page
                                                                                        Print Chr(ack);       'acknowledge
                                                                                      Else       'no match so send nak
                                                                                        Print Chr(nak);
                                                                                      End If
                                                   Else
                                                     Print Chr(nak);                'blocks do not match
                                                   End If
           Case 4:                                                                  ' Beendet die Übertragung mit erfolg
                 If Wrd > 0 Then                                                    'if there was something left in the page
                              Wrd = 0                                               'Z pointer needs wrd to be 0
                              Spmcrval = 5
                              Gosub Do_spm                                          'write page
                              Spmcrval = 17
                              Gosub Do_spm                                          ' re-enable page
                            End If
                 Print Chr(ack);
                 #if Debugen = 1                                                    ' send ack and ready
                 Locate 2 , 1
                 Lcd "Bstatus :"
                 Lcd Blockstatus
                 Lcd "   "
                 Locate 1 , 21
                 Lcd "Update Erfolgreich"
                 Wait 5
                 #endif
                 Goto _reset                                                        ' start new program
           Case &H18:                                                               ' PC aborts transmission
                 Goto _reset                                                        ' ready
           Case 123 : Exit Do                                                       'was probably still in the buffer
           Case 124 : Exit Do
           Case Else
              Exit Do                                                               ' no valid data
        End Select
      Loop
    ' Fehlerübertragungsbehandlung
      If Fehlerversuche > 0 Then                                                    'attempte left?
         Waitms 1000
         Decr Fehlerversuche                                                        'decrease attempts
      Else
         Goto _reset                                                                'reset chip
      End If
    Loop
    '####################### Ende Einleseschleife #############################
    Schreibe_seite:                                                                 'Beschreibt eine oder mehr seiten
     If Ladeziel = 0 Then
                       For Schleife = 1 To 128 Step 2                               'we write 2 bytes into a page
                         Vl = Buffer(schleife)
                         Vh = Buffer(schleife + 1)                                  'get Low and High bytes
                         lds r0, {vl}                                               'store them into r0 and r1 registers
                         lds r1, {vh}
                         Spmcrval = 1
                         Gosub Do_spm                                               'write value into page at word address
                         Wrd = Wrd + 2                                              ' word address increases with 2 because LS bit of Z is not used
                         If Wrd = Maxword Then                                      ' page is full
                                            Wrd = 0                                 'Z pointer needs wrd to be 0
                                            Spmcrval = 5
                                            Gosub Do_spm                            'write page
                                            Spmcrval = 17
                                            Gosub Do_spm                            ' re-enable page
                                            Page = Page + 1                         'next page
                                            Spmcrval = 3
                                            Gosub Do_spm                            ' erase  next page
                                            Spmcrval = 17
                                            Gosub Do_spm                            ' re-enable page
                                          End If
                       Next
    
                     #if Debugen = 1
                     Else                                                           'eeprom
                      For Schleife = 1 To 128
                        Writeeeprom Buffer(schleife) , Wrd
                        Wrd = Wrd + Schleife
                      Next
                    #endif
                    End If
    
    Return
    '###############################################################################
    Do_spm:
      Bitwait Spmcsr.0 , Reset                                                      ' check for previous SPM complete
      Bitwait Eecr.1 , Reset                                                        'wait for eeprom
    
      Zeiger = Page                                                                 'make equal to page
      Shift Zeiger , Left , Maxwordshift                                            'shift to proper place
      Zeiger = Zeiger + Wrd                                                         'add word
      lds r30,{Zeiger}
      lds r31,{Zeiger+1}
    
    
      Spmcsr = Spmcrval                                                             'assign register
      spm                                                                           'this is an asm instruction
      nop
      nop
    Return
    '###############################################################################

    Gruß Gento

Seite 5 von 5 ErsteErste ... 345

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests