Waitkey / Ischarwaiting

ZottiFX

Neues Mitglied
18. Okt. 2009
13
0
0
Sprachen
Hallo Leute,

grüßt Euch erst mal!:pleasantry:
Ich lese zwar schon lange, aber meine Zeit, die ich mit den Kleinen (Atmels) verbringen darf ist eher gering.

Tja, nach dem meine Heizung ausfiel, habe ich selber Hand angelegt.
Getrennt geht alles bestens aber zusammen?????

Gut, mein Problem ist ganz einfach.
Das Programm steuert den Vorlauf. Das funzt auch.
Da das in die Do - While Schleife integriert ist, weiss ich nicht wie ich die Übermittlung und Auswertung der seriellen Schnittstelle bauen kann?

Solange ich nichts über die Serielle Schnittstelle schicke geht es einwandfrei!
Wenn was über die Schnittstelle kommt, reagiert das Ding nur noch auf die Schnittstelle.

Ganz unten im Code ist die Auswertung der seriellen Schnittstelle.
Wie schaffe ich es, dass nachdem ich z.B. zaehlerx ausgegeben habe die Schleife weiter läuft?
:confused:
Hua, viel Tobak um zu erklären wo ich hänge!

Scusi

Ich hoffe Ihr habt eine Idee!!

LG Olli

PHP:
$prog &HFF , &HEF , &HD9 , &H00
$regfile = "m32def.dat"

$crystal = 16000000
$baud = 9600

Ddrd = &B10000000
Portd = &B100000

Declare Sub Init
Declare Sub Convallt
Declare Function Decigrades(byval Sc(9) As Byte) As Integer
Declare Sub Setlcd
Declare Sub Setvars

Dim I As Byte
Dim Inputstring As String * 12
Dim Zeiger As Byte At &HA0

Dim Zaehlerx As Byte
Declare Sub Auswerten
Dim Tempbyte As Byte At &HA7
Dim Flag As Byte At &HA1
Dim Protokoll(10) As Byte
Dim Atadress As Byte

Dim A As Byte
Dim B As Byte
Dim W As Word
Dim Vfuss As Integer
Dim Ds As Integer
Dim Tcounter As Byte
Dim Legionellen As Bit
Dim Tempa_min As Integer
Dim Tempb_min As Integer
Dim Tempa_max As Integer
Dim Tempb_max As Integer
Dim Tempsoll_min As Integer
Dim Tempsoll_max As Integer
Dim Brenner As Bit
'Temperatur Variablen
Dim Dgvorlauf As Integer
Dim Dg As Integer
Dim Nachtabsenkung_start As Integer
Dim Nachabsenkung_stop As Integer
' temp Variable Clock
Dim Tmp_c As String * 4
' temp Variable Nachtabsenkung start
Dim Tmp_ns As Integer
' temp Variable Clock als integer zum rechnen
Dim Tmp_ac As Integer
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Sc(9) As Byte                                           'Scratchpad
Dim Sod As Long
Dim Key As String * 10

Zeiger = 1
Atadress = 13


'Ports konfiguriren
'1wire
Config 1wire = Porta.0
Config 1wire = Porta.1

'AUSGÄNGE
Config Portb = Output

Open "COMD.0:9600,8,n,1" For Input As #1
Open "COMD.1:9600,8,n,1" For Output As #2

'LCD
Config Lcdpin = Pin , Rs = Portc.5 , E = Portc.4 , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3
Config Lcd = 20 * 4

'Taster
'Config Portd = Input
'Pullup an Portd
'Portd = &HFF



' Timer hier wird die Steuerung ausgeführt
' fast eine Sekunde reicht
Config Timer1 = Timer , Prescale = 256                      'Konfiguriere Timer1
Enable Timer1                                               'schalte den Timer1 ein
On Timer1 Check_values                                      'verzweige bei Timer1 überlauf zu   Isr_von_Timer1
Enable Interrupts

'[now init the clock]
Config Date = Dmy , Separator = .
Config Clock = Soft
'assign the date to the reserved date$
'The format is MM/DD/YY
Date$ = "01/16/10"
Time$ = "22:00:00"




Cls

Lcd "Controller"
Locate 2 , 1
Lcd "DS18S20"
Wait 3

Dsid1(1) = 1wsearchfirst(pina , 0)

Dsid2(1) = 1wsearchfirst(pina , 1)


