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 

 menue + eigene threads + asm fuer i2c(LM75) Kategorie: Programmierung Basic (von dirk - 4.08.2009 23:51)
dirk nutzt:  CC1-M-Unit V1.1
hallo,

moechte ein kleines demoprog.(basic) zur verfügung stellen. darin sind eigene
quasi-threads vorhanden.  eine menuefuehrung wird mit einem poti umgesetzt.
die aktualisierungsgeschwindigkeit vom lcddisplay wird je nach menue flexibel angepasst.
für verbesserungen oder hinweise waere ich dankbar. :-)

Quellcode
'*************************************************************************************************************************
define p1 port[1]         'nicht belegt

define p7 port[7]         'Relais 1
define p8 port[8]         'Relais 2

define lcd_rs port[14]    'LCD-Display
define lcd_rw port[13]    'LCD-Display
define lcd_e  port[15]    'LCD-Display

define lcd_port byteport[2]     'LCD-Display
'*************************************************************************************************************************
define ad8 ad[8] 'Poti für Menue-Steuerung
define ad7 ad[7] 'Temperatur-Sensor1 für Außentemperatur
define ad6 ad[6] 'Lichtsensor
'*************************************************************************************************************************
define Adresse       byte[1]  'I2C LM75; ASM-Prog
define Daten         byte[2]  'I2C LM75; ASM-Prog

define zehntausender byte[3]  'Zahlenausgabe auf LCD-Display
define tausender     byte[4]  'Zahlenausgabe auf LCD-Display
define hunderter     byte[5]  'Zahlenausgabe auf LCD-Display
define zehner        byte[6]  'Zahlenausgabe auf LCD-Display
define einer         byte[7]  'Zahlenausgabe auf LCD-Display
define value         byte[8]  'Zahlenausgabe auf LCD-Display
define gp            byte[9]  'Zahlenausgabe auf LCD-Display

define ti_out        byte[10] 'Timer für sekunden thread

define lcd_buf       byte[11] 'LCD-Display
define lcd_param     byte[12] 'LCD-Display
define lcd_char      byte[13] 'LCD-Display

define k             byte[14] 'Menue-Variable
define sp            byte[15] 'Speed-Variable für individuelles LCD-Update und Speed für task_out

define b16           byte[16] 'frei
define b17           byte[17] 'frei
define b18           byte[18] 'frei

'*************************************************************************************************************************
define temp          word[10] 'Byte 19, 20
define ti2           word[11] 'Byte 21, 22
define value16       word[12] 'Byte 23, 24
'*************************************************************************************************************************
gosub lcd_init
gosub start_msg
pause 100
'*************************************************************************************************************************

k=0
sp=3

#main
 if (abs(second-ti_out)>sp) then gosub task_out '2 s
 'if ((Daten > 29) or ((Temp-25)/10 < 5)) then beep 400,25,10 'Temperatur-Alarm
 'if (FREQ2 > 29) then beep 300,25,10 'Druchfluss-Alarm
 'if (ad6 < 1500) then beep 200,25,10 'Licht-Alarm

goto main
'*************************************************************************************************************************
#task_out
 'print day, month, year, hour, minute, second', LIT 'Ausgabe an s TERM-PROG
 ti_out=second 'Timerwert merken

 Adresse = &H90 'LM75 Adresse
 Daten = 255    'Init
 sys &H0101     'Asembler-Prog aufruf

 looktab  TempTab, ad7, Temp

 p1 = not p1

 'p7 = not P7
 'p8 = not P7

 if (ad8 >= 0) and (ad8 <= 42) then  gosub men1
 if (ad8 >= 42) and (ad8 <= 84) then  gosub men2
 if (ad8 > 84) and (ad8 <= 168) then gosub men3
 if ad8 > 168 then gosub men4

 on k gosub out_0, out_1, out_2 , out_3

return
'*************************************************************************************************************************
#men1
 sp=3
 k=k+1
return
'*************************************************************************************************************************
#men2
 sp=1
 k=1
return
'************************************************************************************************************************
#men3
 sp=1
 k=2
return
'*************************************************************************************************************************
#men4
 sp=0
 k=3
return
'*************************************************************************************************************************
#out_0'dummy_label
'das dumy_label wird benötigt, da sonst das zaehlen von k nicht funktioniert
return
'*************************************************************************************************************************
#start_msg
 gosub lcd_cls
 lcd_param = 1 : gosub lcd_gotoline
 lcd_param = &H20 : gosub lcd_writechar
 lcd_param = &H20 : gosub lcd_writechar
 lcd_param = &H20 : gosub lcd_writechar
 lcd_param = &H43 : gosub lcd_writechar    'C
 lcd_param = &H2D : gosub lcd_writechar    '-
 lcd_param = &H43 : gosub lcd_writechar    'C
 lcd_param = &H4F : gosub lcd_writechar    'O
 lcd_param = &H4E : gosub lcd_writechar    'N
 lcd_param = &H54 : gosub lcd_writechar    'T
 lcd_param = &H52 : gosub lcd_writechar    'R
 lcd_param = &H4F : gosub lcd_writechar    'O
 lcd_param = &H4C : gosub lcd_writechar    'L
return
'*************************************************************************************************************************
#out_1
 gosub lcd_init
 lcd_param = &H44 : gosub lcd_writechar    'D
 lcd_param = &H41 : gosub lcd_writechar    'A
 lcd_param = &H54 : gosub lcd_writechar    'T
 lcd_param = &H45 : gosub lcd_writechar    'E
 lcd_param = &H3A : gosub lcd_writechar    ':
 lcd_param = &H20 : gosub lcd_writechar    '
 value16 = day
 gosub display_value16
 lcd_param = &H3A : gosub lcd_writechar    ':
 value16 = month
 gosub display_value16
 lcd_param = &H3A : gosub lcd_writechar    ':
 value16 = year+2000
 gosub display_value16

 lcd_param = 2
 gosub lcd_gotoline

 lcd_param = &H54 : gosub lcd_writechar    'T
 lcd_param = &H49 : gosub lcd_writechar    'I
 lcd_param = &H4D : gosub lcd_writechar    'M
 lcd_param = &H45 : gosub lcd_writechar    'E
 lcd_param = &H3A : gosub lcd_writechar    ':
 lcd_param = &H20 : gosub lcd_writechar    '
 value16 = hour
 gosub display_value16
 lcd_param = &H3A : gosub lcd_writechar    ':
 value16 = minute
 gosub display_value16
 lcd_param = &H3A : gosub lcd_writechar    ':
 value16 = second
 gosub display_value16

return
'************************************************
#out_2
 gosub lcd_init
 lcd_param = &H54 : gosub lcd_writechar    'T
 lcd_param = &H49 : gosub lcd_writechar    'I
 lcd_param = &H3A : gosub lcd_writechar    ':
 lcd_param = &H20 : gosub lcd_writechar    '
 value16 = Daten
 if value16<0 then lcd_param=&H2D:gosub lcd_writechar
 value16=abs(value16):gosub display_value16

 'gosub display_value16
 lcd_param = &H20 : gosub lcd_writechar    '
 lcd_param = &HDF : gosub lcd_writechar    '°
 lcd_param = &H43 : gosub lcd_writechar    'C

 lcd_param = 2
 gosub lcd_gotoline
 lcd_param = &H54 : gosub lcd_writechar    'T
 lcd_param = &H41 : gosub lcd_writechar    'A
 lcd_param = &H3A : gosub lcd_writechar    ':
 lcd_param = &H20 : gosub lcd_writechar    '
 value16 = (Temp-20)/10
 if value16<0 then lcd_param=&H2D:gosub lcd_writechar
 value16=abs(value16):gosub display_value16
 'gosub display_value16
 lcd_param = &H20 : gosub lcd_writechar    '
 lcd_param = &HDF : gosub lcd_writechar    '°
 lcd_param = &H43 : gosub lcd_writechar    'C

return
'*************************************************************************************************************************
#out_3
 gosub lcd_init
 lcd_param = &H46 : gosub lcd_writechar    'F
 lcd_param = &H52 : gosub lcd_writechar    'R
 lcd_param = &H45 : gosub lcd_writechar    'E
 lcd_param = &H51 : gosub lcd_writechar    'Q
 lcd_param = &H32 : gosub lcd_writechar    '2
 lcd_param = &H3A : gosub lcd_writechar    ':
 lcd_param = &H20 : gosub lcd_writechar    '
 value16 = freq2
 gosub display_value16
 lcd_param = &H20 : gosub lcd_writechar    '
 lcd_param = &H48 : gosub lcd_writechar    'H
 lcd_param = &H7A : gosub lcd_writechar    'z

 lcd_param = 2
 gosub lcd_gotoline
 lcd_param = &H4C : gosub lcd_writechar    'L
 lcd_param = &H49 : gosub lcd_writechar    'I
 lcd_param = &H47 : gosub lcd_writechar    'G
 lcd_param = &H48 : gosub lcd_writechar    'H
 lcd_param = &H54 : gosub lcd_writechar    'T
 lcd_param = &H3A : gosub lcd_writechar    ':
 lcd_param = &H20 : gosub lcd_writechar    '

 value16 = ad6/10*196
 gosub display_value16

 lcd_param = &H20 : gosub lcd_writechar    '
 lcd_param = &H6D : gosub lcd_writechar    'm
 lcd_param = &H56 : gosub lcd_writechar    'V

 k=0
