Forum: Mikrocontroller und Digitale Elektronik Serielle Programmierung des Attiny85


von Marius S. (fhler)


Lesenswert?

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

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Marius S. (fhler)


Lesenswert?

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.
von fhler (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Marius S. (fhler)


Lesenswert?

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?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

jo

von Marius S. (fhler)


Lesenswert?

Es lebt!!!


Danke für die Hilfe.

von Karl M. (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Naja, diesen originalen Bitbang-Code hat noch Brian Dean geschrieben, 
der ist nicht von mir. Aber ich habe zumindest ein Gefühl, wie das da 
aufgebaut ist. ;-)

von Ralph S. (jjflash)


Lesenswert?

... 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).

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

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.