Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: DS1621 unter CCBasic Kategorie: Verschiedenes (von Mihael, Homepage - 26.12.2004 15:13)
 Als Antwort auf Re: DS1621 unter CCBasic von DIE HARD - 25.12.2004 20:34
'Versuch mal damit.

'Programmname bei mir DS1621.BAS
' * Programm für die CControl basic
define i2cirq port [6] ' entdeckt Interrupt von I2C
define clock port [7] ' clockt die I2C - Leitung (SCL)
define data port [8] ' setzt die Dataleitung (SDA) für I2C
define temp word
define slope word
define counter word
define merker word
define adresse byte
define i byte
define i2caus byte
define schreibe byte
define zeichen byte
define tendenz bit[190]
define flag bit[191]
define minus bit[192]
adresse=&H92
data = on
gosub anzeige
#main
if rxd then get zeichen
if zeichen=27 then gosub anzeige
if zeichen>91 then zeichen=zeichen-32
if zeichen=65 then gosub Temperatur_ein_Byte_lesen
if zeichen=66 then gosub Temperatur_zwei_Byte_lesen
if zeichen=67 then gosub genauere_Temperatur_messen
if zeichen=68 then gosub oneshot_Temperatur_messen
if zeichen=69 then gosub Thermostat_high_lesen
if zeichen=70 then gosub Thermostat_low_lesen
if zeichen=71 then gosub Thermostat_high_schreiben
if zeichen=72 then gosub Thermostat_low_schreiben
if zeichen=73 then gosub High_und_Lowflag_loeschen
if zeichen=74 then gosub Ausgangs_polaritaet_positiv
if zeichen=75 then gosub Ausgangs_polaritaet_negativ
if zeichen=76 then gosub Configurationsbyte_lesen
if zeichen=77 then gosub Adresse_einstellen
if zeichen=78 then goto Staendig_genau_messen
if zeichen=79 then goto Staendig_Zweibyte_messen
if zeichen=80 then gosub Tendenz_anzeigen
zeichen = 0
goto main
#Tendenz_anzeigen
tendenz=not tendenz
return
#Staendig_Zweibyte_messen
print "Mit die Messung abbrechen"
#Staendig_zwei
  if rxd then get zeichen
   if zeichen=27 then goto main
gosub Temperatur_zwei_Byte_lesen
goto staendig_zwei
#Staendig_genau_messen
print "Mit die Messung abbrechen"
#Staendig_genau
 if rxd then get zeichen
  if zeichen=27 then goto main
gosub genauere_Temperatur_messen
goto staendig_genau
#High_und_Lowflag_loeschen
gosub Configbyte_lesen
gosub Byte_binaer_darstellen
 if i2caus and 64 then print "Highflag war gesetzt" else print
'"Highflag war nicht gesetzt"
 if i2caus and 64 then i2caus=i2caus-64
  if i2caus and 32 then print "Lowflag war gesetzt" else print
'"Lowflag war nicht gesetzt"
 if i2caus and 32 then i2caus=i2caus-32
gosub schreiben
schreibe=&HAC:gosub putbyte:gosub getack
schreibe=i2caus:gosub putbyte : gosub getack : gosub stop
return
#Configurationsbyte_lesen
gosub Configbyte_lesen
gosub Byte_binaer_darstellen
return
#Byte_binaer_darstellen
for i=7 to 0 step -1
 if i2caus and 1 shl i then print "1 "; else print "0 ";
next i
print " ";i2caus
return
#Ausgangs_polaritaet_positiv
gosub Configbyte_lesen
gosub schreiben
schreibe=&HAC:gosub putbyte:gosub getack
 if (i2caus and 2)=0 then schreibe = i2caus+2
gosub putbyte:gosub getack
gosub stop
print "Polarität positiv"
return
#Ausgangs_polaritaet_negativ
gosub Configbyte_lesen
gosub schreiben
schreibe=&HAC:gosub putbyte:gosub getack
 if i2caus and 2 then schreibe = i2caus - 2
