~Page http://www.piclist.com/techref/io/ibutton.htm Modified by:JMN-EFP-786 replace-to:
Dr. Imre Bartfai says:
[this is my] iButton reader routine, especially for [PIC type] processors having only 2-level stack. The dialect is the Parallax Assembler one. 4MHz clock is assumed. When routine returns with zero, the iBData structure is filled with the appropriate data. The routine seems to be pretty robust. Please note, that the copyright is retained for me, even if the use [of] the routine is free.
;---------------------------------------------------
; This code fragment handles the Dallas iButton(TM)
;---------------------------------------------------
;
;Line must be equated as a bit also: LPort.LBit
LFloat = IOCfg ; line bit as input
LOut = 1 << LBit ^ LFloat ; all bits input but LBit
iButOrg = $
Org iBData
Cnt DS 1 ; counter
TCnt DS 1 ; delay counter
SSave DS 1 ; STATUS save cell
FamCod DS 1 ; Family code \
SerNo DS 6 ; serial number } do not separate!
CRC DS 1 ; CRC value /
Cmd DS 1 ; command/data cell
Acc DS 1 ; virtual accumulator
CSave EQU SSave.0
iBEnd EQU $
Org iButOrg
iButton Call _Init ; reset prom
Or W,#0 ; check for zero
SZ ; skip if good
RetW 1 ; otherwise return
Mov W,#0Fh ; Read ROM command
_SndCmd Mov Cmd,W ; store command
Mov Cnt,#8 ; # of bits
:loop Rr Cmd ; LSB first
_SendC Mov SSave,STATUS ; send Cy
Mov !LPort,#LOut ; turn line to output
ClrB Line ; low pulse
Jmp $+1 ; tlow1
Jmp $+1
Jmp $+1 ; tlow1
Jmp $+1
JNB CSave,:Slot ; if zero, do not float
Mov !LPort,#LFloat
:Slot Mov Acc,#20 ; for 1 usec / instruction!
:loopi Nop ; loopi makes 80 usec
DJNZ Acc,:loopi ; sampling window
JB CSave,:cont ; continue if 1
Mov !LPort,#LFloat
:cont DJNZ Cnt,_SndCmd:loop
Call _GetByt ; receive byte
Mov FamCod,Cmd ; save family code
Mov Cnt,#6 ; length of serial number
Mov FSR,#SerNo ; serial number address
:loop1 Call _GetByt ; Receive SerNo
Mov INDF,Cmd ; received value
Inc FSR
DJNZ Cnt,:loop1
Call _GetByt ; receive CRC
; ----
; From here compare received CRC in Cmd with that to be calculated
; upon FamCod & SerNo
;
CRCChk
Mov FSR,#FamCod ; start:
Mov Cnt,#7 ; length
Clr CRC ; clear initial CRC
:loop2 Mov W,INDF ; fetch the byte
Mov SSave,W ; save bits to be shifted
Mov TCnt,#8 ; set shift=8bits
Mov W,SSave ;; restore result
:loop XOr W,CRC ; calculate CRC
Mov Acc,W ;; last CRC value
Rr Acc ; move it to carry
JNC :Zero ; skip if data=0
XOr CRC,#18h ; update the CRC value
:Zero Rr CRC ; position the new CRC
Rr SSave ; position the next bit
Mov W,SSave ; use the remaining bits
DJNZ TCnt,:loop
Inc FSR ; next pointer
DJNZ Cnt,:loop2
;------ now xchg CRC & Cmd
Mov W,CRC
XOr W,Cmd ; here exchange Cmd with W
XOr Cmd,W
XOr W,Cmd
Mov CRC,W
;------
Clr Wdt
CSE CRC,Cmd ; received==calculated
RetW 2
RetW 0 ; good
;---------------------------------------------------
_Init Mov !LPort,#LOut ; turn port to output
ClrB Line ; master reset
Mov TCnt,#125 ; about 500 usec
:loopi NOp ; loopi makes about 500 usec
DJNZ TCnt,:loopi
Mov !LPort,#LFloat
Mov Acc,#7 ; for 1 usec / instruction!
:looph NOp ; looph makes 30 usec for Tpdh
DJNZ Acc,:looph
Clr Cnt ; clear counter
:pres Mov Acc,#3 ; for 1 usec / instruction!
NOp
:loop NOp
DJNZ Acc,:loop ; 15 usec waiting
JB Line,:eoi ; if high again, end of init
Inc Cnt ; count length of presence pulse
CJAE Cnt,#20,:bad ; too long: shortcut
Clr Wdt
Jmp :pres
:eoi CJB Cnt,#1,:bad
RetW 0 ; iButton found
:bad RetW 1 ; iButton not found
;---------------------------------------------------
_GetByt Mov Cmd,#128 ; hibit as exit condition
:loop Mov !LPort,#LOut
ClrB Line ; low pulse
Jmp $+1 ; short pulse (8 usec)
Jmp $+1
Jmp $+1
Jmp $+1
Mov !LPort,#LFloat
Jmp $+1 ; tRDV = 15 ęsec
Jmp $+1
Jmp $+1
Jmp $+1
Jmp $+1
Jmp $+1
Jmp $+1
MovB C,Line ; line state
Rr Cmd ; put received bit
Mov SSave,Status ; save status register
Mov Acc,#14 ; for 1 usec / instruction!
:loopi NOp
DJNZ Acc,:loopi ; 60 usec waiting
JNB CSave,:loop ; hibit not reached yet?
Ret
See also:
http://www.piclist.com/techref/io/magcard.htm Modified by:JMN-EFP-786 replace-to:
Books:
See also
http://www.piclist.com/techref/io/steppers.htm Modified by:JMN-EFP-786 jamesnewton@efplus.com preview-to: http://www.cs.uiowa.edu/~jones/step/index.html http://www.cs.uiowa.edu/~jones/step/index.html http://204.210.50.240/techref/io/musics.htm Modified by:JMN-EFP-786 replace-to:
C. Wayne Buhrman says:
Middle C 261.63 Hz
D 293.66 Hz
E 329.63 Hz
F 349.23 Hz
G 391.99 Hz
A 440.00 Hz
B 493.88 Hz
C 523.25 Hz
Harley L. Miller hmiller@sound.net says:
The theorem underlying the modern scale was set forth by Pythagoras, a Greek philosopher/mathemetician in the 6th century B.C. He discovered that the major consonances (sounds that harmonize well) were the octave, perfect fifth and perfect fourth. Perfect fourth and fifth being the notes four and five up from the fundamental. The length of the strings relate to the fundamental in the ratios of 1:2 (octave), 3:2 (fifth) and 4:3 (fourth).The perfect scale was found to not be workable when used in a number of different keys, and J.S. Bach demonstrated the versatility of the equal-tempered scale when he wrote 'The Well-Tempered Clavier', a series of pieces written in a succession of keys.
Dave Johnson says:
The current scale is the equal tempered scale (which just means that the intervals between all adjacent notes are equal). Originally the notes were based on the "ideal" frequencies exhibited by vibrating strings or columns of air - it came from physics - but the modern scale has been shifted around slightly to even up the intervals. In fact, it was during Bach's time that the changeover occurred: Bach was one of the main proponents of using equal temperament, but many people at the time thought it was an abomination. In fact, Bach wrote the Well-Tempered Clavier in part to demonstrate how useful equal temperament could be: you can play a piece in any key on the same instrument without re-tuning. In "true" temperament, instruments had to be tuned to a particular key, so you coouldn't, for instance, change keys in the middle of a piece.
Bob McClure says
Ideally, the ratio between the frequency of two adjacent notes should be 2**-12 (twelth root of 2). The problem is that there is an ever so slight difference between 2**-12 (going up) and 1/2**-12 (going down). Equal tempering splits the difference. It takes a very good ear to hear the difference in most music.
Darrel Johansen says:
For an excellent book on this topic see "On the Sensations of Tone" by Herman Helmoholtz. Equal temperament is possible on the piano, and is exactly reproducible on a keyboard synthesizer, but most piano tuners "fine tune" the equal temperament and end up with something a little in-between, especially for the higher notes on the piano. When playing a wind instrument or singing, without piano accompaniment, often the tuning will vary from equal temperament because the harmonies will be much more satisfying (again, see Helmholtz).Other temperaments are heard not just in avant garde music, but in other cultures including native American. Middle-Eastern music divides the tones up even more divisions. That allows closer harmonies to the "ideal" physically derived ratios than equal temperament, as well as providing nuances that are not notated (which doesn't mean they aren't used, consciously or not) in Western music.
Harold Hallikainen harold@hallikainen.com says:
Herman Von Helmholtz published what we know as Thevenin's Theorem in 1853, while Thevenin did not publish it until 1883.
See also:
On the Sensations of Tone by Herman
Helmoholtz
vijays69@yahoo.com says:
Could anyone please help me locate the may & april 1991 issues of elektor electronics (U.K)- I am on the lookout for the article on Audio amplifier. If you can e-mail me the article I would be very grateful and thankful- or give me the link where I can find the article?
ON 20010226@7:56:50 PM http://204.210.50.240/techref/io/pid.htm Modified by:JMN-EFP-786 jamesnewton@efplus.com to See also:http://www.hugoordonez.com/pid.html