works as long as AppleShare is disabled...boot into BASIC, then set normal speed (1.0 MHz) & hit Ctrl-Reset before running executable
git-svn-id: https://svn.salfter.gotdns.org/svn/a2bfc/trunk@82 1b90f75b-8b96-4784-87c0-14078182fce6
This commit is contained in:
60
1wire.s
60
1wire.s
@@ -1,60 +0,0 @@
|
|||||||
; system-independent 1-Wire routines
|
|
||||||
|
|
||||||
.export _1wire_writebit
|
|
||||||
.export _1wire_writebyte
|
|
||||||
.export _1wire_readbit
|
|
||||||
.export _1wire_readbyte
|
|
||||||
.export _1wire_reset
|
|
||||||
|
|
||||||
; provided by system-specific routines at link time
|
|
||||||
|
|
||||||
.import _1wire_send1_impl
|
|
||||||
.import _1wire_send0_impl
|
|
||||||
.import _1wire_read_impl
|
|
||||||
.import _1wire_reset_impl
|
|
||||||
|
|
||||||
; some system-specific routines can be passed through
|
|
||||||
|
|
||||||
_1wire_send1 := _1wire_send1_impl
|
|
||||||
_1wire_send0 := _1wire_send0_impl
|
|
||||||
_1wire_reset := _1wire_reset_impl
|
|
||||||
|
|
||||||
; read a bit from the 1-Wire bus
|
|
||||||
|
|
||||||
_1wire_readbit:
|
|
||||||
jsr _1wire_read_impl
|
|
||||||
ldx #0
|
|
||||||
rts
|
|
||||||
|
|
||||||
; write a bit to the 1-Wire bus
|
|
||||||
|
|
||||||
_1wire_writebit:
|
|
||||||
ror ;shift out of LSB
|
|
||||||
bcs :+
|
|
||||||
jmp _1wire_send0
|
|
||||||
: jmp _1wire_send1
|
|
||||||
|
|
||||||
; write a byte to the 1-Wire bus
|
|
||||||
|
|
||||||
_1wire_writebyte:
|
|
||||||
ldx #8
|
|
||||||
: pha ;LSB is written first
|
|
||||||
jsr _1wire_writebit
|
|
||||||
pla
|
|
||||||
ror ;shift bit just sent out
|
|
||||||
dex
|
|
||||||
bne :-
|
|
||||||
rts
|
|
||||||
|
|
||||||
; read a byte from the 1-Wire bus
|
|
||||||
|
|
||||||
_1wire_readbyte:
|
|
||||||
ldx #8
|
|
||||||
: pha
|
|
||||||
jsr _1wire_read_impl
|
|
||||||
ror
|
|
||||||
pla
|
|
||||||
ror
|
|
||||||
dex
|
|
||||||
bne :-
|
|
||||||
rts
|
|
||||||
BIN
DS18B20.pdf
Normal file
BIN
DS18B20.pdf
Normal file
Binary file not shown.
37
apple2.cfg
Normal file
37
apple2.cfg
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
FEATURES {
|
||||||
|
STARTADDRESS: default = $0800;
|
||||||
|
}
|
||||||
|
MEMORY {
|
||||||
|
ZP: start = $0080, size = $001A, define = yes;
|
||||||
|
HEADER: start = $0000, size = $0004, file = "";
|
||||||
|
RAM: start = %S, size = $9600 - %S, file = %O;
|
||||||
|
}
|
||||||
|
SEGMENTS {
|
||||||
|
EXEHDR: load = HEADER, type = ro;
|
||||||
|
STARTUP: load = RAM, type = ro, define = yes;
|
||||||
|
LOWCODE: load = RAM, type = ro, optional = yes;
|
||||||
|
INIT: load = RAM, type = ro, define = yes, optional = yes;
|
||||||
|
CODE: load = RAM, type = ro;
|
||||||
|
RODATA: load = RAM, type = ro;
|
||||||
|
DATA: load = RAM, type = rw;
|
||||||
|
BSS: load = RAM, type = bss, define = yes;
|
||||||
|
HEAP: load = RAM, type = bss, optional = yes; # must sit just below stack
|
||||||
|
ZEROPAGE: load = ZP, type = zp;
|
||||||
|
}
|
||||||
|
FEATURES {
|
||||||
|
CONDES: segment = INIT,
|
||||||
|
type = constructor,
|
||||||
|
label = __CONSTRUCTOR_TABLE__,
|
||||||
|
count = __CONSTRUCTOR_COUNT__;
|
||||||
|
CONDES: segment = RODATA,
|
||||||
|
type = destructor,
|
||||||
|
label = __DESTRUCTOR_TABLE__,
|
||||||
|
count = __DESTRUCTOR_COUNT__;
|
||||||
|
CONDES: type = interruptor,
|
||||||
|
segment = RODATA,
|
||||||
|
label = __INTERRUPTOR_TABLE__,
|
||||||
|
count = __INTERRUPTOR_COUNT__;
|
||||||
|
}
|
||||||
|
SYMBOLS {
|
||||||
|
__STACKSIZE__ = $800; # 2K stack
|
||||||
|
}
|
||||||
28
main.c
Normal file
28
main.c
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <conio.h>
|
||||||
|
#include "ow.h"
|
||||||
|
#include "ow-temp.h"
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
{
|
||||||
|
unsigned char devid[8]={40,12,203,62,0,0,0,108};
|
||||||
|
|
||||||
|
// activate temperature sensor
|
||||||
|
if (ow_reset())
|
||||||
|
{
|
||||||
|
printf("Error: 1-Wire bus disconnected\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
printf("%i deg F\n", ow_temp_read(devid, OW_TEMP_FAHRENHEIT));
|
||||||
|
}
|
||||||
|
while (!kbhit());
|
||||||
|
}
|
||||||
|
while (cgetc()!=3);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -1,21 +1,22 @@
|
|||||||
; Apple II-specific 1-Wire routines
|
; Apple II-specific 1-Wire routines
|
||||||
|
|
||||||
.export _1wire_send1_impl
|
.export _ow_send1_impl
|
||||||
.export _1wire_send0_impl
|
.export _ow_send0_impl
|
||||||
.export _1wire_read_impl
|
.export _ow_read_impl
|
||||||
.export _1wire_reset_impl
|
.export _ow_reset_impl
|
||||||
|
.export _ow_wait_impl
|
||||||
|
|
||||||
; timing loops assume standard ~1 MHz speed for unaccelerated
|
; timing loops assume standard ~1 MHz speed for unaccelerated
|
||||||
; 8-bit Apple IIs
|
; 8-bit Apple IIs
|
||||||
|
|
||||||
AN0 := $C059
|
AN0 := $C058
|
||||||
PB2 := $C063
|
PB2 := $C063
|
||||||
|
|
||||||
.code
|
.code
|
||||||
|
|
||||||
; send a 1 bit to the 1-Wire bus
|
; send a 1 bit to the 1-Wire bus
|
||||||
|
|
||||||
_1wire_send1_impl:
|
_ow_send1_impl:
|
||||||
lda AN0+1 ;pull bus low for 6 us
|
lda AN0+1 ;pull bus low for 6 us
|
||||||
nop ;2 us to execute
|
nop ;2 us to execute
|
||||||
lda AN0 ;+4 us to execute=6 us
|
lda AN0 ;+4 us to execute=6 us
|
||||||
@@ -27,7 +28,7 @@ _1wire_send1_impl:
|
|||||||
|
|
||||||
; send a 0 bit to the 1-Wire bus
|
; send a 0 bit to the 1-Wire bus
|
||||||
|
|
||||||
_1wire_send0_impl:
|
_ow_send0_impl:
|
||||||
lda AN0+1 ;pull bus low for 60 us
|
lda AN0+1 ;pull bus low for 60 us
|
||||||
ldy #13 ;2 us
|
ldy #13 ;2 us
|
||||||
: dey ;2 us
|
: dey ;2 us
|
||||||
@@ -41,7 +42,7 @@ _1wire_send0_impl:
|
|||||||
|
|
||||||
; read a bit from the bus
|
; read a bit from the bus
|
||||||
|
|
||||||
_1wire_read_impl:
|
_ow_read_impl:
|
||||||
lda AN0+1 ;pull bus low for 6 us
|
lda AN0+1 ;pull bus low for 6 us
|
||||||
nop ;2 us
|
nop ;2 us
|
||||||
lda AN0 ;+4 us=6 us
|
lda AN0 ;+4 us=6 us
|
||||||
@@ -58,13 +59,11 @@ _1wire_read_impl:
|
|||||||
: dey
|
: dey
|
||||||
bne :-
|
bne :-
|
||||||
nop ;2+11*4+2=48 us
|
nop ;2+11*4+2=48 us
|
||||||
lda #0 ;put result in register
|
rts ;leave result in carry
|
||||||
adc #0
|
|
||||||
rts
|
|
||||||
|
|
||||||
; reset 1-Wire bus; return 0 if devices are present, 1 if not
|
; reset 1-Wire bus; return 0 if devices are present, 1 if not
|
||||||
|
|
||||||
_1wire_reset_impl:
|
_ow_reset_impl:
|
||||||
lda AN0+1 ;pull bus low for 480 us
|
lda AN0+1 ;pull bus low for 480 us
|
||||||
ldy #47 ;2 us
|
ldy #47 ;2 us
|
||||||
: nop ;2 us
|
: nop ;2 us
|
||||||
@@ -93,7 +92,11 @@ _1wire_reset_impl:
|
|||||||
nop
|
nop
|
||||||
dey
|
dey
|
||||||
bne :-
|
bne :-
|
||||||
lda #0 ;put result in register
|
rts
|
||||||
tax
|
|
||||||
adc #0
|
; wait for an active device to let go of the bus
|
||||||
|
|
||||||
|
_ow_wait_impl:
|
||||||
|
: bit PB2
|
||||||
|
bpl :-
|
||||||
rts
|
rts
|
||||||
81
ow-common.s
Normal file
81
ow-common.s
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
; system-independent 1-Wire routines
|
||||||
|
|
||||||
|
.export _ow_writebit
|
||||||
|
.export _ow_writebyte
|
||||||
|
.export _ow_readbit
|
||||||
|
.export _ow_readbyte
|
||||||
|
.export _ow_reset
|
||||||
|
.export _ow_wait
|
||||||
|
|
||||||
|
; provided by system-specific routines at link time
|
||||||
|
|
||||||
|
.import _ow_send1_impl
|
||||||
|
.import _ow_send0_impl
|
||||||
|
.import _ow_read_impl
|
||||||
|
.import _ow_reset_impl
|
||||||
|
.import _ow_wait_impl
|
||||||
|
|
||||||
|
.bss
|
||||||
|
|
||||||
|
owtmp: .res 1
|
||||||
|
|
||||||
|
.code
|
||||||
|
|
||||||
|
; some system-specific routines can be passed through
|
||||||
|
|
||||||
|
_ow_send1 := _ow_send1_impl
|
||||||
|
_ow_send0 := _ow_send0_impl
|
||||||
|
_ow_wait := _ow_wait_impl
|
||||||
|
|
||||||
|
; reset bus: return 0 if 1-Wire devices present, 1 otherwise
|
||||||
|
|
||||||
|
_ow_reset:
|
||||||
|
jsr _ow_reset_impl
|
||||||
|
ldx #0
|
||||||
|
txa
|
||||||
|
adc #0
|
||||||
|
rts
|
||||||
|
|
||||||
|
; read a bit from the 1-Wire bus
|
||||||
|
|
||||||
|
_ow_readbit:
|
||||||
|
jsr _ow_read_impl
|
||||||
|
ldx #0
|
||||||
|
txa
|
||||||
|
adc #0
|
||||||
|
rts
|
||||||
|
|
||||||
|
; write a bit to the 1-Wire bus
|
||||||
|
|
||||||
|
_ow_writebit:
|
||||||
|
ror ;shift out of LSB
|
||||||
|
bcs :+
|
||||||
|
jmp _ow_send0
|
||||||
|
: jmp _ow_send1
|
||||||
|
|
||||||
|
; write a byte to the 1-Wire bus
|
||||||
|
|
||||||
|
_ow_writebyte:
|
||||||
|
sta owtmp
|
||||||
|
ldx #8
|
||||||
|
: ror owtmp ;LSB is written first
|
||||||
|
bcs :+
|
||||||
|
jsr _ow_send0
|
||||||
|
clc
|
||||||
|
bcc :++
|
||||||
|
: jsr _ow_send1
|
||||||
|
: dex
|
||||||
|
bne :---
|
||||||
|
rts
|
||||||
|
|
||||||
|
; read a byte from the 1-Wire bus
|
||||||
|
|
||||||
|
_ow_readbyte:
|
||||||
|
ldx #8
|
||||||
|
: jsr _ow_read_impl
|
||||||
|
ror owtmp
|
||||||
|
dex
|
||||||
|
bne :-
|
||||||
|
lda owtmp
|
||||||
|
ldx #0
|
||||||
|
rts
|
||||||
30
ow-temp.c
Normal file
30
ow-temp.c
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#include "ow-temp.h"
|
||||||
|
|
||||||
|
short ow_temp_read(unsigned char* devid, unsigned char format)
|
||||||
|
{
|
||||||
|
unsigned char t1, t2;
|
||||||
|
short rawtemp;
|
||||||
|
|
||||||
|
if (devid[0]!=40)
|
||||||
|
return OW_ERR_INVALIDDEVICE;
|
||||||
|
ow_selectdevice(devid);
|
||||||
|
ow_writebyte(68); // ask for a temperature reading
|
||||||
|
ow_wait(); // wait for operation to complete
|
||||||
|
ow_selectdevice(devid);
|
||||||
|
ow_writebyte(190); // retrieve the reading
|
||||||
|
t1=ow_readbyte();
|
||||||
|
t2=ow_readbyte();
|
||||||
|
ow_reset();
|
||||||
|
|
||||||
|
rawtemp=(short)(t1+((int)t2<<8));
|
||||||
|
switch (format)
|
||||||
|
{
|
||||||
|
case OW_TEMP_FAHRENHEIT:
|
||||||
|
return (rawtemp*9+8)/80+32;
|
||||||
|
case OW_TEMP_CELSIUS:
|
||||||
|
return (rawtemp+8)>>4;
|
||||||
|
case OW_TEMP_RAW:
|
||||||
|
default:
|
||||||
|
return rawtemp;
|
||||||
|
}
|
||||||
|
}
|
||||||
16
ow-temp.h
Normal file
16
ow-temp.h
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#ifndef OW_TEMP_H
|
||||||
|
#define OW_TEMP_H
|
||||||
|
|
||||||
|
#include "ow.h"
|
||||||
|
|
||||||
|
// 1-Wire temperature sensor functions
|
||||||
|
|
||||||
|
short ow_temp_read(unsigned char* devid, unsigned char format);
|
||||||
|
|
||||||
|
// 1-Wire temperature sensor constants
|
||||||
|
|
||||||
|
#define OW_TEMP_RAW 0
|
||||||
|
#define OW_TEMP_FAHRENHEIT 1
|
||||||
|
#define OW_TEMP_CELSIUS 2
|
||||||
|
|
||||||
|
#endif // OW_TEMP_H
|
||||||
16
ow.c
Normal file
16
ow.c
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#include "ow.h"
|
||||||
|
|
||||||
|
void ow_selectdevice(unsigned char* devid)
|
||||||
|
{
|
||||||
|
ow_reset();
|
||||||
|
ow_writebyte(85);
|
||||||
|
ow_writebyte(devid[0]);
|
||||||
|
ow_writebyte(devid[1]);
|
||||||
|
ow_writebyte(devid[2]);
|
||||||
|
ow_writebyte(devid[3]);
|
||||||
|
ow_writebyte(devid[4]);
|
||||||
|
ow_writebyte(devid[5]);
|
||||||
|
ow_writebyte(devid[6]);
|
||||||
|
ow_writebyte(devid[7]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
21
ow.h
Normal file
21
ow.h
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#ifndef OW_H
|
||||||
|
#define OW_H
|
||||||
|
|
||||||
|
// common assembly-language routines in ow-common.s
|
||||||
|
|
||||||
|
void __fastcall__ ow_writebit(unsigned char data);
|
||||||
|
void __fastcall__ ow_writebyte(unsigned char data);
|
||||||
|
unsigned char __fastcall__ ow_readbit(void);
|
||||||
|
unsigned char __fastcall__ ow_readbyte(void);
|
||||||
|
unsigned char __fastcall__ ow_reset(void);
|
||||||
|
void __fastcall__ ow_wait(void);
|
||||||
|
|
||||||
|
// common C routines in ow.c
|
||||||
|
|
||||||
|
void ow_selectdevice(unsigned char* devid);
|
||||||
|
|
||||||
|
// common 1-Wire constants
|
||||||
|
|
||||||
|
#define OW_ERR_INVALIDDEVICE -32767
|
||||||
|
|
||||||
|
#endif // OW_H
|
||||||
Reference in New Issue
Block a user