Forum: Mikrocontroller und Digitale Elektronik kanns Assembler schneller als Bascom!?


von Sebastian (Gast)


Lesenswert?

Hi. vorab: ich habe KEINE AHNUNG von ASM

ich habe einen AVR, auf dem läuft unter bestimmten vorraussetzungen 
folgender code:

if pind.2=0 then
portc.1=0
else
portc.1=1
endif        16-17 takte

habe auch schon

portc.1=pind.2 ca 12 takte

versucht. Leider ist der code einen tick zu langsam.
Geht es in assembler schneller??


von Benedikt K. (benedikt)


Lesenswert?

Sebastian wrote:
> Geht es in assembler schneller??

Ja !

von Michi (Gast)


Lesenswert?

>Hi. vorab: ich habe KEINE AHNUNG von ASM

Von Bascom wohl auch nicht?

>Geht es in assembler schneller??

Minimal. 3 Takte bei erfülltem Vergleich (mit Jump), 2 Takte sonst. Mit 
C erhältst du in diesem Fall die gleiche Geschwindigkeit wie mit 
Assembler.

von Karl H. (kbuchegg)


Lesenswert?

> portc.1=pind.2 ca 12 takte

Was muss gemacht werden?

   in   rxx, PIND
   and  rxx, $04
   lsr  rxx
   in   rxy, PINC
   or   rxy, rxx
   out  PORTC, rxy

macht zusammen 6 Takte.
Wenn jetzt allerdings die Register nicht frei sind und auch
noch gesichert / wiederhergestellt werden müssen, wirds
schon eng.


von johnny.m (Gast)


Lesenswert?

Karl heinz Buchegger wrote:
>  and  rxx, $04
müsste eher "andi" sein, gell?

> in   rxy, PINC
Da würde ich eher PORTC nehmen. Und PORTC.1 muss noch Null gesetzt 
werden vor dem or.

Ich komm deshalb auf minimal 7 Takte:
1
in r16, pind    ;PIND einlesen
2
in r17, portc   ;PORTC einlesen
3
lsr r16         ;Zustand von PIND um eine Stelle nach rechts (Bit 2 auf Pos. 1 schieben)
4
andi r16, 0x02  ;Bit 1 maskieren, alle anderen löschen
5
andi r17, 0xfd  ;Bit 1 in PORTC-Zustand löschen
6
or r17, r16     ;Zustand von PIND.2 an Pos. 1 von PORTC
7
out portc, r17  ;PORTC schreiben
Registernummern nach Verfügbarkeit, aber auf jeden Fall > r16 wg. 
immediate-Operationen.

von spess53 (Gast)


Lesenswert?

Hi


    in r16,PinD      ; Port einlesen
    bst r16,2        ; Bit nach T-Flag
    in r16,PinC      ; Port einlesen
    bld r16,4        ; Bit setzen
    out PortC,r16    ; Port ausgeben

   5 Takte

MfG Spess

von Sebastian (Gast)


Lesenswert?

@michi
>Von Bascom wohl auch nicht?

WIESO? ich benötige an einer bestimmten stelle einfach einen schnellen 
pass-through

Kannst du uns zeigen, wie du das mit 3/2 takten machst??

Danke für die anderen antworten.

von Sebastian (Gast)


Lesenswert?

werde das programm mal im simulator laufen lassen und sehen, welche 
register noch frei sind. diese stelle im code ist sowieso sagen wir die 
ENDSTATION. wenn bestimmt bedingungen nicht erfüllt sind, wird halt 
durchgeschalten

von Sebastian (Gast)


Lesenswert?

also würde es in meinem fall so aussehen
1
in r16,PinD      ; Port einlesen
2
in r17,PinC      ; Port einlesen
3
4
bst r16,2        ; Bit nach T-Flag
5
bld r17,1        ; Bit setzen
6
7
bst r16,6        ; Bit nach T-Flag
8
bld r17,0        ; Bit setzen
9
Out Portc , R17 ; Port Ausgeben

dann wird pind2 -> portc.1
          pind6 -> portc.0

ausgegeben, und ich habe nur ca 8 takte für die ganze aktion +4 für die 
schleife



von Michi (Gast)


Lesenswert?

>also würde es in meinem fall so aussehen

Nach dem Motto warum einfach, wenns auch umständlich geht?
Warum befolgst du nicht unsere Tips, wenn du schon sagst, daß du keine 
Ahnung von Assembler hast? Oder meintest du mit ASM was anderes als 
Assembler?

von spess53 (Gast)


Lesenswert?

Hi

@Michi

1. Hat er doch !!!
2. Welchen Beitrag hast du eigentlich geleistet?????

MfG Spess

von Sebastian (Gast)


Lesenswert?

ja würde mich auch mal interessieren.

Es ist wirklich witzig, wie wenig bascom eigentlich mit den registern 
arbeitet. aber warscheinlich macht es wirklich mehr sinn generell alle 
variablen im sram abzulegen

bin mal gespannt ob der code jetzt schnell genug ist? ich kanns erst 
nachher versuchen.  falls nicht, müssen wohl zwei transistoren die daten 
durchgeben :-))

von Peter D. (peda)


Lesenswert?

1
sbis    pind, 0
2
cbi     portc, 1
3
sbic    pind, 0
4
sbi     portc, 1

Sind nur 4 Worte und 5 Zyklen.


Peter

von Otto (Gast)


Lesenswert?

Hallo,

>Leider ist der code einen tick zu langsam.

die Frage ist auch, welcher Code ansonsten
noch durchlaufen wird - evtl. liegt es daran,
daß nicht diese paar Takte sondern die 500,
die der Controller sonst noch bearbeitet
das Problem sind....

Gruß Otto

von Sebastian (Gast)


Lesenswert?

Nein. Dieser code wird komplett in einer schleife gefahren. Nichts 
anderes. Im prinzip wandelt mein mega32 daten in ein anderes (neueres) 
format um. Wenn bemerkt wird, dass die daten im alten format kommen (das 
protokoll ist das gleiche, aber die daten nur ca 10% soviel) dann 
wechsel ich auf durchgang bis zum nächsten reboot

@peter: du hast recht. mit einem pin wäre das kürzer für 2 pinne funzt 
das andere kürzer (wenn der sim von bascom nicht mit dem asm überfordert 
ist :-)))

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.