gosub putbyte:gosub getack
gosub stop
print "Polarität negativ"
return
#Configbyte_lesen
gosub schreiben
schreibe=&HAC : gosub putbyte:gosub getack
gosub lesen
gosub getbyte:gosub givenoack:gosub stop
return
#Thermostat_low_schreiben
print "Eingabe der Thermostat-low Temperatur"
print "Format : 275 für 27.5 oder 270 für 27.0"
input slope
print slope; " wird geschrieben"
 temp=slope/10
 counter=slope mod 10
gosub schreiben
schreibe=&HA2: gosub putbyte:gosub getack
schreibe=temp : gosub putbyte :gosub getack
 if counter =0 then schreibe=0 else schreibe=128
gosub putbyte:gosub getack
gosub stop
gosub anzeige
return
#Thermostat_high_schreiben
print "Eingabe der Thermostat-high Temperatur"
print "Format : 275 für 27.5 oder 270 für 27.0"
input slope
print slope; " wird geschrieben"
 temp=slope/10
 counter=slope mod 10
gosub schreiben
schreibe=&HA1:gosub putbyte:gosub getack
schreibe=temp : gosub putbyte
gosub getack
 if counter<>0 then schreibe=128 else schreibe=0
gosub putbyte : gosub getack
gosub stop
gosub anzeige
return
#Thermostat_low_lesen
gosub schreiben
schreibe=&HA2:gosub putbyte:gosub getack
gosub lesen
gosub getbyte
print "Thermostat low ";i2caus;".";
gosub giveack
gosub getbyte
print (i2caus = 128)*-5 ; " °C"
gosub stop
return
#Thermostat_high_lesen
gosub schreiben
schreibe=&HA1:gosub putbyte:gosub getack
gosub lesen
gosub getbyte
print "Thermostat high ";i2caus;".";
gosub giveack
gosub getbyte
print (i2caus = 128)*-5 ; " °C"
gosub stop
return
#Adresse_einstellen
print "Sytemadresse einstellen"
print "Grundadresse = "; &H90
input adresse
print "neue Adresse = " ;adresse
gosub anzeige
return
#genauere_Temperatur_messen
gosub oneshot_Temperatur_messen
gosub schreiben
schreibe=&HA8:gosub putbyte:gosub getack
gosub lesen
gosub getbyte
counter=i2caus
print "Remaincounter ";counter
gosub stop
gosub schreiben
schreibe=&HA9:gosub putbyte:gosub getack
gosub lesen
gosub getbyte
slope=i2caus
print "Slopecounter ";slope
gosub stop
print "genaue Temperatur ";
 if minus=on then print "-";
  if minus then temp = (255 xor temp)+1
print ((temp*100-25)+ ((slope-counter)*100/slope*100)/100)/100;".";
i2caus=((temp*100-25)+ ((slope-counter)*100/slope*100)/100) mod 100
if i2caus<10 then print "0";
print i2caus; " °C"
return
#oneshot_Temperatur_messen
gosub schreiben
schreibe=&HAC : gosub putbyte:gosub getack
 if (i2caus and 1) = 0 then schreibe=i2caus + 1 else schreibe=i2caus
gosub putbyte:gosub getack
gosub schreiben
schreibe=&H22: gosub putbyte : gosub getack
gosub schreiben
schreibe=&HEE : gosub putbyte : gosub getack
print "Wandlung gestartet"
gosub schreiben
schreibe=&HAC : gosub putbyte:gosub getack
#nochmals
gosub lesen
gosub getbyte:gosub stop
print i2caus
 if (i2caus and 128) = 0 then goto nochmals
