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: Problem mit LC - Display !!Hilfe!! Kategorie: Programmierung Basic (von Andreas - 1.06.2005 8:15)
 Als Antwort auf Re: Problem mit LC - Display !!Hilfe!! von Kay - 31.05.2005 22:20
Andreas nutzt:  CC1-Unit V1.1

>  es fehlt leider allerhand von  quelltext, so dass eine simulation nicht möglich ist.
> ohne aber weiteres zu sehen, vermute ich eiskalt einen überlauf des gosub-stacks.
> konkret: du springst in zuviele unterprogramme, ohne sie  durch return korrekt zu beenden.
> prüfe das  von ablauf her mal genauer
>

Hallo Kay

Hier ist mein kompletter Quelltext.

' *** Definition LCD-Ports ***
define lcd_port byteport[2] 'spezifiziert einen 8 Bit Digitalport bei Define
define lcd_rs port[14]
define lcd_rw port[13]
define lcd_e port[15]
'---Digitale I/Os----
define Fuellstandssensor1 port[1]
define Fuellstandssensor2 port[2]
define LED1 port[3]
define LED2 port[4]
define LED3 port[7]
define Fuellstandsschalter1 port[5]
define Fuellstandsschalter2 port[6]
define Temperaturschalter port[8]
'----A/D - Eingänge----
define sensor ad[1]
'---LC - Display---
define lcd_buf byte   '8 Bits (0-255)
define lcd_param byte '8 Bits (0-255)
'---User Data---
define response byte 'Variable um den Ringpufferspeicher 8 Bits (0 - 255)
                     'der C-Control leerzumachen.
define output word '16 Bits (-32768 - 32767)
define temp word   '16 Bits (-32768 - 32767)
'*** ASCII-Codes ***
define gf_ &H22 'Entspricht "
define sp_ &H20 'Entspricht Leerzeichen
define A_ &H41
define B_ &H42
define C_ &H43
define D_ &H44
define E_ &H45
define F_ &H46
define G_ &H47
define H_ &H48
define I_ &H49
define J_ &H4A
define K_ &H4B
define L_ &H4C
define M_ &H4D
define N_ &H4E
define O_ &H4F
define P_ &H50
define Q_ &H51
define R_ &H52
define S_ &H53
define T_ &H54
define U_ &H55
define V_ &H56
define W_ &H57
define X_ &H58
define Y_ &H59
define Z_ &H5A
define PUNKT &H2E
define MINUS &H2D
define NULL &H30
define GLEICH &H3D
'*** Hauptprgramm ***
  gosub LCD_INIT    
  BAUD R2400                
'----------------------------------------------------------------------------------------------------------------------------------
  response = 0
  GOSUB rxdleeren
  PRINT"AT+CMGF=1";          
  PUT 13                              
  PUT 10                              
  Pause 150
  PRINT"AT+CPIN=";              
  PUT 34                              
  PRINT"xxxx";                    
  PUT 34                                
  PUT 13                          
  PUT 10                            
  Pause 600                      
  GOSUB rxdleeren          
  GOSUB Pin

  PRINT"AT+CMGF=1";
  PUT 13                    
  PUT 10                    
  Pause 150
  PRINT"AT+CSCA=";          
  PUT 34                    
  PRINT"+491710760000";  
  PUT 34                  
  PUT 13                    
  PUT 10                    
  Pause 50                  
  gosub rxdleeren            
  gosub LCD_CLS              
                           

#mainloop                      'Hauptschleife
  temp = 0
  output = 0
  response = 0
  PRINT"AT";                
  PUT 13                
  PUT 10                    
  Pause 15
  IF RXD THEN GOSUB modemok ELSE GOSUB modemfehler
  GOSUB rxdleeren              
  GOSUB Temperatur          
  GOSUB Wasserstand1      
  GOSUB Wasserstand2      
  GOTO mainloop
END                          

'-----------------------------------------------------------------------------------------------------------------------
#Wasserstand1
IF Fuellstandssensor1 = 0 THEN GOTO SMS1
RETURN
'-----------------------------------------------------------------------------------------------------------------------
#Wasserstand2
IF Fuellstandssensor2 = 0 THEN GOTO SMS2
RETURN
'-----------------------------------------------------------------------------------------------------------------------
#SMS1
  PRINT "AT+CMGF=1";        
  PUT 13                    
  PUT 10
  PAUSE 50
  PRINT "AT+CMGS=";        
  PUT 34                  
  PRINT "+49xxxxxxxxxx";    
  PUT 34                  
  PUT 13                  
  PAUSE 50
  PRINT "Flüssigkeitsstand zu NIEDRIG!";
  PAUSE 10
  PUT 26                    
  PAUSE 200                  
  GOSUB rxdleeren            
  beep 300,100,0          
  PAUSE 10
  GOSUB SMSgesendet          
  LED1 = 1                  
  GOSUB Schalter1
  DEACT LED1                
  gosub LCD_CLS              

GOTO mainloop
'------------------------------------------------------------------------------------------------------------------------
'Hier läuft die Steuerung solange in einer Schleife bis ein Taster den Port 3 gegen GND geschalten hat.

#Schalter1
IF Fuellstandsschalter1 = 0 THEN RETURN
GOTO Schalter1
'------------------------------------------------------------------------------------------------------------------------
#SMS2
  PRINT "AT+CMGF=1";      
  PUT 13                  
  PUT 10
  PAUSE 50
  PRINT "AT+CMGS=";        
  PUT 34                    
  PRINT "+49xxxxxxxxxx";    
  PUT 34                    
  PUT 13                    
  PAUSE 50
  PRINT "Flüssigkeitsstand zu HOCH!";
  PAUSE 10
  PUT 26                    
  PAUSE 200                  
  GOSUB rxdleeren            
  beep 300,100,0              
  PAUSE 10
  GOSUB SMSgesendet          
  LED2 = 1                    
  GOSUB Schalter2
  DEACT LED2                
  gosub LCD_CLS              

GOTO mainloop
'------------------------------------------------------------------------------------------------------------------------
'Hier läuft die Steuerung solange in einer Schleife bis ein Taster den Port 3 gegen GND geschalten hat.

#Schalter2
IF Fuellstandsschalter2 = 0 THEN RETURN
GOTO Schalter2
'------------------------------------------------------------------------------------------------------------------------
#SMS3
   PRINT "AT+CMGF=1";        
  PUT 13                    
  PUT 10
  PAUSE 50
  PRINT "AT+CMGS=";          
  PUT 34                    
  PRINT "+49xxxxxxxxxx";    
  PUT 34                    
  PUT 13                  
  PAUSE 50
  PRINT "Temperatur zu HOCH! ";temp;" Grad Celsius erreicht.";
  PAUSE 10
  PUT 26                      
  PAUSE 200                
  GOSUB rxdleeren            
  beep 300,100,0            
  PAUSE 10
  GOSUB SMSgesendet          
  LED3 = 1                  
  GOSUB Schalter3
  DEACT LED3                  
  gosub LCD_CLS              

GOTO mainloop
'------------------------------------------------------------------------------------------------------------------------
'Hier läuft die Steuerung solange in einer Schleife bis ein Taster den Port 8 gegen GND geschalten hat.

#Schalter3
IF Temperaturschalter = 0 THEN RETURN
GOTO Schalter3
'------------------------------------------------------------------------------------------------------------------------
#Pin
  gosub LCD_CLS
  lcd_param = 1 : gosub LCD_GOTOLINE  
  lcd_param = P_ : gosub LCD_WRITECHAR
  lcd_param = I_ : gosub LCD_WRITECHAR
  lcd_param = N_ : gosub LCD_WRITECHAR
  lcd_param = sp_ : gosub LCD_WRITECHAR
  lcd_param = O_ : gosub LCD_WRITECHAR
  lcd_param = K_ : gosub LCD_WRITECHAR
  lcd_param = 2 : gosub LCD_GOTOLINE      
  lcd_param = M_ : gosub LCD_WRITECHAR    
  lcd_param = O_ : gosub LCD_WRITECHAR
  lcd_param = D_ : gosub LCD_WRITECHAR
  lcd_param = E_ : gosub LCD_WRITECHAR
  lcd_param = M_ : gosub LCD_WRITECHAR
  lcd_param = sp_ : gosub LCD_WRITECHAR
  lcd_param = O_ : gosub LCD_WRITECHAR
  lcd_param = N_ : gosub LCD_WRITECHAR
  lcd_param = L_ : gosub LCD_WRITECHAR
  lcd_param = I_ : gosub LCD_WRITECHAR
  lcd_param = N_ : gosub LCD_WRITECHAR
  lcd_param = E_ : gosub LCD_WRITECHAR

RETURN

#modemok
  lcd_param = 1 : gosub LCD_GOTOLINE  
  lcd_param = M_ : gosub LCD_WRITECHAR
  lcd_param = O_ : gosub LCD_WRITECHAR
  lcd_param = D_ : gosub LCD_WRITECHAR
  lcd_param = E_ : gosub LCD_WRITECHAR
  lcd_param = M_ : gosub LCD_WRITECHAR
  lcd_param = sp_ : gosub LCD_WRITECHAR
  lcd_param = O_ : gosub LCD_WRITECHAR
  lcd_param = K_ : gosub LCD_WRITECHAR

RETURN

#modemfehler
  lcd_param = 1 : gosub LCD_GOTOLINE  
  lcd_param = M_ : gosub LCD_WRITECHAR
  lcd_param = O_ : gosub LCD_WRITECHAR
  lcd_param = D_ : gosub LCD_WRITECHAR
  lcd_param = E_ : gosub LCD_WRITECHAR
  lcd_param = M_ : gosub LCD_WRITECHAR
  lcd_param = sp_ : gosub LCD_WRITECHAR
  lcd_param = N_ : gosub LCD_WRITECHAR
  lcd_param = I_ : gosub LCD_WRITECHAR
  lcd_param = C_ : gosub LCD_WRITECHAR
  lcd_param = H_ : gosub LCD_WRITECHAR
  lcd_param = T_ : gosub LCD_WRITECHAR
  lcd_param = sp_ : gosub LCD_WRITECHAR
  lcd_param = O_ : gosub LCD_WRITECHAR
  lcd_param = K_ : gosub LCD_WRITECHAR

