Att blanda in assembler är ingen bra idé i sådana fall. Just att skriva till portar är väldigt speciellt, jag sätter en slant på att TS använder en Mega2560 !
Och pin-numren omfattar då PORTB,PORTG, PORTL. Berorende på IO-addressen på portarna används olika instruktioner för IO-Access. Och två av portarna jag nämer är under 0x1F och den ena över 0x100.
Jag skriver allt i assembler till AVR och har nästan alltid gjort, det ger 100 ggr mer plats och är så snabbt som jag behöver kod att vara.
Och jag känner mig inte alls begränsad av assembler mot C/C++ som jag även använder till mer avancerade processorer som ARM mfl.
, jag bifogar två macros för setbit, clrbit på portar jag gjort vilket är en del av ett stort bibliotek av macros jag gjort under åren.
Mnemonicsen som används vid olika IO i portar är alltså sts/lds , out/in eller optimalt sbi/cbi. Med optimalt menar jag snabbaste (cykeltid).
Kanske lite överkurs, men bara så ni inser problemet. PORTA och PORTG har IO-Address under 0x01F och kan använda sbi/cbi medan den andra måste använda sts/lds.
Finns alltså även ett tredje alternativ. Detta är bara till för att optimera koden, man kan så klart alltid använda lds/sts med då måste 0x20 adderas på IO-Addresser under 0x40,
vilket man gör att man måste veta vilken port och vilken bit en "Aduino-Pinne" är, tex P49 - vilket är Port L bit 0 - vilken man måste använda lds/sts för att ändra IO.
Allt sådant finns i headerfiler såklart som kompilatorn använder, och det är inte omöjligt något gjort ett projekt för detta med flerrads-inline assembler till C koden.
Vilken inte är speciellt lätt att göra, men behövs bara göras en gång!
Edit : Förtydlingande Memory Mappade IO adresser > 0x40
Kod: Markera allt
.macro setbit
.if @0>0x3F
#if defined __save_temp__
push __temp__
#endif
lds __temp__, @0
ori __temp__, (1<<@1)
sts @0, __temp__
#if defined __save_temp__
pop __temp__
#endif
.endif
.if (@0<0x40) && (@0>0x1F)
#if defined __save_temp__
push __temp__
#endif
in __temp__, @0
ori __temp__, (1<<@1)
out @0, __temp__
#if defined __save_temp__
pop __temp__
#endif
.endif
.if @0<0x20
sbi @0, @1
.endif
.endm
.macro clrbit
.if @0>0x03F
#if defined __save_temp__
push __temp__
#endif
lds __temp__, @0
andi __temp__, ~(1<<@1)
sts @0, __temp__
#if defined __save_temp__
pop __temp__
#endif
.endif
.if (@0<0x40) && (@0>0x1F)
#if defined __save_temp__
push __temp__
#endif
in __temp__, @0
andi __temp__, ~(1<<@1)
out @0, __temp__
#if defined __save_temp__
pop __temp__
#endif
.endif
.if @0<0x020
cbi @0, @1
.endif
.endm