Hallo,
ich habe ja vor das sich ein AtTiny85 mit über den SPI-Bus
bereitgestellten Programmdaten selbst programmieren soll. (Datenblatt S.
141 ff.)
Die Daten werden auch über den BUS geschickt jedoch macht der Tiny im
Anschluss nicht was er soll (eine LED blinken lassen). Meine
Analysemöglichkeiten sind beschränkt da der Tiny nichts über den
seriellen Monitor ausgeben kann.
Das Fusebit im Tiny habe ich entsprechend gesetzt damit eine
Selbstprogrammierung überhaupt möglich ist. Ob die Spanne für alle 3
nötigen Aktionen (fill page buffer, erease page, write page) von 3,7 -
4,5 ms eingehalten wird weiß ich leider nicht. Vielleicht liegt es eben
"einfach" am Timing. Oder ich muss erst das SPMCSR-Register Setzen bevor
der Assembler Code folgt?
Gruß
Marius
Hier der Code der auf dem Tiny (vor der Selbstprogrammierung) läuft:
EDIT: Die Definition der Variablen müssen natürlich außerhalb der
setup-Schleife stehen und tun dies auch.
1 | void setup() {
|
2 | // put your setup code here, to run once:
|
3 |
|
4 | char Adr_MSB = 0;
|
5 | char Adr_LSB = 0;
|
6 | char DataHigh = 0;
|
7 | char DataLow = 10;
|
8 | char ZL_Data = 0;
|
9 | char ZH_Data = 0;
|
10 | //int zaehler_Datenuebertragung = 0;
|
11 | int DataLowHighzaehler = 0;
|
12 | int Prog_EN = 0;
|
13 |
|
14 | //sei();
|
15 | SREG = (1 << 7); //Globale Interrupts aktivieren
|
16 | USICR = 0b01011000; //Einrichtung USI: CounterInterrupt an, 3 Wire Mode (SPI), Clock extern positive Flanke
|
17 | }
|
18 |
|
19 | ISR(USI_OVF_vect)
|
20 | {
|
21 | if (DataLowHighzaehler == 0)
|
22 | {
|
23 | DataLow = USIBR;
|
24 | USISR = (1 << USIOIF); // Overflow Flag zurücksetzen
|
25 | DataLowHighzaehler++;
|
26 | }
|
27 | else if ( DataLowHighzaehler == 1)
|
28 | {
|
29 | DataHigh = USIBR;
|
30 | USISR = (1 << USIOIF); // Overflow Flag zurücksetzen
|
31 | DataLowHighzaehler = 0;
|
32 | Prog_EN = 1;
|
33 | }
|
34 | }
|
35 |
|
36 | void loop() {
|
37 |
|
38 | if (Prog_EN == 1)
|
39 | {
|
40 | ZL_Data = (Adr_MSB << 6 | Adr_LSB << 1) & 0xFE;
|
41 | ZH_Data = (Adr_MSB >> 2) & 0x1F;
|
42 |
|
43 | //Fill Page buffer:
|
44 | asm volatile("lds r30,ZL_Data \n\t" : "=r"(ZL_Data) : :"r30" );
|
45 | asm volatile("lds r31,ZH_Data \n\t" : "=r"(ZH_Data) : :"r31" );
|
46 | asm volatile("lds r0,DataHigh \n\t" : "=r"(DataHigh): :"r0" );
|
47 | asm volatile("lds r1,DataLow \n\t" : "=r"(DataLow) : :"r1" );
|
48 | SPMCSR = 0b00000001;
|
49 |
|
50 | //Erease Page:
|
51 | asm volatile("lds r30,ZL_Data \n\t" : "=r"(ZL_Data) : :"r30" );
|
52 | asm volatile("lds r31,ZH_Data \n\t" : "=r"(ZH_Data) : :"r31" );
|
53 | SPMCSR = 0b00000011;
|
54 |
|
55 | //Write Page:
|
56 | asm volatile("lds r30,ZL_Data \n\t" : "=r"(ZL_Data) : :"r30" );
|
57 | asm volatile("lds r31,ZH_Data \n\t" : "=r"(ZH_Data) : :"r31" );
|
58 | SPMCSR = 0b00000101;
|
59 |
|
60 | Adr_LSB++;
|
61 | if (Adr_LSB == 32)
|
62 | {
|
63 | Adr_LSB = 0;
|
64 | Adr_MSB = Adr_MSB + 1;
|
65 | }
|
66 | Prog_EN = 0;
|
67 |
|
68 | }
|
69 | }
|