print "Wandlung beendet"
gosub schreiben
schreibe=&HAA : gosub putbyte:gosub getack
gosub lesen
gosub getbyte : gosub giveack
temp=i2caus
gosub getbyte : gosub stop
slope=i2caus
gosub Temperatur_untersuchen
return
#Temperatur_ein_Byte_lesen
flag=on
goto Temperatur_zwei_Byte_lesen
return
#Temperatur_zwei_Byte_lesen
gosub Temperatur_lesen_initialisieren
gosub lesen:gosub getbyte
temp=i2caus:gosub giveack
gosub getbyte
slope=i2caus
gosub stop
gosub Temperatur_untersuchen
return
#Temperatur_untersuchen
minus=off
 if temp and 128 then minus=on
  if slope and 128 then counter=5 else counter=0
   if minus then temp=255 xor temp
    if minus then print "Temperatur: ";"-"; else print "Temperatur ";
     if flag=on then print temp; " °C"
      if flag=off then print temp;".";counter; " °C"
       if tendenz=on then gosub tendenz
flag=off
return
#tendenz
 if merker > temp*10+counter then print "Tendenz: fallend"
  if merker = temp*10+counter then print "Tendenz: unverändert"
   if merker < temp*10+counter then print "Tendenz: steigend"
merker=temp*10+counter
return
#Temperatur_lesen_initialisieren
gosub schreiben
schreibe=&HAC : gosub putbyte:gosub getack
gosub lesen
gosub getbyte:gosub stop
gosub schreiben
schreibe=&HAC:gosub putbyte:gosub getack
 if i2caus and 1 then schreibe=i2caus - 1 else schreibe=i2caus
gosub putbyte:gosub getack
gosub schreiben
schreibe=&HEE:gosub putbyte:gosub getack
gosub schreiben
schreibe=&HAA:gosub putbyte:gosub getack
return
#schreiben
gosub start:schreibe=adresse:gosub putbyte:gosub getack
return
#lesen
gosub start:schreibe=adresse+1:gosub putbyte:gosub getack
return
' ************** Anzeige *************
#anzeige
print "Temperatur lesen (1 Byte) "
print "Temperatur lesen (2 Byte) "
print "genauere Temperatur lesen "
print "einzelne Wandlung (oneshot)"
print "Thermostat high lesen "
print "Thermostat low lesen "
print "Thermostat high schreiben "
print "Thermostat low schreiben "
print "High- und Lowflag löschen "
print "Ausgangspolarität positiv "
print "Ausgangspolarität negativ "
print "Configurationsbyte lesen "
print "Systemadresse wählen "
print "ständig genaue Temperatur "
print "ständig Zweibytetemperatur "
print "Tendenz ein-/ausschalten

"
print "diese Ãœbersicht "
print "Systemadresse: ";adresse
return
' **************** I2C ***************
#START
clock = 1 : pulse data : clock = 0
return
#STOP
data = 0 : clock = 1 : data = 1
return
#GETBYTE
I2Caus = 0
for i = 7 to 0 step - 1
 if data < > 0 then I2Caus = I2Caus + 1 shl i
pulse clock
next
return
#PUTBYTE
for i = 7 to 0 step -1
if (schreibe and 1 shl i) = 0 then data = 0 else data = 1
pulse clock
next
return
#GETACK
data = 1 :
deact data :
clock = 1 :
'wait not data :
clock = 0
return
#GIVEACK
data = 0 : pulse clock : data = 1 : deact data
return
#GIVENOACK
data = 1 : pulse clock : data = 0
return

' *********************************************************************************************************************
'basic+asm
'basic
'ds1621.bas
Define ausgabe byte
define counter byte
define temp word
define wert word
define slope byte
define minus byte

#main
sys &H0101 &H90,&HAC,1,2 ' Oneshot ein
sys &H0101 &H90,&HEE,0,0 ' Wandlung ein
#nochmals
sys &H0101 &H90,&HAC,1,4 ' Controlregister lesen
if (ausgabe and 128) <> 128 then goto nochmals ' Bit 7 = 1 warten
sys &H0101 &H90,&HAA,0,0 ' Temperatur lesen einschalten
sys &H0101 &H90,0,0,3 ' Temperaturwert lesen
temp = ausgabe ' Temperaturwert speichern
if (temp and 128)<>0 then minus=on else minus=off ' Bit 7 = 128?
sys &H0101 &H90,&HA8,0,4 ' Counter lesen
counter = ausgabe ' Counter speichern
sys &H0101 &H90,&HA9,0,4 ' Slope lesen
slope = ausgabe ' Slope lesen
if minus then print "- "; else print "+ ";
'if minus then temp = 256 – temp ' bei minus so rechnen
wert = (abs(temp*100-25)+((abs(slope*100-counter*100)/slope*100)/100)* (1+(minus*2)))