' Schauen ob die errechnete Checksumme die selbe ist wie die wo im ROM abgelegt ist
If Dsid1(8) = Crc8(dsid1(1) , 7) Then
   Locate 1 , 1
   Lcd "CRC OK Sensor 1 ID"
   Wait 1
   Locate 1 , 1
   For A = 1 To 8
       Lcd Hex(dsid1(a))
   Next
End If


If Dsid2(8) = Crc8(dsid2(1) , 7) Then
   Locate 2 , 1
   Lcd "CRC OK Sensor 2 ID"
   Wait 1
   Locate 2 , 1
   For B = 1 To 8
       Lcd Hex(dsid2(b))
   Next
End If
Wait 1
Cls

Init

' Main loop
Do

   A = Ischarwaiting()
   If A = 1 Then                                            'we got something
      Tempbyte = Waitkey(#1)
      Gosub Zeichenempfang

      If Flag = 1 Then
         Gosub Protokoll
         Flag = 0
         Zeiger = 1
      End If
   Else
    Setvars
    Setlcd
    Convallt                                                ' "Messdaten einlesen"
    Waitus 80


    1wverify Dsid1(1) , Pina , 0                            'eintrag Im Rom Prüfen ""

    If Err = 1 Then
      'Lcd "DsId1 nicht am bus    "                          'Err = 1 Fehler aufgetreten
    Elseif Err = 0 Then
      1wwrite &HBE , 1 , Pina , 0
      Sc(1) = 1wread(9 , Pina , 0)
      If Sc(9) = Crc8(sc(1) , 8) Then
         Dgvorlauf = Decigrades(sc(9))
         Dgvorlauf = Dgvorlauf / 10
      End If
    End If

    1wverify Dsid2(1) , Pina , 1
    If Err = 1 Then
      'Lcd "DsId2 nicht am bus    "
    Elseif Err = 0 Then
      1wwrite &HBE , 1 , Pina , 1
      Sc(1) = 1wread(9 , Pina , 1)
      If Sc(9) = Crc8(sc(1) , 8) Then
         Dg = Decigrades(sc(9))
         Dg = Dg / 10
      End If
    End If
    Wait 1
  End If
Loop
End                                                         'end program


Sub Init
    Cls
    Tcounter = 0
    Vfuss = 27
    Ds = 0

    Legionellen = 0
    Tempa_min = 60
    Tempb_min = 35
    Tempa_max = 65
    Tempb_max = 40
    Brenner = 0


    Portb.0 = 0                                             'Fussbodenregler
    Portb.1 = 0                                             'Fussbodenregler
    Portb.2 = 1                                             'Pumpe Fussbodenheizung
    Portb.3 = 1                                             'Pumpe Bad


End Sub

Sub Convallt
   '1wreset                                                  ' reset the bus
   '1wwrite &HCC                                             ' skip rom
   '1wwrite &H44                                             ' Convert T

   1wreset Pina , 0
   1wwrite &HCC , 1 , Pina , 0
   1wwrite &H44 , 1 , Pina , 0

   1wreset Pina , 1
   1wwrite &HCC , 1 , Pina , 1
   1wwrite &H44 , 1 , Pina , 1

End Sub




Function Decigrades(byval Sc(9) As Byte)
Dim Tmp As Byte , T As Integer , T1 As Integer

   Tmp = Sc(1) And 1
      If Tmp = 1 Then Decr Sc(1)
      T = Makeint(sc(1) , Sc(2))
      T = T * 50
      T = T - 25
      T1 = Sc(8) - Sc(7)
      T1 = T1 * 100
      T1 = T1 / Sc(8)
      T = T + T1
      Decigrades = T / 10
End Function

' wird vom Timer aus aufgerufen
Check_values:


   Tcounter = Tcounter + 1

   If Tcounter > 20 Then

      If Dgvorlauf < Vfuss Then
         Locate 2 , 1
         Lcd "Vorlauf up"
         Portb.0 = 0
         Portb.1 = 1
         Waitms 600
         Cls
         Portb.0 = 0
         Portb.1 = 0
      End If
      If Dgvorlauf > Vfuss Then
         Locate 2 , 1
         Lcd "Vorlauf down"
         Portb.1 = 0
         Portb.0 = 1
         Waitms 600
         Cls
         Portb.1 = 0
         Portb.0 = 0
      End If

      Tcounter = 0
   End If

   'Heizkesseltemperatur
   If Legionellen = 1 Then
      Tempsoll_max = Tempa_max
      Tempsoll_min = Tempa_min
      Legionellen = 0
   Else
      Tempsoll_max = Tempb_max
      Tempsoll_min = Tempb_min
   End If

   If Brenner = 1 And Dg > Tempsoll_max Then
      Brenner = 0
   End If

   If Brenner = 0 And Dg < Tempsoll_max Then
      Brenner = 1
   End If



Return

Sub Setlcd

      Locate 1 , 1 : Lcd Dgvorlauf : Locate 1 , 5 : Lcd Dg : Locate 1 , 9 : Lcd Time$
      Locate 2 , 1 : Lcd Portb.2 : Locate 2 , 3 : Lcd Portb.3 : Locate 2 , 6. : Lcd Sod

End Sub

Sub Setvars
   Dim Pob1 As Bit
   Dim Pob2 As Bit
    Sod = Secofday()
   Pob1 = 0
   Pob2 = 0
    ' Pumpe Fussbodenheizung
    If Sod > 18000 And Sod < 79200 Then
      Pob1 = 1
    End If
    Portb.2 = Pob1


    ' Pumpe Bad
    If Sod > 23400 And Sod < 27000 Then
      Pob2 = 1
    End If

    If Sod > 61200 And Sod < 70200 Then
      Pob2 = 1
    End If

    Portb.3 = Pob2

    ' Legionellen heizen auf 60 Grad
    If Sod > 23400 And Sod < 23500 Then
      Legionellen = 1
    Else
      Legionellen = 0
    End If

End Sub


 Zeichenempfang:
   Protokoll(zeiger) = Tempbyte
   If Tempbyte = 0 Then
      Zeiger = 1
   End If
   If Protokoll(1) = 27 Then
        If Tempbyte = 0 Then
            Flag = 1
        End If
        Incr Zeiger
   Else
        Zeiger = 1
   End If
Return
End


Protokoll:
            If Protokoll(2) = Atadress Then
                Flag = 2
            End If
            If Protokoll(2) = 255 Then
                Flag = 2
            End If

            If Flag = 2 Then

                 Zaehlerx = Protokoll(3)
                 Locate 2 , 1
                  Lcd Zaehlerx
                 Protokoll(1) = 0
                 Protokoll(2) = 0
                 Protokoll(3) = 0
                 Protokoll(4) = 0

            End If
Return
End
 
Ehrlich gesagt, verstehe ich nicht, was du mit der seriellen Schnittstelle machst:
$baud = 9600
Open "COMD.0:9600,8,n,1" For Input As #1 'hiermit wird der Hardware RX zu einem Software Rx
Open "COMD.1:9600,8,n,1" For Output As #2 'und hier wird der HW TX ebenso vergewaltigt
A = Ischarwaiting() 'dies fragt wieder den HW ab, ob es den jetzt noch gibt, weiss ich nicht
Tempbyte = Waitkey(#1) 'und hier liest du wieder vom SW Input ein

Das lässt mich vermuten, dass du die Zusammenhänge noch nicht verstanden hast.
Ich hätte das jetzt eher so erwartet:
$baud = 9600
A = Ischarwaiting()
Tempbyte = Inkey()

Dann sollte das zunächst einmal funktionieren. Bliebe noch die Frage, ob man den Ablauf noch verbessern kann, aber das kommt später.

HBA
 
Hallo,

OK, das $baud kam noch von früher!
Benötige ich hier aktuell nicht mehr.

Mein Problem ist, daß wenn ich in die Zeichenerkennung wechsle die ich nicht mehr zurück komme.

Also hier:
PHP:
Do 

   A = Ischarwaiting() 
   If A = 1 Then                                            
      Tempbyte = Waitkey(#1) 
      Gosub Zeichenempfang 

      If Flag = 1 Then 
         Gosub Protokoll 
         Flag = 0 
         Zeiger = 1 
      End If

Aber ich denke, wenn ich hier noch eine Variable mit einfüge, die ich triggere von der Zeichenerkennung aus, dann sollte mein Problem behoben sein.
Oder funktioniert das mit der Hardware UART anderst?

Habe ich da irgend was überlesen?

LG Olli
 
Hallo Olli,

warum machst Du es so umständlich? Du definierst einen SW USART über die HW-Anschlüsse. Hat das einen bestimmten Grund?
Beim Mega32 ist D0 RxD und D1 Txd. Ist doch gut so, das kannst Du doch den HW-USART benutzen.

Weiter würde ich Dir empfehlen, einen Buffer zu aktivieren, damit Dir keine Zeichen verloren gehen.

Ich würde die Initialisierung der RS232 so machen:

Code:
Config Com1 = 9600, Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 254
Config Serialout = Buffered , Size = 254
Nur als Beitrag zu dem Thread bisher. Weiter habe ich mir Deinen Code noch nciht angesehen!

Grüße,
Markus
 
Hallo Jungs,
das mit dem Comport ist mir noch gar nicht aufgefallen!!
Aber Ihr habt natürlich Recht.

Wen ich es so mache wie Markus es schrieb, greife ich dann
so darauf zu?
PHP:
Tempbyte = Waitkey(Com1)

Viele Grüße

Olli
 
Oh jeeee, neeeee,

1. Ich habe Dir natürlich nicht die gesamte Lösung vorgekaut sondern nur einen Teil. Die vollständige Initialisierung sieht so aus:

' Serialport initialisieren
Code:
Config Com1 = 57600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 254
Config Serialout = Buffered , Size = 254

Open "com1:" For Binary As #1

Zum prüfen ob Du ein Zeichen empfangen hast eignet sich
Code:
Tempbyte = Ischarwaiting(#1)

Ischarwaiting liefert eine 1 sobald ein Zeichen im Buffer enthalten ist. Du kannst es dann mit
Code:
Tempbyte = Inkey(#1)
auslesen.

Du kannst natürlich die Funktion Waitkey(#1) verwenden. Die hat aber den Nachteil, dass das Programm dann dort so lange stehen bleibt bis Du wirklich ein Zeichen empfangen hast. Meist möchtest Du aber noch andere Dinge rechnen und somit wäre das hinderlich. Ich empfehle obiges Konstrukt.

So... nun habe ich Dir wieder einen Teil verraten aber nicht alles. Den Ablauf mit IF und so weiter musst Du natürlich noch dazu bauen damit es funktioniert.

Außerdem ..... Ich empfehle Dir ganz ganz dringend Dir die BASCOM-Hilfe mal reinzuziehen und Dir vor allem das Kapitel über den USART und die dazugehörigen Befehle durchzulesen.
Ich glaube nämlich, das hat Du noch nicht getan, das gehört aber zum Handwerkszeug.

Aber ich weiß schon :) Es ist viel einfache hier mal ein paar Leute um Hilfe zu fragen. Ja ja ......

Ich hoffe nun, Du kommst wieder einen Schritt weiter.

Grüße,
Markus
 
Hallo Markus,
ertappt!!!

Die Frage an Dich hätte ich nicht wirklich stellen müssen!
Das hätte ich durch lesen selber gefunden.
Ich hab leider erst durch die Offenlegung hier selber ein paar Sachen gesehen, die den Rest beantworten!

Aber dieser Dank gehört nur Dir.

Danke Dir.

Olli
 
Open "com1:" For Binary As #1
Hallo Markus,
warum machst du das hier? Ab jetzt willst du den HW UART immer über den Channel #1 ansprechen. Also
Print #1, "test"
Input(#1)
IsCharWaiting(#1)
usw.
Ohne diesen Befehl geht es doch auch und selbst wenn du den Befehl drin hast kannst du immer noch so arbeiten
Print "test"
Input()
IsCharWaiting()

Wenn man den zweiten UART oder einen SW UART benutzen will, dann ist dieser Befehl notwendig. Aber das war hier doch nicht die Frage.

HBA
 
warum machst du das hier?

Weil es sich bei mir in der Zwischnzeit als Handwerkszeug und als Normal eingeschlichen hat, allen Kindern direkte Namen zu geben.

Hmmm, ja, bei nur einer COM ist es nicht notwendig. Ich gehe aber schon seit geraumer Zeit gerne auf Nummer-Sicher. Wahrscheinlich kommt es daher, da ich immer mit mehreren Streams zu tun habe und es in den letzten projekten bei mir mindestens #1 und #2 gibt. Aktuell sogar #3 und #4.

.... Einfach: Gib dem Kind einen Namen ....

Grüße,
Ma
 
Hey Jungs,

vielen Dank!!
Der erste Schritt geht nun!!

schönen Sonntag abend

Olli
 
Glückwunsch und weiter viel Spass .....

Winterliche Grüße,
Markus

PS: Ich saufe hier gerade im Schnee ab und es hört nicht auf zu schneien.
 
Danke Dir,

bei uns hat es die halbe Nacht geschneit und seit der Dämmerung regnet es!
Genial, stellenweise kannst Du Dich gar nicht auf den Füßen halten.

LG Olli
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)