RETURN

#SMSgesendet
  gosub LCD_CLS
  lcd_param = 1 : gosub LCD_GOTOLINE    
  lcd_param = S_ : gosub LCD_WRITECHAR
  lcd_param = M_ : gosub LCD_WRITECHAR
  lcd_param = S_ : gosub LCD_WRITECHAR
  lcd_param = sp_ : gosub LCD_WRITECHAR
  lcd_param = G_ : gosub LCD_WRITECHAR
  lcd_param = E_ : gosub LCD_WRITECHAR
  lcd_param = S_ : gosub LCD_WRITECHAR
  lcd_param = E_ : gosub LCD_WRITECHAR
  lcd_param = N_ : gosub LCD_WRITECHAR
  lcd_param = D_ : gosub LCD_WRITECHAR
  lcd_param = E_ : gosub LCD_WRITECHAR
  lcd_param = T_ : gosub LCD_WRITECHAR
  lcd_param = 2 : gosub LCD_GOTOLINE  
  lcd_param = F_ : gosub LCD_WRITECHAR  
  lcd_param = E_ : gosub LCD_WRITECHAR
  lcd_param = H_ : gosub LCD_WRITECHAR
  lcd_param = L_ : gosub LCD_WRITECHAR
  lcd_param = E_ : gosub LCD_WRITECHAR
  lcd_param = R_ : gosub LCD_WRITECHAR
  lcd_param = sp_ : gosub LCD_WRITECHAR
  lcd_param = A_ : gosub LCD_WRITECHAR
  lcd_param = N_ : gosub LCD_WRITECHAR
  lcd_param = L_ : gosub LCD_WRITECHAR
  lcd_param = A_ : gosub LCD_WRITECHAR
  lcd_param = G_ : gosub LCD_WRITECHAR
  lcd_param = E_ : gosub LCD_WRITECHAR

RETURN
'------------------------------------------------------------------------------------------------------------------------
#Temperatur
    lcd_param = 2 : gosub LCD_GOTOLINE
    lcd_param = T_ : gosub LCD_WRITECHAR    
    lcd_param = E_ : gosub LCD_WRITECHAR
    lcd_param = M_ : gosub LCD_WRITECHAR
    lcd_param = P_ : gosub LCD_WRITECHAR
    lcd_param = PUNKT : gosub LCD_WRITECHAR
    lcd_param = GLEICH : gosub LCD_WRITECHAR
    lcd_param = sp_ : gosub LCD_WRITECHAR
    temp = sensor * 2 - 273                  
    gosub WRITEVALUE
    lcd_param = sp_ : gosub LCD_WRITECHAR
    lcd_param = C_ : gosub LCD_WRITECHAR
    lcd_param = E_ : gosub LCD_WRITECHAR
    lcd_param = L_ : gosub LCD_WRITECHAR
    lcd_param = PUNKT : gosub LCD_WRITECHAR
    IF temp >= 42 THEN GOTO SMS3            

RETURN                                        
'------------------------------------------------------------------------------------------------------------------------
#WRITEVALUE

  if temp < 0 then lcd_param = MINUS else lcd_param = sp_
  gosub LCD_WRITECHAR

  output = abs(temp) 'Absolutwert von temp

  if temp >= 100 then lcd_param = temp mod 1000 / 100 + NULL else lcd_param = sp_
  gosub LCD_WRITECHAR

  if temp >= 10 then lcd_param = temp mod 100 / 10 + NULL else lcd_param = sp_
  gosub LCD_WRITECHAR

  lcd_param = temp mod 10 + NULL
  gosub LCD_WRITECHAR

RETURN
'------------------------------------------------------------------------------------------------------------------------
#rxdleeren                                         'leert den Buffer der seriellen Schnittstelle
  PAUSE 5
  IF RXD THEN GET response
  IF NOT RXD THEN RETURN
GOTO rxdleeren

'Serial Communications Interface Interrupt (SCI)
' Dieser Interrupt wird immer dann ausgeloest, wenn ein Zeichen von der
' seriellen Schnittstelle (RS232) empfangen wurde. Das Betriebssystem fuegt
' dieses Zeichen in seinen acht Byte grossen Ringbuffer ein, vorausgesetzt
' beim Empfangen wurden keine Fehler detektiert und im Buffer ist noch
' genuegend Freiraum.
'------------------------------------------------------------------------------------------------------------------------
'*** LCD_Interface ***
'( muss in jedes Programm mit LCD-Ausgabe eingefuegt werden)

#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 komplett
#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

Ich hoffe du kannst damit was anfangen ;-)

Kann ich eigentlich von einer Schleife aus in eine Subroutine und in dieser Subroutine wieder in
eine Subroutine hupfen??

MfG
Andreas




 Antwort schreiben

Bisherige Antworten:

Re: Problem mit LC - Display !!Hilfe!! (von Kay - 1.06.2005 17:19)
    Re: Problem mit LC - Display !!Hilfe!! (von Andreas - 2.06.2005 8:06)