AtTiny85 Selbstprogrammierung

OP #5754567
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
}
Beitrag #5754953 wurde von einem Moderator gelöscht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.