Forum: Mikrocontroller und Digitale Elektronik AVR-Assembler Soft-SPI


von Thomas P. (topla)


Lesenswert?

Hallo,
aus der 51er-Welt habe ich bei Soft-SPI immer mit Hilfe des Befehls MOV 
C,Px.x gearbeitet.
Sieht also so aus:
1
g16b4:
2
  RLC A    ; zuerst MSB
3
  MOV P1.1,C  ; Ausgabedaten bereitstellen
4
  CLR P1.0  ; Takt auf Low
5
  SETB P1.0  ; Takt auf High, schieben
6
  DJNZ R3,g16b4

Jetzt suche ich eine performante Möglichkeit der Umsetzung in AVRASM, 
stehe voll auf dem Schlauch und brauch einen Blindenhund.
Die Variante:
1
  ldi   temp2, 8  
2
spi_out2:
3
  rol   temp1
4
  sbi   spi_port, spi_data  
5
  brcs  spi_out4
6
  cbi   spi_port, spi_data  
7
spi_out4:
8
  sbi   spi_port, spi_clk
9
  cbi   spi_port, spi_clk  
10
  dec   temp2        
11
  brne  spi_out2
ist doch wohl noch etwas ungeschickt und langsam und muss doch eleganter 
zu lösen sein. Speziell stört mich auch das Gewackel auf spi_data bei 
0-Bits, da ich dort auf Grund einer Fehlersuche mit dem LA dran bin.
Kann mir da bitte mal jemand weiterhelfen?

Gruß
Thomas

von Peter D. (peda)


Lesenswert?

Thomas P. schrieb:
> ist doch wohl noch etwas ungeschickt und langsam und muss doch eleganter
> zu lösen sein.

Das ist schon die optimalste Variante.
Bit-MOV hat der AVR nicht.

Thomas P. schrieb:
> Speziell stört mich auch das Gewackel auf spi_data bei
> 0-Bits

Dann brauchst Du noch ein RJMP.


Peter

von spess53 (Gast)


Lesenswert?

Hi

>Thomas P. schrieb:
>> Speziell stört mich auch das Gewackel auf spi_data bei
>> 0-Bits

>Dann brauchst Du noch ein RJMP.

oder ein zusätzliches Register:
1
                      ; Datenbyte in r18
2
                      ldi r16,8
3
                      in r17,spi_port
4
5
out_spi10:            bst r18,7
6
                      bld r17,spi_data 
7
                      cbr r17,1<<spi_clk
8
                      out spi_port,r17
9
                      sbr r17,1<<spi_clk
10
                      lsl r18
11
                      out spi_port,r17
12
                      dec r16
13
                      brne out_spi10

Aber kürzer wird es auch nicht.

MfG Spess

von Michael U. (amiga)


Lesenswert?

Hallo,
1
  ldi   temp2, 8  
2
3
 spi_out2:
4
  sbrs  temp1,7
5
  cbi   spi_port,spi_data
6
  sbrc  temp1,7
7
  sbi   spi_port,spi_data
8
9
  rol   temp1
10
11
spi_out4:
12
  sbi   spi_port, spi_clk
13
  cbi   spi_port, spi_clk  
14
  dec   temp2        
15
  brne  spi_out2

Gruß aus Berlin
Michael

von Thomas P. (topla)


Lesenswert?

Peter Dannegger schrieb:
> Thomas P. schrieb:
>> Speziell stört mich auch das Gewackel auf spi_data bei
>> 0-Bits
>
> Dann brauchst Du noch ein RJMP.

Danke für die Unterstützung, bin ich doch nicht ganz so doof wie 
angenommen.
Ja, das Wackeln ist dann weg, aber zeitlich wird das ja noch länger.
So schön die AVRs auf manchen Gebieten (Timer) auch sind, ich sehne mich 
immer öfter zu den 51ern zurück. Von der Benutzbarkeit der Register 
angefangen bis hin zum Befehlssatz.

Thomas

von Thomas P. (topla)


Lesenswert?

spess53 schrieb:
> Aber kürzer wird es auch nicht.

Scheint also nicht schneller zu gehen, das war das Ziel.

Dankeschön.

Gruß
Thomas

von spess53 (Gast)


Lesenswert?

Hi

>Scheint also nicht schneller zu gehen, das war das Ziel.

Nein. Nur die Laufzeit ist bei H und L konstant. Acht Befehle für die 
Schleife durfte das Minimum sein. Andererseits sind das etwa 800 kHz 
SPI-Takt bei 8 MHz Controllertakt. Für viele Anwendungen ausreichend.

MfG Spess

von Peter D. (peda)


Lesenswert?

Thomas P. schrieb:
> Ja, das Wackeln ist dann weg, aber zeitlich wird das ja noch länger.
> So schön die AVRs auf manchen Gebieten (Timer) auch sind, ich sehne mich
> immer öfter zu den 51ern zurück.

Naja, RICS-CPUs sollte man doch besser in C programmieren.

Ich hab auch lange Zeit den AT89C2051/4051 benutzt.
Aber ich bin faul, wenn ich am Layout sparen kann. Und extra Quarz und 
Reset ranzupappen spart man beim AVR.

Wenn die Atmel 8051-Sektion auch 8-, 14-, 20-, 28-Pinner mit haufenweise 
interner Peripherie rausgebracht hätte, würde ich 8051 vorziehen.


Peter

von spess53 (Gast)


Lesenswert?

Hi

>Naja, RICS-CPUs sollte man doch besser in C programmieren.

Damit wird so etwas wie hier schneller?

Mfg Spess

von Pieter (Gast)


Lesenswert?

moin moin,

Frage, der AVR braucht 10 Takte pro Bit ?

Wirds schneller, wenn es keine Schleife gibt?
Also mehr Code dafür schneller?

Mit Gruß
Peter

von Thomas P. (topla)


Lesenswert?

Peter Dannegger schrieb:
> Thomas P. schrieb:
>> Ja, das Wackeln ist dann weg, aber zeitlich wird das ja noch länger.
>> So schön die AVRs auf manchen Gebieten (Timer) auch sind, ich sehne mich
>> immer öfter zu den 51ern zurück.
>
> Naja, RICS-CPUs sollte man doch besser in C programmieren.

Da bin ich zu doof zu. Den Anlauf habe ich schon genommen, aber wenn ich 
bei Problemen dann immer den Ratschlag bekomme im Assemblerlisting 
nachzusehen, dann kann ich auch gleich in Assembler programmieren.

> Ich hab auch lange Zeit den AT89C2051/4051 benutzt.
> Aber ich bin faul, wenn ich am Layout sparen kann. Und extra Quarz und
> Reset ranzupappen spart man beim AVR.

Faul bin ich auch, aber die beiden Punkte sind schnell erledigt und wenn 
man mit AVRs und deren seriellen Schnittstelle hantiert, braucht man den 
Quarz sowieso.
Mich nervt so langsam wirklich der grottige Befehlssatz der AVRs und die 
eingeschränkte Verwendbarkeit der Register.

> Wenn die Atmel 8051-Sektion auch 8-, 14-, 20-, 28-Pinner mit haufenweise
> interner Peripherie rausgebracht hätte, würde ich 8051 vorziehen.

Leider werden wir da nicht erhört....

Thomas

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.