Serielle Programmierung des Attiny85

OP #5716371
Hallo,

so langsam verzweifle ich an der Programmierung des AtTiny85. 
Mittlerweile habe ich auch den Aufbau des Programmspeichers richtig 
verstanden (128 Pages mit je 64byte Speicher aufgeteilt in 32 Zeilen mit 
je Low und Highbyte). Jedoch macht die Umsetzung Schwierigkeiten. Laut 
Datenblatt 
(https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet.pdf 
) Seite 153 stehen die Befehle die mir zu Verfügung stehen. Mit Adr_MSB 
(7bit = 128 Pages) adressiere ich die Page, mit Adr_LSB (5bit = 32 
Zeilen) den Offset auf der jeweiligen Page. Auf Seite 154 ist jedoch 
eine Abbildung die zeigt das ein Stück von Adr_MSB in das Adr_LSB Byte 
hineinreicht. Dies ist im geposteten Code entsprechend umgesetzt. Jedoch 
zeigt diese Abbildung auch das die Adressierung 15 Bit haben soll. (Wo 
sollen die herkommen????). Ich denke das Problem ist einfach das ich 
noch nicht den Algorithmus, beschrieben auf Seite 152, richtig umgesetzt 
habe. Ich soll beispielsweise die 6MSB der Adresse schreiben. Aber ich 
brauche zur Adressierung von 128 Pages 7 bit. Wenn ich dann nur die 6MSB 
schreibe, muss ich dann Maskieren oder shiften?

Hier der Code vom aktuell verwendeten Ablauf:
1
//LowByte
2
 spi_transaction(0x40, (Adr_MSB >> 3) & 0xFF, ((Adr_MSB << 5)& Adr_LSB) & 0xFF , DatenBytes[1 + multi * 2]); 
3
          delay(5);
4
          // spi_transaction(0x4C, Adr_MSB, Adr_LSB, 0x00);
5
          delay(5);
6

7
//HighByte
8
          spi_transaction(0x48, (Adr_MSB >> 3) & 0xFF, ((Adr_MSB << 5)& Adr_LSB) & 0xFF, DatenBytes[0 + multi * 2]); 
9
          delay(5);
10
          spi_transaction(0x4C, (Adr_MSB >> 3) & 0xFF, ((Adr_MSB << 5)& Adr_LSB) & 0xFF, 0x00);
11
          delay(5);

Gruß Marius
Moderator Persönliche Seite
Die dort gezeigten Befehle sind völlig generisch für alle AVRs gezeigt, 
ganz unabhängig von der Speichergröße.  Wenn du nur 5 Adressbits 
innerhalb einer Page hast (ist ja ein Tiny), dann kannst du bei "load 
program memory page" alle anderen Bits 0 setzen.

Bei "write program memory page" wiederum sind nur die Adressbits ab 5 
aufwärts relevant, denn programmiert wird dann sowieso das, was du zuvor 
in den Zwischenspeicher geladen hast.
OP
Jörg W. schrieb:
> Die dort gezeigten Befehle sind völlig generisch für alle AVRs gezeigt,
> ganz unabhängig von der Speichergröße.  Wenn du nur 5 Adressbits
> innerhalb einer Page hast (ist ja ein Tiny), dann kannst du bei "load
> program memory page" alle anderen Bits 0 setzen.

Kann ich, oder muss ich? Also Adr_MSB = 0x00 egal welche Page ich 
beschreiben will?

> Bei "write program memory page" wiederum sind nur die Adressbits ab 5
> aufwärts relevant, denn programmiert wird dann sowieso das, was du zuvor
> in den Zwischenspeicher geladen hast.

Heißt für mich Adr_LSB = 0x00, Adr_MSB = Adresse der Page?

---

Das Low-, Highbyte seperat schreiben oder beide gleichzeitig? (Die 
Kommentarzeichen bei dem einen Befehl einfach löschen)
Beitrag #5717307 wurde von einem Moderator gelöscht.
Gast
Cyblord -. schrieb im Beitrag #5717307:
> Womöglich ist die Flash-Programmierung eines AVR zu komplex für
> einen FHler. In einem solchen Fall sollte man fertige Tools verwenden.

Ich bin einfach nur auf der Ursachensuche warum es nicht funktioniert.
Moderator Persönliche Seite
Marius S. schrieb:

> Kann ich, oder muss ich? Also Adr_MSB = 0x00 egal welche Page ich
> beschreiben will?

Beim "load page" werden die höheren Bits ignoriert. Du kannst da also 
genausogut 42 reinschreiben.

>> Bei "write program memory page" wiederum sind nur die Adressbits ab 5
>> aufwärts relevant, denn programmiert wird dann sowieso das, was du zuvor
>> in den Zwischenspeicher geladen hast.
>
> Heißt für mich Adr_LSB = 0x00, Adr_MSB = Adresse der Page?

Nein, alle Bits der Basisadresse der Seite müssen gefüllt werden. Bei 
nur 5 Bit innerhalb der Adresse musst du auch in Adr_LSB noch 3 Bits 
eintragen.
OP
Jörg W. schrieb:
> Marius S. schrieb:
>
>>> Bei "write program memory page" wiederum sind nur die Adressbits ab 5
>>> aufwärts relevant, denn programmiert wird dann sowieso das, was du zuvor
>>> in den Zwischenspeicher geladen hast.
>>
>> Heißt für mich Adr_LSB = 0x00, Adr_MSB = Adresse der Page?
>
> Nein, alle Bits der Basisadresse der Seite müssen gefüllt werden. Bei
> nur 5 Bit innerhalb der Adresse musst du auch in Adr_LSB noch 3 Bits
> eintragen.

Ahhhhh, also die 3 LSB-Bits der Pageadresse in das Byte 3 (Ich beziehe 
mich auf die Abbildung auf Seite 154 im Datenblatt) und die restlichen 4 
Bit, ich habe ja insgesamt 7Bit zur Adressierung von 128 Pages) in Byte 
2?
Gast
Marius S.,

vielleicht ist es Dir bewusst: Jörg W. ist der Programmierer der avrdude 
Software, die ja "fast" jeder direkt oder indirekt als ISP 
Ansteuer-Software nutzt.
... dennoch ist AVRDUDE (und die Arbeit von Jörg daran) absolutes Gold 
wert. Ohne AVRDUDE wäre diese riesige Verbreitung unter den 
Hobbyelektronikern (und bei vielen profesionellen auch) nicht möglich 
gewesen.

AVRDUDE und die Unterstützung vieler Programmer (allen voran STK500v2, 
USBasp und den Arduino-Bootloder) machen dieses Werkzeug schier 
unbezahlbar.

Auch wenn das originale Bitbanging (hier ist wohl das "berühmte" ponyser 
gemeint) nicht von Jörg ist: absoluter Respekt an Jörg !

(aber so etwas wird er wohl des öfteren hören).
Moderator Persönliche Seite
Ralph S. schrieb:
> Auch wenn das originale Bitbanging (hier ist wohl das "berühmte" ponyser
> gemeint)

Nö, AVRDUDE hat mit Programmern am Parallelport angefangen. Sowas hatte 
damals noch jeder Computer, und man konnte komplett mit einem passiven 
Aufbau auskommen, wenn man wollte.  "ponyser" braucht zumindest noch ein 
bisschen Elektronik (ein oder zwei Transistoren), das kam dann erst 
später dazu – ich glaube, sogar erst nach dem ersten STK500, dessen 
Implementierung aber jemand anders beigesteuert hat, und die damals noch 
im Wesentlichen ein Wrapper um die Bitbang-Engine war, die wiederum das 
generische SPI-Kommando des STK500 genutzt hat.

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.