Forum: Mikrocontroller und Digitale Elektronik Arduino AVR inline ASM. Wie TCCR1B schreiben?


von Hadmut F. (hadmut)


Lesenswert?

Ich möchte in inline asm in TCCR1B mal eine null und dann eine eins 
reinschreiben. Geht aber nicht. Arduino IDE.

Versucht:
asm("out  _SFR_IO_ADDR(TCCR1B),R16");
asm("out  TCCR1B,R16");
asm("sts  _SFR_IO_ADDR(TCCR1B),R16");
asm("sts  TCCR1B,R16");
Geht nicht.

Wo kann ich den wert für TCCR1B nachschauen?
Oder braucht asm da einen include?

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?


von Hadmut F. (hadmut)


Lesenswert?

Habs gefunden.
      asm("sts  0x81,0x0");
      asm("nop");
      asm("nop");
      asm("sts  0x81,0x1");

von Joachim B. (jar)


Lesenswert?

Hadmut F. schrieb:
> Habs gefunden.

da kann dir aber immer noch ein Interrupt reinfunken!

Es fehlt also ein cli und sei

: Bearbeitet durch User
von Hadmut F. (hadmut)


Angehängte Dateien:

Lesenswert?

Richtig, cli und sei, TY.

Ausserdem fehlt mir noch die registernummen für TCCR3B vom LGT8F328 
clone.
-> gefunden.

Ziel ist es die parallel laufenden timer1 und timer3 etwas in der phase 
zu schieben.
1
    else if (ch == 'T')
2
    {
3
      asm("cli");
4
      asm("sts  0x81,0x10");
5
      asm("nop");
6
      asm("nop");
7
      asm("sts  0x81,0x11");
8
      asm("sei");
9
    }
10
    else if (ch == 't')
11
    {
12
      asm("cli");
13
      asm("sts  0x91,0x10");
14
      asm("nop");
15
      asm("nop");
16
      asm("sts  0x91,0x11");
17
      asm("sei");
18
    }

: Bearbeitet durch User
von Rolf (rolf22)


Lesenswert?

Hadmut F. schrieb:
> Richtig, cli und sei

Anfängerfehler, der 999 mal gut geht und 1 mal zu versteckten Problemen 
führt.
Beitrag "Arduino: Syntax von cli() sei()"

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hadmut F. schrieb:
>       asm("sts  0x81,0x11");

Das speichert den Inhalt von R17, der hier undefiniert ist, in 0x81.

Korrekt:
1
__asm volatile ("sts %0, %1"
2
                :
3
                : "n" (& TCCR1B), "r" ((uint8_t) 0x11)
4
                : "memory");
und falls es eine I/O Adresse ist:
1
__asm volatile ("out %i0, %1"
2
                :
3
                : "n" (& TCCR1B), "r" ((uint8_t) 0x11)
4
                : "memory");

von Hadmut F. (hadmut)


Angehängte Dateien:

Lesenswert?

TY
Er interpretiert 0x11 als registernummer anstatt als immidiate value?
Wäre das richtig?
1
      asm("push r16");
2
      asm("cli");
3
      asm("ldi  r16,0x10");
4
      asm("sts  0x91,r16");
5
      asm("nop");
6
      asm("nop");
7
      asm("ldi  r16,0x11");
8
      asm("sts  0x91,r16");
9
      asm("sei");
10
      asm("pop r16");
Die %irgendwas syntax verstehe ich leider nicht.

Es funktioniert.

: Bearbeitet durch User
Beitrag #7675407 wurde vom Autor gelöscht.
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hadmut F. schrieb:
> Er interpretiert 0x11 als registernummer

Ja. Der 2te Operand von STS ist ein Register, siehe Instruktionssatz.

> Wäre das richtig?

Nein.  So kann man Inline Asm nicht verwenden.  Es erzeugt vielleicht 
hier und da den erwarteten Code, ist dann aber Zufall.

> Die %irgendwas syntax verstehe ich leider nicht.

Ohne Inline Asm zu verstehen ist die Wahrscheinlichkeit sehr gering, 
dass du die korrekte Syntax / Semantik rätst.  Sich da einzuarbeiten ist 
keine Zeitverschwendung; ist immer noch einfacher und nervenschonender 
als zumzuraten und den ganzen Salat dann irgendwann zu debuggen (und 
dann erneut zu raten etc etc etc).

> Es funktioniert.

Das bedeutet nicht, dass der Code korrekt ist.

: Bearbeitet durch User
von Hadmut F. (hadmut)


Lesenswert?

Kann ich beim LGT8F328P 32 pin den CT3A compare out von PD1/PF1/TX1 auf 
ACOP/D6 umleiten?

Bei der 48pin variante soll das mit reg PMX1 bit C3AC = 1 gehen.
Bei der 32pin variante geht das nicht ?
Oder reicht es nicht den D6 auf out zu drehen?

Grund: der normale CT3A pin is auch TX1, heisst der serielle monitor 
wird gestört. Einen lqfp48 hab ich nicht.

https://wolles-elektronikkiste.de/en/minievb-boards-an-overview#using_alternative_pins

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Hadmut F. schrieb:
> Kann ich beim LGT8F328P 32 pin den CT3A compare out von PD1/PF1/TX1 auf
> ACOP/D6 umleiten?

Was hat diese Frage mit DIESER Diskussion zu tun? Mach eine neue auf!

von Hadmut F. (hadmut)


Lesenswert?

Döp

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hadmut F. schrieb:
> Die %irgendwas syntax verstehe ich leider nicht.

Vielleich hülft ja ein Blick (oder mehrere) ins Inline Assembler 
Kochbuch

https://avrdudes.github.io/avr-libc/avr-libc-user-manual-2.2.0/inline_asm.html

von Hadmut F. (hadmut)


Lesenswert?


von Thomas (kosmos)


Lesenswert?

in der passenden .inc Datei findest du alle Adressen, manchmal gibts das 
auch im Datenblatt in einer Tabelle zusammengefasst.

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.