PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pulsein Libary ändern aber wie?



RubaSon
30.12.2010, 06:39
Hallo liebe Gemeinde,

Da mein Assembler-Kenntnisse sehr dürftig sind habe ich eine Frage zu Libary mit dem Pulsein-Befehl von Bascom:

Ich würde den Befehl in der Libary gerne so umprogramieren das Pulsein nicht alle 10µs den Zähler erhöht sonden viel schneller wenn möglich alle 3 bis 4µs.
Ist das möglich? Was muß ich hierzu ändern?

PicNick
30.12.2010, 11:11
tscha, ohne asm kenntnis kann das lustig werden.

however, das da generiert BASCOn bei "PULSEIN"
http://www.rn-wissen.de/index.php/Bascom_Inside-Code#PULSEIN
(etwas dokumentiert)
Und das ist was allgemeines über bascom libraries.
http://www.rn-wissen.de/index.php/Bascom_Libraries

Mach aber auf jeden fall eine Sicherung vom original.

Vielleicht kannst du einfach Bascom durch eine gfälschte $CRYSTAL Angabe beschummeln ?

TobiKa
30.12.2010, 12:22
Und wenn man sich selbst nen Timer in Bascom erstellt mit dem man dann zählen kann?

RubaSon
30.12.2010, 12:50
@PickNick: Das hab ich bereits gelesen, bringt mich aber nicht weiter...
Ich habe den Teil mit PULSE_IN aus der mcs.lib rauskopiert und ne neue Lib erstellt damit ich dran rumbasten kann. Die 10µs lassen sich problemlos erhöhen aber nicht verringern!?

@TobiKa:Kein freier Timer mehr verfügbar bzw nicht brauchbar

TobiKa
30.12.2010, 12:57
Vll über n zusätzliches Quarz an einem Interrupt Eingang den Takt erzeugen?

PicNick
30.12.2010, 16:25
Du musst versuchen, diese Stelle da zu finden:


PUSH ZL // Save
PUSH ZH
LDI ZL,0x20 // Dieser Wert wurde aus $CRYSTAL berechnet
LDI ZH,0x00
CALL verzögerungs-schleife // 10 µS Idle
POP ZH // Restore
POP ZL




verzögerungs-schleife:
SBIW ZL,0x0001
BRNE L_0x009C
RET

In dem Beispiel lädt bascom den Zähler mit "&H20" , also 32
Bei einem Quartz mit 8MHZ sollte das 10µS ergeben.

Würde man mit "&H10" (16) laden, wären das dann etwa 5 µS-Schritte

Du müstest also für deine Werte anpassen

RubaSon
30.12.2010, 17:28
mh meine Lib sieht ganz anders aus... ich finde keine schleife in meiner lib die einfach runtergezählt wird!?
In einer Zeile steht "@genus(9)" was soll das bedeuten?

@TobiKa: Am µC ist nichts mehr frei, hab sogar den Reset Pin gebraucht...

Dirk
30.12.2010, 20:52
@RubaSon:
Ich habe mal den wichtigen Teil rauskopiert:

_pulse_in5:
;@genus(9) ; THIS FOR 10 US UNITS but approx. depends on XTAL

; you can remove the above call and tailor this routine
; when remarked 10 cycles/ loop are needed and for 1 Mhz this is 10 uS
; for 4 MHz you need additional 30 cycles and the @genus can be used
; --------------------------------------------------------------------
; routine adapted for 4 MHz (30 cycl.):
Push r17 ; 2 cycl.
Ldi r17,$08 ; waiting 24 cycl.

_pulse_in6:
Dec r17
brne _pulse_in6
nop ; 2 cycl.
nop
Pop r17 ; 2 cycl.
; --------------------------------------------------------------------
; routine adapted for 8 MHz (70 cycl.):
;Push r17 ; 2 cycl.
;Ldi r17,$16 ; waiting 66 cycl.

;_pulse_in6:
;Dec r17
;brne _pulse_in6
;Pop r17 ; 2 cycl.
; --------------------------------------------------------------------
Ld r0,z ; 2 cycl. get pin state
And r0, r24 ; 1 cycl. get only the input pin state
Eor r0,r16 ; 1 cycl. xor with begin state returns zero if the same
Brne _pulse_in_exit ; 2 cycl. ready ,state changed
Adiw xl,1 ; 2 cycl. counter
brne _pulse_in5 ; 2 cycl. again

Die Warteschleife braucht selbst 10 Zyklen, darin muss man dann die Zeit totschlagen. Ich habe mal 2 Schleifen mit 30 bzw. 70 Zyklen für 4 MHz und 8MHz eingefügt. Du müßtest natürlich je nach deinem Quarz weniger Zyklen einfügen, wenn du nur 4µs haben willst.

Gruß Dirk

RubaSon
31.12.2010, 00:07
@all: danke für eure mühe!
Mein rumgebastel an der Lib hat die ganze zeit funktioniert, ich depp hab aber im Programm $crystal = 1200000 drin stehen gehabt dann gehts halt nicht schneller...
Naja wieder was gelernt.
Dachte anfangs mit Bascom hat man ruhe vom asm. aber wie es aus sieht doch nicht. Werd mich doch mal intensiever damit beschäftigen.

Danke nochmals und einen guten Rutsch wünsche ich!!!