Liebe Forumsmitglieder,
ich versuche gerade meinem Bootloader um die Speicherlogic aus den Bascom-Beispielen zu erweitern.
Ich benutzte einen ATMEGA644PA. Laut Datenblatt hat dieser pro Page 128 Words und insgesamt 256 Pages.
Im Beispiel (das ja sogar den 644 voreingestellt hat Const Loaderchip = 644 ) wird Maxword wie folgt berechnet
Const Maxword =(2 ^ Maxwordbit) * 2 '128
wobei für den 644 Maxwordbit = 7 ist. Damit ist, so ich mich nicht verreichne, Maxword = 256.
In dem Abschnitt Writepage wird nun eine Schleife von 1 bis 128 in 2er-Schritten durchlaufen und Wrd um je 2 erhöht. Das heißt Wrd wird am Ende 128 sein.
Zeile 10 gibt es aber die Bedingung If Wrd = Maxword. Das kann ja nie erfüllt sein.
Alles anzeigen
Im Datenblatt des 644PA steht:
Device Flash size Page size PCWORD No. of pages PCPAGE PCMSB
ATmega164A/ATmega164PA 8K words (16KBytes) 64 words PC[5:0] 128 PC[12:6] 12
ATmega324A/ATmega324PA 16K words (32KBytes) 64 words PC[5:0] 256 PC[13:6] 13
ATmega644A/ATmega644PA 32K words (64KBytes) 128 words PC[6:0] 256 PC[14:7] 14
ATmega1284/ATmega1284P 64K words (128KBytes) 128 words PC[6:0] 512 PC[15:7] 15
Also 128 Words pro Page. Im Beispiel werden aber nur 128 Byte (also 64 Word) gelesen (Zeile 15 bis 17).
Alles anzeigen
Jetzt bin ich verwirrt. Müsste nicht die Schleife im Writepage-Abschnitt bis 256 gehen, respektive 128 Words zusammensetzten aus 256 Byte und gleichzeitig Maxword = 128 sein?
Wäre toll, wenn mich Bascomanfänger jemand in die richtige Richtung schupsen könnte.
Freundliche Grüße und schönes Wochenende
ich versuche gerade meinem Bootloader um die Speicherlogic aus den Bascom-Beispielen zu erweitern.
Ich benutzte einen ATMEGA644PA. Laut Datenblatt hat dieser pro Page 128 Words und insgesamt 256 Pages.
Im Beispiel (das ja sogar den 644 voreingestellt hat Const Loaderchip = 644 ) wird Maxword wie folgt berechnet
Const Maxword =(2 ^ Maxwordbit) * 2 '128
wobei für den 644 Maxwordbit = 7 ist. Damit ist, so ich mich nicht verreichne, Maxword = 256.
In dem Abschnitt Writepage wird nun eine Schleife von 1 bis 128 in 2er-Schritten durchlaufen und Wrd um je 2 erhöht. Das heißt Wrd wird am Ende 128 sein.
Zeile 10 gibt es aber die Bedingung If Wrd = Maxword. Das kann ja nie erfüllt sein.
BASCOM-Quellcode
- Writepage:
- If Bkind = 0 Then
- For J = 1 To 128 Step 2 'we write 2 bytes into a page
- Vl = Buf(j) : Vh = Buf(j + 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
- Else 'eeprom
- For J = 1 To 128
- Writeeeprom Buf(j) , Wrd
- Wrd = Wrd + 1
- Next
- End If
- Toggle Portb.2 : Waitms 10 : Toggle Portb.2 'indication that we write
- Return
Im Datenblatt des 644PA steht:
Device Flash size Page size PCWORD No. of pages PCPAGE PCMSB
ATmega164A/ATmega164PA 8K words (16KBytes) 64 words PC[5:0] 128 PC[12:6] 12
ATmega324A/ATmega324PA 16K words (32KBytes) 64 words PC[5:0] 256 PC[13:6] 13
ATmega644A/ATmega644PA 32K words (64KBytes) 128 words PC[6:0] 256 PC[14:7] 14
ATmega1284/ATmega1284P 64K words (128KBytes) 128 words PC[6:0] 512 PC[15:7] 15
Also 128 Words pro Page. Im Beispiel werden aber nur 128 Byte (also 64 Word) gelesen (Zeile 15 bis 17).
BASCOM-Quellcode
- Do
- Bblocklocal = 1
- Bstarted = 0 ' we were not started yet
- Csum = 0 'checksum is 0 when we start
- Print Chr(nak); ' firt time send a nack
- Do
- Bstatus = Waitkey() 'wait for statuse byte
- Select Case Bstatus
- Case 1: ' start of heading, PC is ready to send
- Csum = 1 'checksum is 1
- Bblock = Waitkey() : Csum = Csum + Bblock 'get block
- Bcsum1 = Waitkey() : Csum = Csum + Bcsum1 'get checksum first byte
- For J = 1 To 128 'get 128 bytes
- Buf(j) = Waitkey() : Csum = Csum + Buf(j)
- Next
- Bcsum2 = Waitkey() 'get second checksum byte
- If Bblocklocal = Bblock Then 'are the blocks the same?
- If Bcsum2 = Csum Then 'is the checksum the same?
- Gosub Writepage 'yes go write the page
- Print Chr(ack); 'acknowledge
- Incr Bblocklocal 'increase local block count
- Else 'no match so send nak
- Print Chr(nak);
- End If
- Else
- Print Chr(nak); 'blocks do not match
- End If
- Case 4: ' end of transmission , file is transmitted
- If Wrd > 0 And Bkind = 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
- ' Waitms 100 ' OPTIONAL REMARK THIS IF THE DTR SIGNAL ARRIVES TO EARLY
- Print Chr(ack); ' send ack and ready
- Portb.3 = 0 ' simple indication that we are finished and ok
- Waitms 20
- 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
- If Bretries > 0 Then 'attempte left?
- Waitms 1000
- Decr Bretries 'decrease attempts
- Else
- Goto _reset 'reset chip
- End If
- Loop
Jetzt bin ich verwirrt. Müsste nicht die Schleife im Writepage-Abschnitt bis 256 gehen, respektive 128 Words zusammensetzten aus 256 Byte und gleichzeitig Maxword = 128 sein?
Wäre toll, wenn mich Bascomanfänger jemand in die richtige Richtung schupsen könnte.
Freundliche Grüße und schönes Wochenende