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
Habs gefunden. asm("sts 0x81,0x0"); asm("nop"); asm("nop"); asm("sts 0x81,0x1");
Hadmut F. schrieb: > Habs gefunden. da kann dir aber immer noch ein Interrupt reinfunken! Es fehlt also ein cli und sei
:
Bearbeitet durch User
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
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()"
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"); |
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.
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
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
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!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.