Forum: Mikrocontroller und Digitale Elektronik AtTiny85 Selbstprogrammierung


von Marius S. (fhler)


Lesenswert?

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
}

: Bearbeitet durch User
Beitrag #5754953 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.