[AVR/ASM] hoe bitjes serieel uitklokken

Pagina: 1
Acties:
  • 180 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 15-09 18:04

TrailBlazer

Karnemelk FTW

Topicstarter
ik wil graag een shiftregister aan mijn tiny2313 hangen. Ik vraag me alleen af hoe ik netjes en zo efficient mogelijk in Assmebly een byte serieel kan uitklokken. Zelf dacht ik eraan om 9 keer een ROL te doen en na iedere rol het bitje hoog of laag te zetten aan de hand van de waarde in het C register. Dit klinkt enkel nogal omslachtig. Heeft iemand hier een voorbeeld van ik kan op internet niks vinden of niet zoeken. In ieder geval geen assembly voorbeeld.

http://instruct1.cit.corn...ee476/AtmelStuff/adc2.htm

hmm hier doen ze het ook zo enkel de commandos skipcs en skipcc kent mijn AVR niet maar lijken te zijn vervangen door BRCS en BRCC

hmm het zijn twee macro's
code:
1
2
3
4
5
6
7
8
9
10
11
12
 ;skip next instruction if carry set 

 .MACRO skipcs                    
     .SET    _skipcs = PC+2 
     brcs    _skipcs 
 .ENDMACRO 
  
 ;skip next instruction if carry clear 
 .MACRO skipcc 
     .SET    _skipcc = PC+2 
     brcc    _skipcc 
 .ENDMACRO


nu die macro's nog begrijpen

[ Voor 38% gewijzigd door TrailBlazer op 02-02-2007 10:51 ]


Acties:
  • 0 Henk 'm!

  • Ibex
  • Registratie: November 2002
  • Laatst online: 22:42

Ibex

^^ met stom.

Zo eventjes uit het hoofd, zonder te testen en met assembly voor de ATmega8535:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
LDI r16, 0b00110011 ; eventjes een waarde inladen :)

LDI r17, 0b10000000
AND r17, r16
OUT PORTA, r17 ;dan zal de "1" als ik me niet vergis op de eerste pin van PORTA plaatsen


LSL r16
LDI r17, 0b10000000
AND r17, r16
OUT PORTA, r17

LSL r16
LDI r17, 0b10000000
AND r17, r16
OUT PORTA, r17

; enzovoorts


Even kijken of dat korter kan, een ogenblikje :).

Ik denk dat dit korter is:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LDI r16, 0b00110011 ; eventjes een waarde inladen :)

RJMP SHIFTOUT
RJMP SHIFTOUT
RJMP SHIFTOUT
RJMP SHIFTOUT
RJMP SHIFTOUT
RJMP SHIFTOUT
RJMP SHIFTOUT

SHIFTOUT:
  LDI r17, 0b10000000
  AND r17, r16
  OUT PORTA, r17
  LSL r16
RET

[ Voor 42% gewijzigd door Ibex op 02-02-2007 11:13 ]

Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be


Acties:
  • 0 Henk 'm!

  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 15-09 18:04

TrailBlazer

Karnemelk FTW

Topicstarter
heb je dan niet het probleem dat alle poortjes gezet worden. Ik wil er slechts een wijzigen met sbi of cbi

Acties:
  • 0 Henk 'm!

  • Ibex
  • Registratie: November 2002
  • Laatst online: 22:42

Ibex

^^ met stom.

Hmmm, inderdaad :/.

Ik zit nu op mijn werk, maar ik zal deze middag/avond nog even proberen kijken naar een eventuele oplossing :).

Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be


Acties:
  • 0 Henk 'm!

  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 15-09 18:04

TrailBlazer

Karnemelk FTW

Topicstarter
De code uit de link lijkt inderdaad te doen wat ik had bedacht alleen wat netter
code:
1
2
3
4
5
6
7
8
9
10
11
    ldi    Main2,8  ;the bit counter 
  
 ADC_SENDCOMMAND: 
     rol    Main1            ;shift out the 8-bit command 
     skipcc 
     sbi    portD,ADCDin     ;set the bit in Din 
     skipcs 
     cbi    portD, ADCDin    ;clear the bit in Din 
     ADC_CLOCKPULSE          ;clock the value in 
     dec     Main2 
     brne    ADC_SENDCOMMAND

Acties:
  • 0 Henk 'm!

  • Ibex
  • Registratie: November 2002
  • Laatst online: 22:42

Ibex

^^ met stom.

Ik denk dat dit inderdaad de meest nette oplossing is :).

Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be


Acties:
  • 0 Henk 'm!

  • Sprite_tm
  • Registratie: September 2002
  • Laatst online: 11-08 04:52

Sprite_tm

Semi-Chinees

In principe kan je het skipcc zelfs weglaten: als nodig word de sbi toch weer ongedaan gemaakt door de cbi die erna komt. Verder is dit minder cycles als ik het me goed herinner: (rcalls zijn relatief duur):
code:
1
2
3
4
5
6
7
8
9
10
11
 ldi temp2,8
 ldi temp,dewaarde
loop:
 cbi portd,adc_dat
 sbrc temp,7
  sbi portd,adc_dat
 sbi portd,adc_clk
 rol temp
 cbi portd,adc_clk
 dec temp2
 brne loop

[ Voor 7% gewijzigd door Sprite_tm op 02-02-2007 14:37 ]

Relaxen und watchen das blinkenlichten. | Laatste project: Ikea Frekvens oog


Acties:
  • 0 Henk 'm!

  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 15-09 18:04

TrailBlazer

Karnemelk FTW

Topicstarter
daar zat ik ook al aan te denken. Ik vond het alleen zo slordig om het signaal even "fout" te laten zijn. Overigens is een sbrc kan 3 cycles zijn en een brcs max 2. Dus triggeren op de Carry die toch gevuld wordt door de rol is mischien net ff sneller. Ik heb nog niet uitgezocht hoeveel cycles het is in dit geval zijn

Acties:
  • 0 Henk 'm!

  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 15-09 18:04

TrailBlazer

Karnemelk FTW

Topicstarter
Overigens zo heb ik het uiteindelijk gebouwd. vo een 74hc595
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
;uit te klokken data
ldi data, 3

LOOP:
ldi temp,8
SEROUT:
cbi PORTB,sh_data
sbrc data,7
sbi PORTB,sh_data
sbi PORTb,sh_clock
rol data
cbi PORTB,sh_clock
dec temp
brne SEROUT
sbi PORTB,sh_latch
cbi PORTB,sh_latch
rol data
;ldi temp,2
;rcall longDelay

rjmp LOOP

mischien heeft iemand ere wat aan
Pagina: 1