print wert/100; ".";
if abs(wert mod 100) < 10 then print "0";
print abs(wert mod 100); " °C"
goto main
syscode "DS1621.s19"
' *********************************************************************************************************************
'ASM Code DS1621.s19
;*********************************************************
;*
;*
;* Basic : ds1621sy.BAS
;
;*********************************************************
adresse     equ $098 ; speichert die Chipadresse
i2c_wert1   equ $096 ; speichert den Datenwert
i2c_wert2   equ $094 ; speichert 2. Wert
richtung    equ $092 ; Lesen oder schreiben
ausgabe1    equ $0A1
ausgabe2    equ $0A2
i2c_start   equ $083C ; Start,schreiben,acknowledge
i2c_write   equ $0846 ; schreiben, acknowledge
i2c_read    equ $086F ; lesen
i2c_last    equ $08BB ; no acknowledge, stop
i2c_stop    equ $08E5 ; stop
adrhi equ   $066 ; Adresszeiger hi
adrlo equ   $067 ; Adresszeiger lo
;*********************************************************
          org $101
          jsr i2c_last ; Speicher vom Bus nehmen
          ldx adresse ; Adresse laden
          lda richtung ; Lesen oder Schreiben
          cmp #1
          beq lesen ; verzweige nach lesen
          cmp #2
          beq schrei_2 ; zwei Bytes schreiben
          cmp #3
          beq lesen_2 ; zwei Bytes lesen
          cmp #4
          beq counter ; Byte schreiben und lesen
schreiben jsr i2c_start ; Adresse senden
          ldx i2c_wert1 ; Schreibwert laden
          jsr i2c_write ; Schreiben und getack
          jsr i2c_stop ; vom Bus nehmen
          bra restore ; verzweige immer
schrei_2  jsr i2c_start ; Adresse senden
          ldx i2c_wert1 ; Schreibwert laden
          jsr i2c_write ; Schreiben und getack
          ldx i2c_wert2 ;
          jsr i2c_write ;
          jsr i2c_stop ; vom Bus nehmen
          bra restore ; verzweige immer
lesen     incx ; Lesebit hinzufuegen
          jsr i2c_start ; Leseadresse schreiben
          jsr i2c_read ; Byte lesen
          sta ausgabe1 ; ausgeben
          jsr i2c_last ; Speicher vom Bus nehmen
          bra restore
lesen_2   incx ; Lesebit hinzufuegen
          jsr i2c_start ; Leseadresse schreiben
          jsr i2c_read ; Byte lesen
          sta ausgabe1 ; ausgeben
          jsr i2c_read ; 2. Byte lesen
          sta ausgabe2 ; ausgeben
          jsr i2c_last ; Speicher vom Bus nehmen
          bra restore
counter   ldx adresse
          jsr i2c_start
          ldx i2c_wert1
          jsr i2c_write
          ldx adresse
          incx
          jsr i2c_start
          jsr i2c_read
          sta ausgabe1
          jsr i2c_last
restore   ldx #$A0 ; Programmspeicheradresse
          jsr i2c_start ; Adresse schreiben
          ldx adrhi ; Adresscounter hi lesen
          jsr i2c_write ; Counter schreiben
          ldx adrlo ; Adresscounter lo lesen
          jsr i2c_write ; Counter schreiben
          ldx #$0A1 ; Leseadresse laden
          jsr i2c_start ; Chip wieder anmelden
          rts
' **********************************************************************************************************************

Meine Homepage:
http://www.slomatrix.net


 Antwort schreiben

Bisherige Antworten: