Forum: Mikrocontroller und Digitale Elektronik AVR ISP Programmer in C problem mit Load Flash Buffer


von MOBA 2. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich programmiere einen ISP Programmer selbst (in C).
Ich kann bis jetzt Fuses lesen/schreiben, Signature Bytes lesen, und 
einen Chip-Erase durchführen.

Was aber irgendwie absolut nicht klappen will, ist das Beschreiben des 
Flash. Nachfolgend die Funktion die das eigentlich machen soll. Vorher 
wird die Funktion aufgerufen, welche die Daten über die Uart entgegen 
nimmt und parsed. Diese Funktion habe ich von meinem Bootloader 
genommen, die funktioniert (splittet einfach das hex-format auf und gibt 
die Daten in entsprechenden Variablen/Arrays wieder).


Es geht hierbei um einen Attiny13 der beschrieben werden soll.
Ich sende die Befehle, Adresse unteren 4bit (2x die Daten an die gleiche 
Adresse, erst LSB dann MSB).
Dann (wenn das insg. 32 byte geladen wurden in den buffer), wird die 
page geschrieben. Ich habe mal das Dokument (IST.hex) angehängt, und das 
was drauf geschrieben werden soll (SOLL.hex).

Kann mir jmd. sagen, was ich dort falsch mache?


1
//fill buffer
2
    for (uint8_t i = NULL; i < WordsPerPage; i++)
3
    {
4
      spi_data(0x40);
5
      spi_data(0x00);
6
      spi_data(adress|i);          //low byte adr for word offset
7
      spi_data(DATA_LSB_MSB[i*2]);    //lsb data
8
      _delay_ms(8);
9
      
10
      
11
      spi_data(0x48);
12
      spi_data(0x00);
13
      spi_data(adress|i);            //high byte adr for word offset
14
      spi_data(DATA_LSB_MSB[(i*2) + 1]);    //msb data
15
      _delay_ms(8);  
16
    }
17
    
18
    
19
    //Now write the data to page
20
    spi_data(0x4C);
21
    spi_data((adress) >> 8);
22
    spi_data((adress) >> 15);
23
    spi_data(0x00);
24
    
25
    _delay_ms(10);

von Karl M. (Gast)


Lesenswert?

Hallo,

und wie schnell ist dein ISP Takt ?

die Bedingungen dafür stehen im Datenblatt des Ziel Atmel AVR µC.

von MOBA 2. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

passt alles (125kHz << FCPU/4). Sonst ginge der Rest ja nicht.
Ich habe jetzt was herausgefunden, anscheinend besitzt der Attiny13 nur 
2 Pages (512 bytes/page). Allerdings sehe ich das nicht anhand des 
Datenblatts wo diese Information steht.

Ich hatte gedacht, dass es 32bytes / page sind und insg. 32 pages. Steht 
auch so im Datenblatt. jetzt habe ich testweise einfach mal eine 
Schleife gemacht (eigentlich den obigen Quellcode) und die Page fest 
gesetzt (auf 1). Die Daten sind am Anfang 0x8844 dann zählt der die 
daten in der schleife einfach hoch - siehe da, es läuft.

ABER: Hier sieht man das Problem (siehe Anhang). Page 1 ist mitten im 
Flash, nicht Zeile 2-3.

Was ist das?!

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Marius D. schrieb:
> ABER: Hier sieht man das Problem (siehe Anhang). Page 1 ist mitten im
> Flash, nicht Zeile 2-3.
>
> Was ist das?!

 Falsche Adresse.
1
    //Now write the data to page
2
    spi_data(0x4C);
3
4
//***** So geht die Page Adresse  *****
5
  PageAdr = address / 32;
6
  WordAdr = address % 32;
7
8
    spi_data((PageAdr) >> 4);      //* bit 4 => bit 0
9
    spi_data((PageAdr) << 4);      //* bits 0..3 => bits 4..7
10
//***** So geht die Page Adresse  *****
11
12
    spi_data(0x00);
13
    
14
    _delay_ms(10);

 EDIT:
 adress ist uint8_t, da es nur 32 Pages gibt, reichen 5 bits vollkommen.
 Evtl. casten.

: Bearbeitet durch User
von MOBA 2. (Gast)


Lesenswert?

Hallo,

danke dir, hatte es kurz bevor ich dies gelesen habe schon selber 
gemerkt, dass wenn ich die adressen so sende, ich mich immer bei der 
ersten befinde und dann springe.

Mit dem % kann ich jetzt auch bequemer durch die worte gehen, da per 
uart immer nur 16 bytes empfangen werden, jetzt funktioniert es. Vielen 
Dank!

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.