Όλοι οι μ/Ε της Atmel βασίζουν τους διάφορους bootloaders στο πρωτόκολο
STK500. Δεν μπορεί να προγραμματιστεί κάποιος απο αυτούς αν δεν ακολουθηθούν οι κανόνες αυτού του πρωτοκόλλου. Αν θα ήταν δυνατόν, μήπως θα μπορούσες να δώσεις μια παραπάνω εξήγηση στο "
σωστό bootloader που κουβαλάει το τσιπάκι";
Μπορείς να διαβάσεις εδώ:
http://www.atmel.com/images/doc2591.pdf για το πρωτόκολλο αυτό. Απο όσα ξέρω, κάθε μ/Ε γνωστών εταιρειών, για να εγγράψει στη μνήμη προγράμματος τον κώδικα μηχανής ενός hex αρχείου με bootloader ενσωματωμένο, πρέπει να ακολουθήσει κάποιους κανόνες που ορίζονται απο τη μορφή του ίδιου του hex αρχείου. Για παράδειγμα, ένα hex file ενός AVR μ/Ε έχει αυτή τη μορφή (ο κώδικας τυχαίος):
:10 0000 00 0C9434000C944F00 0C944F000C944F00 4F
:10 0010 00 0C944F000C944F00 0C944F000C944F00 24
:10 0020 00 0C944F000C944F00 0C944F000C944F00 14
:10 0030 00 0C944F000C944F00 0C944F000C944F00 04
:10 0040 00 0C944F000C944F00 0C944F000C944F00 F4
:10 0050 00 0C944F000C944F00 0C944F000C944F00 E4
:10 0060 00 0C944F000C944F00 11241FBECFEFD4E0 2E
:10 0070 00 DEBFCDBF11E0A0E0 B1E0E8EFF0E002C0 EC
:10 0080 00 05900D92A030B107 D9F711E0A0E0B1E0 E2
:10 0090 00 01C01D92A030B107 E1F70C9467000C94 E9
:10 00A0 00 00008FEF84B987B9 8EEF8AB9089501C0 37
:10 00B0 00 0197009759F020E0 0000000000000000 C8
:10 00C0 00 000000002F5F2A35 99F3F6CF08958FEF D7
:10 00D0 00 84B987B98EEF8AB9 8FEF88B985B98BB9 A2
:10 00E0 00 84EF91E00E945700 18B815B81BB884EF 50
:08 00F0 00 91E00E945700F0CF DF
:00 0000 01 FF
Αρχίζοντας απο την πρώτη γραμμή, έχουμε πάντα colon (, σύμφωνα με το πρώτυπο Intel HEX:
:10 = Αριθμός bytes που ακολουθούν, 0x10 (hex) ή 16(dec) bytes
0000 = Αριθμός γραμμής ή η διεύθυνση μνήμης προγράμματος στην οποία αντιστοιχεί η πληροφορία που ακολουθεί
00 = Τύπος data (δυο ψηφία), εκ των οποίων η μορφή μπορεί να είναι 00, 01, 02, 03, 04, 05 (στο τέλος η αναφορά για το τι σημαίνουν αυτά)
0C9434000C944F00 0C944F000C944F00 = 16 bytes πληροφορίας
4F = checksum των 16 bytes που εγγράφηκαν παραπάνω. Είναι το άθροισμα όλων των 16 bytes σε modulo 256 (%256) και τέλος το συμπλήρωμα αυτού ως προς 2.
:00 0000 01 FF = τέλος αρχείου, έχει πάντα αυτή τη μορφή.
Τώρα, για να γραφτεί όλο αυτό στη μνήμη προγράμματος με self writing πρέπει οπωσδήποτε να υπάρχει ήδη προ-εγγεγραμμένος στη μνήμη αυτή ένας bootloader. Αυτός, με το που ενεργοποιηθεί με τάση ο μ/Ε, συνεχώς διαβάζει τη σειριακή περιμένοντας για το colon (
. Μόλις δεί αυτό, ο κώδικας του bootloader εκτελεί συνεχώς ρουτίνες που εξασφαλίζουν την ανάγνωση καθενός απο τα πεδία που σου έγραψα παραπάνω. Αν σε κάποιο απο τα colon δεί 00 000 01 FF, κλείνει την εγγραφή, επανεκκινεί τον μ/Ε απο την αρχή του κανονικού προγράμματος.
Για αυτό δεν μπορώ να καταλάβω τι εννοείς με "
σωστό bootloader που κουβαλάει το τσιπάκι"... Όλοι οι bootloaders έτσι δουλεύουν...
Υ.Γ.: Συγχωρήστε με αν κάνω κάποια λάθη, υπάρχουν πιο σοφοί για να εξηγήσουν ακριβώς τι συμβαίνει...