return
'*************************************************************************************************************************

'+++++++++++++++ VALUE 16 AUSGEBEN ++++++++++++++++
#display_value16
 value=0
 zehntausender=value16/10000
 if zehntausender=0 then goto dv1
 value=1
 lcd_param=zehntausender+&H30
 gosub lcd_writechar
#dv1
 tausender=(value16-zehntausender*10000)/1000
 if (tausender=0 and value=0) then goto dv2
 value=1
 lcd_param=tausender+&H30
 gosub lcd_writechar
#dv2
 hunderter=(value16-zehntausender*10000-tausender*1000)/100
 if (hunderter=0 and value=0 and gp<>4) then goto dv3
 value=1
 lcd_param=hunderter+&H30
 gosub lcd_writechar
#dv3
 if gp<>4 then goto dv3_1
 lcd_param=&H2E
 gosub lcd_writechar
#dv3_1
 zehner=(value16-zehntausender*10000-tausender*1000-hunderter*100)/10
 if (zehner=0 and value=0 and (gp<>1 and gp<>6))then goto dv4
 lcd_param=zehner+&H30
 gosub lcd_writechar
#dv4
 if gp<>1 and gp<>6 then goto dv4_1
 lcd_param=&H2E
 gosub lcd_writechar
#dv4_1
 einer=value16-zehntausender*10000-tausender*1000-hunderter*100-zehner*10
 lcd_param=einer+&H30
 gosub lcd_writechar
return
'*************************************************************************************************************************
'----------------------------------------
#LCD_INIT
' alle ports 0
  lcd_port = OFF

' 8-Bit-Modus aktivieren
  lcd_param=&H38 : gosub LCD_WRITECMD

' mit 8-Bit-Command in 4-Bit-Modus umschalten
  lcd_port=&B00000010
  tog lcd_e
  tog lcd_e

' ab jetzt 4-Bit-Modus
  lcd_param = &H28 : gosub LCD_WRITECMD
  lcd_param = &H0C : gosub LCD_WRITECMD

' Display loeschen
#LCD_CLS
  lcd_param = &H02 : gosub LCD_WRITECMD
  lcd_param = &H01 : gosub LCD_WRITECMD
return
'----------------------------------------
' Zeilenwechsel
#LCD_GOTOLINE
  if lcd_param = 1 then lcd_param = &H80
  if lcd_param = 2 then lcd_param = &HC0
  goto LCD_WRITECMD

' LCD-Kommando
#LCD_WRITECMD
  lcd_buf = OFF
  goto LCD_WRITE

' Zeichenausgabe
#LCD_WRITECHAR
  lcd_buf = &B00100000

' Kommando oder Zeichen an Display senden
#LCD_WRITE
  lcd_port = lcd_buf or (lcd_param shr 4) ' Hi-Nibble
  tog lcd_e
  tog lcd_e
  lcd_port = lcd_buf or (lcd_param and &H0F)  ' Lo-Nibble
  tog lcd_e
  tog lcd_e
return

end
'*************************************************************************************************************************
table TempTab "NTC.TAB"

'syscode muss nur einmal geladen werden!!! d.h. einmal ohne ausklammerung in c-control übertragen
'syscode "i2c.obj"

'*************************************************************************************************************************
'ASM-CODE muss mit TASM.EXE in I2C.OBJ übersetzt werden
'damit meldet man das EEPROM vom I2C an und ab
      .org $101
     
      jsr $08BB
     
      jsr I2C_Start
      lda $0A1
      jsr I2C_Write
      lda $02A
      jsr I2C_Write
      jsr $08E5
     
      jsr I2C_Start
      lda $0A1
      inca
      jsr I2C_Write
      jsr $086F
      sta $0A2
      jsr $08BB
     
      ldx #$0A0
      jsr $083C
      ldx $066
      jsr $0846
      ldx $067
      jsr $0846
      ldx #$0A1
      jsr $083C
      rts
     
PORT  .EQU  $00
DIR   .EQU  $04
SDA   .EQU  0
SCL   .EQU  1

I2C_Start BSET SDA,DIR      
      BSET SDA,PORT
      BSET SCL,PORT
      BCLR SDA,PORT
      BCLR SCL,PORT
      RTS
     
I2C_Write BSET SDA,DIR      
      LDX #8
Nextbit ROLA
      BCC LoBit
      BSET SDA,PORT
      BRA Clock
LoBit BCLR  SDA,PORT      
Clock BSET SCL,PORT
      BCLR SCL,PORT
      DEX
      BNE Nextbit
      BCLR SDA,DIR
      BSET SCL,PORT
      BCLR  SCL,PORT
      RTS
     
.end

 Antwort schreiben

Bisherige Antworten: