Forum: Mikrocontroller und Digitale Elektronik ATtiny4313 und Befehl ST Y,


von Rudi D. (rulixa)


Lesenswert?

Will 18 Byte per ST Y+,r26 (ja 26, nicht 28 self referencing) speichern 
beginnend von r1 .
Yl hält den Anfangswert 1.

Entsprechend der doc sollte das möglich sein und das AVR Studio meckert 
auch nicht. Aber es funktioniert nicht.

Jetzt brauch ich natürlich viele Zeilen dazu.

Description:Stores ... from a register to data space. For parts with 
SRAM data space consits of reg file, I/O memory and internal SRAM.  usw.

Falschangabe in der ATMELdoc. Oder: was lese ich falsch.

von S. Landolt (Gast)


Lesenswert?

> Aber es funktioniert nicht.
Lässt sich das näher beschreiben? Wie sieht das Programm, wie das 
(falsche) Resultat aus?

von Rudi D. (rulixa)


Lesenswert?

in den Speicherstellen stehen nicht die Daten die da hinsollen.

So wars geplant:
1
  ;  clr    r0
2
;    mov    YH,r0
3
;    mov    ZH,r0
4
;    ldi    ZL,resi    ;da stehen die 19 Bytes zu 
5
;    ldi    YL,1    ;restore ab Adresse 1 = r1
6
;    ldi    A,19
7
;ret_er1:rcall  read_ee    ;Byte nach C , ZL wird hier auch incr.
8
;    ST    Y+,C    ;in die registerbank ab r1
9
;    dec    A
10
;    breq  ret_er1
So funktioniert es dann:
1
ret_err:        ldi  ZL,resi
2
    rcall  read_ee    ;ZL is incremented in read_rr
3
    mov  var_func,C
4
    rcall  read_ee
5
    mov  var_step,C  
6
    
7
    rcall  ld_RR_    ;in die Zwischenstation RX[0:3]
8
    mov  RY0,RX0    ;load 125 MHz Konstante
9
    mov  RY1,RX1
10
    mov  RY2,RX2
11
    mov  RY3,RX3    ;und endlich in RY[0:3]
12
13
    rcall  ld_RR_    ;hole den Stepwert nachRR[0:3]
14
    mov  RR0,RX0    ;
15
    mov  RR1,RX1
16
    mov  RR2,RX2
17
    mov  RR3,RX3  
18
19
    rcall  ld_RR_    ;hole den offsetAccu  nachRR[4:7]
20
    mov  RR4,RX0    ;
21
    mov  RR5,RX1
22
    mov  RR6,RX2
23
    mov  RR7,RX3  
24
25
    rcall  ld_RR_    ;restore DDSaccu nach RX[0:]
26
27
    rcall  read_ee
28
    sts  $006f,C    ;Wobbelzeitbyte
rd_RR_ liest 4 Byte aus dem EEPROM nch RX0[0:3], resi ist die Adresse im 
EEPROM

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Jetzt fehlen noch die ".def"s, speziell für A,C, aber auch die anderen, 
und noch besser wäre ein assemblierbares Programm.
Bislang hat dieses Verfahren bei mir auf anderen AVR-Typen immer 
funktioniert, ich wüsste nicht, warum der ATtiny4313 eine Ausnahme sein 
sollte.

von Karl H. (kbuchegg)


Lesenswert?

Das du dir hier irgendwann
1
;    ldi    A,19
2
;ret_er1:rcall  read_ee    ;Byte nach C , ZL wird hier auch incr.
3
;    ST    Y+,C    ;in die registerbank ab r1
4
;    dec    A

das Register A zerschiessen wirst, hast du bedacht?

von Rudi D. (rulixa)


Lesenswert?

Karl H. schrieb:
> Das du dir hier irgendwann
>
1
> ;    ldi    A,19
2
> ;ret_er1:rcall  read_ee    ;Byte nach C , ZL wird hier auch incr.
3
> ;    ST    Y+,C    ;in die registerbank ab r1
4
> ;    dec    A
5
>
>
> das Register A zerschiessen wirst, hast du bedacht?

ja, A = r24

von Rudi D. (rulixa)


Lesenswert?

S. Landolt schrieb:
> Jetzt fehlen noch die ".def"s, speziell für A,C, aber auch die anderen,
> und noch besser wäre ein assemblierbares Programm.
> Bislang hat dieses Verfahren bei mir auf anderen AVR-Typen immer
> funktioniert, ich wüsste nicht, warum der ATtiny4313 eine Ausnahme sein
> sollte.

C = r26 siehe thread start. XL, XH wird nie verwendet.
A = r24

von S. Landolt (Gast)


Lesenswert?

Tja, dann kann es eigentlich nur noch an read_ee liegen.

von spess53 (Gast)


Lesenswert?

Hi

>;    ldi    YL,1    ;restore ab Adresse 1 = r1

Woher weißt du, ob YH = 0 ist?

MfG Spess

von Rudi D. (rulixa)


Lesenswert?

S. Landolt schrieb:
> Tja, dann kann es eigentlich nur noch an read_ee liegen.

;Read Inhalt der EEPROM-Adresse in ZL, Data in C register
read_ee:out  EEAR, ZL    ;Adresse im EEPROM festlegen
    cli
    sbi  EECR,EERE  ;set read auf 1, lesen beginnt.
    in  C,EEDR    ;und in C ablegen
    sei
    inc  ZL    ;nächste EEPROM Adresse festlegen
    ret

von Rudi D. (rulixa)


Lesenswert?

spess53 schrieb:
> Hi
>
>>;    ldi    YL,1    ;restore ab Adresse 1 = r1
>
> Woher weißt du, ob YH = 0 ist?
>
> MfG Spess

Entsprechend doc zu ST Befehl kann bei datspace <256 Byte der 
hibytepointer für andere Zwecke verwendet werden. Seite 140 AVR 
Instruction Set

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Die letzte Diskussion verstehe ich nicht, da stand doch:
> So wars geplant:
>  ;  clr    r0
>;    mov    YH,r0

von Rudi D. (rulixa)


Lesenswert?

S. Landolt schrieb:
> Die letzte Diskussion verstehe ich nicht, da stand doch:
>> So wars geplant:
>>  ;  clr    r0
>>;    mov    YH,r0

Wollte ich noch editieren, aber du warst schneller.

Übrigens will ich das ganze Programm nicht öffentlich machen, da es die 
Chinesen sofort nachbauen. Schau im RMorg nach DDS. Der thread läuft ja 
dort.

: Bearbeitet durch User
von Markus (Gast)


Lesenswert?

Warum lässt du dein Programm nicht einfach im Simulator laufen?

von Michael U. (amiga)


Lesenswert?

Hallo,

ich komme im Moment mit Deinen Adressen nicht klar. Die Registeradressen 
bei Memory-Zugriff sind Registernummer + 0x20 also 0x20 - 0x5F
Die erste Ram-Adresse des 4313 ist 0x60.
Da die letzte Ram-Adresse des 4313 0x160 ist dürfte YH auch nicht egal 
sein, das würde nur beim 2313 klappen.

Gruß aus Berlin
Michael

: Bearbeitet durch User
von Rudi D. (rulixa)


Lesenswert?

Michael U. schrieb:
> Hallo,
>
> ich komme im Moment mit Deinen Adressen nicht klar. Die Registeradressen
> bei Memory-Zugriff sind Registernummer + 0x20 also 0x20 - 0x5F
> Die erste Ram-Adresse des 4313 ist 0x60.
> Da die letzte Ram-Adresse des 4313 0x160 ist dürfte YH auch nicht egal
> sein, das würde nur beim 2313 klappen.
>
> Gruß aus Berlin
> Michael

Ich lese ja aus dem EEPROM mit max. 0...FF nach r1....r18 und ein Byte 
nach SRAM $006f

Der Zweck ist, dass nach ON/OFF des Gerätes die letzten Einstellungen 
wiederhergestellt werden.


Zuerst ist der Restoreprozess dran. Den letzten Zustand speichern im 
EEPROM muss ich erst machen. So weit bin ich noch nicht.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Vielleicht hilft ein Musterprogramm:
1
; avrasm2
2
  ldi  YH,0
3
  ldi  YL,1
4
  ldi  XL,19
5
loop:
6
   st  y+,XL
7
   dec XL
8
  brne loop
liefert:
r1 = $13
r2 = $12
r3 = $11
...
r18= $02
r19= $01

Ist allerdings ein ATtiny2313, ich habe keinen ATtiny4313.

von S. Landolt (Gast)


Lesenswert?

Wie stellen Sie fest, dass die Registerinhalte nicht den EEPROM-Bytes 
entsprechen?
Was passiert in den Interruptroutinen, die Sie im read_ee wieder 
freigeben?

von Rudi D. (rulixa)


Lesenswert?

Ja, so hab ich mir das auch vorgestellt.
LG Rudi

von Rudi D. (rulixa)


Lesenswert?

S. Landolt schrieb:
> Wie stellen Sie fest, dass die Registerinhalte nicht den EEPROM-Bytes
> entsprechen?
> Was passiert in den Interruptroutinen, die Sie im read_ee wieder
> freigeben?

Weil im Display nicht die Daten aus r1...r18 und $006F zu sehen sind.

von S. Landolt (Gast)


Lesenswert?

Dann haben Sie ja jetzt dieses Miniprogramm als Startpunkt. Sie lassen 
es laufen, sehen die korrekten Werte im Display, und können dann Stück 
für Stück Ihre Funktionen hinzufügen, bis der Fehler auftritt.

von Rudi D. (rulixa)


Lesenswert?

S. Landolt schrieb:
> Dann haben Sie ja jetzt dieses Miniprogramm als Startpunkt. Sie lassen
> es laufen, sehen die korrekten Werte im Display, und können dann Stück
> für Stück Ihre Funktionen hinzufügen, bis der Fehler auftritt.

Wollte noch sagen, dass dies vielleicht der Fehler ist, da im Interrupt 
Y verwendet wird, aber da kann ich ja sperren oder die Encodervariablen 
ins Sram legen.

In der Source isz zwar weiträumig ein CLI /Sei Konstrukt. Aber das wird 
in read_ee umgangen.

IM prinzip passiert
cli
dann wiederholt cli/sei in read_ee

und später das sei zum ersten cli.
Das wird aber gestört von read_ee.
Das wirds wohl gewesen sein.
Danke.
Werde mit den Encodervariablen ins SRAM gehen. Dann bleibt Y ungestört.
Na ja, bin ja Hobbyprogrammer.

LG Rudi

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Rudi D. schrieb:

> Ich lese ja aus dem EEPROM mit max. 0...FF nach r1....r18 und ein Byte
> nach SRAM $006f

Und? Wo die liest, interessiert bei ST Y+,reg kein Schwein. Wohin du 
schreibst, darum geht's hier.

Und da der 4313 nunmal mehr als 256Byte RAM hat, spielt dafür NATÜRLICH 
der Inhalt von YH eine Rolle, weil bei YL=1 entweder tatsächlich auf 
Adresse 1 geschrieben werden kann, was R1 im Registerfile entsprechen 
würde oder halt auf Adresse $101, was im SRAM liegt, je nachdem, ob Bit0 
in YH gesetzt ist oder nicht.

Kurzfassung: Du hast nicht annähernd kapiert, wie indirekte Adressierung 
funktioniert.

Außerdem hast du den Code mit einiger Wahrscheinlichkeit nichtmal selbst 
erdacht, sondern von einer Implementierung auf einem kleineren Tiny 
geklaut, die du nicht verstanden hast.

Und sowas will die Nichtveröffentlichung des Codes mit dem "Bösen 
Chinesen" erklären... Pfui Deibel!

Noch der allerletzte luschigste Codeklauer aus China kann ziemlich 
sicher besser programmieren als du! Zumindest kann er aber besser Code 
klauen und für seine Zwecke anpassen als du...

von c-hater (Gast)


Lesenswert?

c-hater schrieb:

> Und da der 4313 nunmal mehr als 256Byte RAM

-Adressraum hat.

So sollte es heißen.

von Carl D. (jcw2)


Lesenswert?

Nur will er eben genau RAM-Adresse 1..19, sprich R1..R19 indirekt 
erreichen.
Offenbar bedeutet "C hassen" nicht "Assembler lieben", sonst wär deine 
Antwort doch wohl nicht so sehr am Ziel vorbei, oder?

von Rudi D. (rulixa)


Lesenswert?

Was kann man schon von von manchen Leuten erwarten, die nicht einmal dem 
Thread folgen können oder wollen.. Ich kenne meine Grenzen recht gut. 
Der Beitrag ist gemeldet. C-HATER

von spess53 (Gast)


Lesenswert?

Hi

>Der Beitrag ist gemeldet. C-HATER

Witzbold. Ok, das unsinnige Laden mit R1 hatte ich übersehen. Aber deine 
Begründung ist genau so falsch. Der RAM des ATTiny4313 geht von 0 bis 
$15F. Beinhaltet also Register, IO und Ram. Damit trifft die Aussage vom 
Instruction Set bezüglich YH nicht zu.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Rudi D. schrieb:
> Was kann man schon von von manchen Leuten erwarten, die nicht einmal dem
> Thread folgen können oder wollen.. Ich kenne meine Grenzen recht gut.
> Der Beitrag ist gemeldet. C-HATER

Ich für meinen Teil werde den Beitrag trotzdem stehen lassen.
Denn für alle ist klar ersichtlich, dass er sich wieder mal an 
irgendeiner Aussage aufhängt, weil er denkt da kennt er sich aus. Alle 
anderen lesen den Code und sehen
1
    clr    r0
2
    mov    YH,r0

YH hat also definitiv den Wert 0 und damit ist auch klar, dass dem Autor 
das alles durchaus bewusst war.
c-hater eben. Wenn es darum geht ein paar Sager rauszuhauen ist er 
schnell bei der Hand. Konstruktives kommt schon seltener.

von Karl H. (kbuchegg)


Lesenswert?

Rudi D. schrieb:

> Wollte noch sagen, dass dies vielleicht der Fehler ist, da im Interrupt
> Y verwendet wird, aber da kann ich ja sperren oder die Encodervariablen
> ins Sram legen.

Oder du machst es dir zu eigen
* entweder in einer ISR ausnahmslos ALLE Register zu sichern, die 
benutzt werden
* oder dir eine grossformatige Erinnerung in den Code zu schreiben, dass 
einige Register (welche?) exclusiv für die Verwendung in der ISR 
reserviert sind und für nichts anderes gefahrlos benutzt werden dürfen.

von Rudi D. (rulixa)


Lesenswert?

Es ist ohnehin ein Problem, schon nach Monaten, bei Adaptierungen wieder 
alles zurückzurufen. Dabei bin ich ein eifriger Kommentierer. Bin 
natürlich für Anregungen dankbar. Dieses Projekt ist ein Geraet, ich war 
ja u.a. Radioentwickler in meiner Jugend, das fast alle Funktionen 
bereitstellt um Radios zu entwickeln, siehe RMorg Spec. und Fotos. Der 
digitale Wobbler ist eine davon.
Immer wieder gibt es Ergänzungwünsche, wie diesen, die letzte 
Einstellung zu speichern. Bis vor Kurzem reichte ein t2313, aber jetzt 
ist er zu klein geworden.
Zum St Y+,C Problem: Im Interrupt läuft eine Drehencoderroutine aus 
diesem Forum, die 0,1 oder 2 zurückliefert für Li, Re und nicht gedreht 
in YL. Na ja.

Vielen Dank fuer eure Inputs. Ohne Diskussion und Anregungen hätte ich 
sicher länger gesucht.
LG Rudi

von S. Landolt (Gast)


Lesenswert?

Weshalb werden innerhalb von read_ee die Interrupts eigens gesperrt?

1
;Read Inhalt der EEPROM-Adresse in ZL, Data in C register
2
read_ee:out  EEAR, ZL    ;Adresse im EEPROM festlegen
3
    cli
4
    sbi  EECR,EERE  ;set read auf 1, lesen beginnt.
5
    in  C,EEDR    ;und in C ablegen
6
    sei
7
    inc  ZL    ;nächste EEPROM Adresse festlegen
8
    ret
> In der Source isz zwar weiträumig ein CLI /Sei Konstrukt. Aber
> das wird in read_ee umgangen.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

S. Landolt schrieb:
> Weshalb werden innerhalb von read_ee die Interrupts eigens gesperrt?

Sowas wurde früher mal bei Schreib vorgängen aufs EEPROM gemacht, 
wimre, das Datenblatt des 2313 allerdings redet davon nicht mehr und bei 
Lesevorgängen ist es sowieso nicht nötig. Nach dem Setzen von EERE 
stehen die Daten in EEDR zur Verfügung - solange man will.

Es wird allerdings dringend empfohlen:
> The user should poll the EEPE bit before starting the read opera-
> tion.

Und das vermisse ich hier.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Matthias S. schrieb:
> Es wird allerdings dringend empfohlen:
>> The user should poll the EEPE bit before starting the read opera-
>> tion.
>
> Und das vermisse ich hier.

Nirgends steht, daß es im Code direkt davor stehen muß.
Es muß nur zeitlich davor gemacht werden, z.B. nach jedem 
Schreibzugriff.

von Ziegenpeter (Gast)


Lesenswert?

>;    dec    A
>;    breq  ret_er1

Der Fehler ist "breq" statt "brne" - so fleigt er schon nach dem ersten 
Durchlauf raus, weil er nur nach ret_er1 geht, falls A gleich 0 (ist 
aber 18).

von S. Landolt (Gast)


Lesenswert?

Schmerz, lass nach, tut das weh. Ich hatte diesen Teil mindestens 
zweimal überflogen.

von Paul B. (paul_baumann)


Lesenswert?

S. Landolt schrieb:
> Ich hatte diesen Teil mindestens
> zweimal überflogen.

Du mußt auch mal dort landen.

;-)

MfG Paul

von S. Landolt (Gast)


Lesenswert?

Ihn dünkt', er säh ein "ungleich Null",
das stand im Kommentar.
Er guckt' noch mal und merkt', es war
ja überhaupt nicht wahr.
"Wenn das noch mal passiert," sprach er,
"dann hör ich auf, noch dieses Jahr!"

von Paul B. (paul_baumann)


Lesenswert?

Da kann ich nur Kermit zitieren: Applaus, Applaus, Applaus!
https://www.youtube.com/watch?v=2NTEBK8erAQ

MfG Paul

von Rudi D. (rulixa)


Lesenswert?

BREQ statt BRNE: Danke. Ja das kommt davon, wenn man etwas fast 
automatisch schreibt.

Das cli und sei in read_ee ist einfach nur zur Sicherheit drin.

Das EEPE bit bleibt ja nur stehen, wenn der Schreibvorgang nicht 
erfolgreich war.
Die Schreibroutine hat die Abfrage natürlich. Dauert ja bis zu 3,4 ms je 
nach Code.

Aber eigentlich hat es nur Sinn, wenn man auch den watchdog das 
überwachen lässt, da man sonst voraussetzt dass EEPROM-Schreiben immer 
funktioniert.

An anderer Stelle, bei Steuerung des DDS via PC ist der watchdog aktiv.

So viel Echo hab ich gar nicht erwartet, Vielen Dank.
LG RUdi

von Rudi D. (rulixa)


Lesenswert?

So sieht das Ding von einigen Anderen aus, die es auch aufgebaut haben.

http://www.radiomuseum.org/forum/dds_heimsender_beispiele.html

von Rudi D. (rulixa)


Lesenswert?

Wollte nur verspätet sagen, dass alles perfekt funktioniert

Quelle Z Ziel Y  bei restore der Werte bzw. beim Speichern der 
Einstellungen.
Der DDS GEnerator kommt nach Wiedereinschalten mit der letzten 
Einstellung zurück.
Wenn's jemand interessiert.

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.