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??
>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.
> 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.
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.
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
@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.
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
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
>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?
Hi @Michi 1. Hat er doch !!! 2. Welchen Beitrag hast du eigentlich geleistet????? MfG Spess
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 :-))
1 | sbis pind, 0 |
2 | cbi portc, 1 |
3 | sbic pind, 0 |
4 | sbi portc, 1 |
Sind nur 4 Worte und 5 Zyklen. Peter
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.