Arduino AVR inline ASM. Wie TCCR1B schreiben?

#7673664
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?

#7673690
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
    }
Angehängte Dateien:
#7675396
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.

Angehängte Dateien:
Beitrag #7675407 wurde von einem Moderator gelöscht.
Persönliche Seite #7675511
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.

#7676524
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren