Meine Bisherige Aquarium Steuerung

Hi ,

so nun habe ich mich nochmal an das Temp Problem gemacht erstmal wieder ohne alles
denke aber mal das es schon erstmal etwas übersichtlicher ist.
Stimmt. Ist übersichtlicher geworden.

es ist zwar immer noch ein Wait drin aber das werde ich auch noch weg bekommen.
das bekommst du über die Sectic weg. Definier dir mal zwei Variablen (sagen
wir mal Byte) die eine zählst du mit jeder Sectic um eins hoch. Bei 255 läuft
sie über und ist wieder 0 aber das ist egal. Die fragst du in der Hauptschleife
ab ob sie sich geändert hat. zB ...
Code:
' ======= Initialisierungsphase ==========
DIM St As Byte   ' Variabel für SecTic-Zähler
St = 0      ' Variable einen Starrtwert geben
DIM St_alt As Byte   ' Variable für SecTic-Zähler - Zwischenpuffer
St_alt = St     ' Gleichheit herstellen (Initialisierung)
=== Sensoradressen auslesen ===
=== Alle Messungen starten (erster Start) ===


Do  ' ======= Die Hauptschleife ============

if (St <> St_alt) then     ' Variable hat sich geändert 
  ' Also wurde SecTic aufgerufen und die Variable hochgezählt
  St_alt = St      ' neuen Stand für nächsten Hauptschleifendurchlauf sichern
  === Alle DS1820 auslesen ===
  === Alle Messungen starten ===
  === Neue Werte auf LCD ausgeben ===
EndIf

Loop ' ======= ENDE der Hauptschleife ========



' ====== Deine Sectic-Routine ==========
Sectic: 
  St = St + 1   ' Sectic-Zähler eins hoch damit man erkennt das Sectic
             ' aufgerufen wurde
Return   ' (Return oder Endsub ? Must du mal selber sehen)
Der Code ist mal schnell hier im Forum hingeschustert. Muß also noch etwas
debugged werden!

Laß ihn dir mal durch den Kopf gehen und durchlaufe ihn mal so im Kopf um
zu sehen was ich meine. Deine Sectic ist damit sehr kurz und sie dient über
die Variablen St und St_alt als Taktgeber für deine Hauptschleife. Die
If/EndIf-Struktur wird damit jede Sekunde einmal aufgerufen. Sonst läuft
die Hauptschleife einfach nur durch.

Habe ihn auch die Adressen der Sensoren gegeben das ist denke ich mal auch noch etwas besser oder nicht.
Laß die Sensoradressen doch vor der Hauptschleife in der Initialisierungsphase
auslesen und in Arrays speichern. Dann bist du flexibler und mußt bei nem
Sensorwechsel dein Programm nicht anpassen.

Gruß
Dino
 
ja das stimmt auch wieder da hast du recht da ist man flexibler naja gut ich werde das jetzt erstmal so lassen das mit dem auslesen das kann ich dann immer noch einfügen.
Ich muss erstmal schaun wie ich die Wait Sache weg bekomme da werde ich mich morgen mal drüber machen.
 
Hi,

ja das stimmt auch wieder da hast du recht da ist man flexibler naja gut ich werde das jetzt erstmal so lassen das mit dem auslesen das kann ich dann immer noch einfügen.
Für die Programmentwicklung ist das mit den fest eingetragenen Adressen
absolut in Ordnung. Das spart Zeit und man kann sich Schritt für Schritt
zur Lösung weiterarbeiten.

Ich muss erstmal schaun wie ich die Wait Sache weg bekomme da werde ich mich morgen mal drüber machen.
Deinen Ein-Sekunden-Wait hab ich über die beiden Variablen entfernt.
Damit arbeitet der Teil im If/Endif-Konstrukt in dem 1sec-Rythmus der Sectic-Routine.

Gruß
Dino
 
so ich glaube ich habe es hinbekommen.
Es sieht zumindest so aus also er zeigt beim starten gleich die richtigen temp's an und das ohne Wait.

Code:
$regfile = "m32def.dat"
$crystal = 16000000
'$sim

Match_rom Alias &H55
Skip_rom Alias &HCC
Auslesen Alias &HBE
Messen Alias &H44

Config 1wire = Portb.0                                      'Portb.0
Dim Ds1820id(16) As Byte                                    'Anzahle sensoren 8 = 1  16 = 2 , 24 = 3 , 32 = 4
Dim Sc(9) As Byte
Dim T As Integer
Dim Anzahl As Byte
Dim Adressen As Byte
Dim Takt As Byte
Dim Takt_alt As Byte

Config Timer1 = Timer , Prescale = 1024

On Timer1 Taktgeber
Load Timer1 , 15625
Enable Interrupts
Enable Timer1
Start Timer1


Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , _
Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Initlcd
Config Lcdmode = Port
Config Lcdbus = 4
Cls

Restore Sensoren
For Anzahl = 1 To 16
   Read Ds1820id(anzahl)
Next Adresse
1wreset
1wwrite Skip_rom
1wwrite Messen                                              'Alle angeschlossenen DS1820 zum Messen veranlassen


Do
   If Takt <> Takt_alt Then
   Takt_alt = Takt
   Locate 3 , 6
   Lcd Takt
  For Adressen = 1 To 9 Step 8                              '1,9,17,25
      Incr Anzahl
      1wreset                                               '1Wire Reseten
      1wwrite &H55                                          'MATCHROM=>Adress.den DS1820 anhand des ROM Inhaltes
      1wwrite Ds1820id(adressen) , 8                        '8 Byte ID wird uebertragen
      1wwrite Auslesen                                      'READ SCATCHPAD => Liest alle Bytes des SP Memorys
      Sc(1) = 1wread(9)
      T = Makeint(sc(1) , Sc(2))                            'komprimiert zwei Bytes in die Integervariable T
      T = T / 2                                             'Temperatur in ganzen Grad ausgeben
      Locate Anzahl , 6
      Lcd "T" ; Anzahl ; "=" ; T ; " C"                     'Anzeige erfolgt so: T1=23 C
  Next Id
  Anzahl = 0
 If Takt = 0 then                                           'immer bie 0 messen ( jede Minute ) was  für meine Zwecke vollkommen ausreicht
   1wreset
   1wwrite Skip_rom
   1wwrite Messen                                           'Alle angeschlossenen DS1820 zum Messen veranlassen

   Cursor Off
   End If
Loop

End

Sensoren:
Data &H10 , &HE8 , &H5B , &HDD , &H01 , &H08 , &H00 , &HD7
Data &H10 , &H18 , &H63 , &HDD , &H01 , &H08 , &H00 , &H1F

Taktgeber:
Load Timer1 , 15625
Takt = Takt + 1
If Takt > 59 Then
Cls
End If
If Takt >= 60 Then Takt = 0

Return
 
Hallo Maikgen!

Na also.....
So langsam kommt doch Struktur rein und deine Timingprobleme sind doch auch verschwunden, oder? ;)

Was mir immer wieder auffällt, ist die Ansteuerung deiner beiden DS1820 Sensoren.

Warum fragst du den Bus vorher nicht erst einmal ab und speicherst die Romdaten der Sensoren in zwei getrennte Byte-Arrays? :hmmmm:

Danach hast du die aktuellen Daten im Programm zur Verfügung und könntest sogar später einen Sensor auswechseln, ohne das Programm neu kompilieren und einspielen zu müssen.

Hier mal die Codefragmente dazu:
Code:
Rom_data1(8) As Byte , Rom_data2(8) As Byte
........

Rom_data1(1) = 1wsearchfirst()
Rom_data2(1) = 1wsearchnext()
....


1wreset
1wwrite &H55
For I = 1 To 8
1wwrite Rom_data1(i)
Next
1wwrite &H44
Waitms 100

1wreset
1wwrite &H55
For I = 1 To 8
1wwrite Rom_data1(i)
Next
1wwrite &HBE
Waitms 100

Kannst es ja damit mal versuchen.... :)

Grüße,
Cassio
 
Ja danke das hätte ich heute versucht.
Werde ich mal schaun ob ich das hinbekomme.

Rom_data1(1) = 1wsearchfirst()
Rom_data2(1) = 1wsearchnext()
Rom_data3(1) = 1wsearchnext()
usw

wäre dann für weiter Sensoren denke ich mir jetzt mal weil im Endefeckt 4 Stück ran sollen.
 
Hallo Maikgen!

Du kannst das Ganze natürlich auch noch "automatisieren". ;)

Mit "1wirecount()" kannst du vorher den Bus abfragen und die Anzahl der Sensoren zählen.

Danach fragst du in einer Schleife die einzelnen Romdaten ab.

Beispiel:
Code:
1wc = 1wirecount()

Danach weiß dein Programm, wieviele Romdaten es auslesen muss. :)

Gruß,
Cassio
 
so nun habe ich es hinbekommen war gar net so schlimm wie ich dachte
Es ist zwar am Anfang für 1 Sekunde wieder 85C da aber das ist egal das wird ja bei Takt = 1 neu gelesen und dann steht die richtige temp da das werde ich noch suche und bestimmt auch finde wo das her kommt.
Und es ist immer noch übersichtlich finde ich :)

Code:
$regfile = "m32def.dat"
$crystal = 16000000
'$sim

Match_rom Alias &H55
Skip_rom Alias &HCC
Auslesen Alias &HBE
Messen Alias &H44

Config 1wire = Portb.0                                      'Portb.0
Dim Sc(9) As Byte
Dim T As Integer
Dim Adresse As Byte
Dim Takt As Byte , Takt_alt As Byte
Dim Menge As Byte
Dim Sensor1(8) As Byte , Sensor2(8) As Byte , Sensor3(8) As Byte , Sensor4(8) As Byte



Config Timer1 = Timer , Prescale = 1024

Declare Sub Temp

On Timer1 Taktgeber
Load Timer1 , 15625
Enable Interrupts
Enable Timer1
Start Timer1

Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , _
Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Initlcd
Config Lcdmode = Port
Config Lcdbus = 4
Cls

Sensor1(1) = 1wsearchfirst()
Sensor2(1) = 1wsearchnext()
Sensor3(1) = 1wsearchnext()
Sensor4(1) = 1wsearchnext()

'Auslesen Temp Sensoren
If Sensor1(8) = Crc8(sensor1(1) , 7) Then
 For Adresse = 1 To 8
 Lcd Hex(sensor1(adresse))
 Next
End If

If Sensor2(8) = Crc8(sensor2(1) , 7) Then
 For Adresse = 1 To 8
 Lcd Hex(sensor2(adresse))
 Next
End If

If Sensor3(8) = Crc8(sensor3(1) , 7) Then
 For Adresse = 1 To 8
 Lcd Hex(sensor3(adresse))
 Next
End If

If Sensor4(8) = Crc8(sensor4(1) , 7) Then
 For Adresse = 1 To 8
 Lcd Hex(sensor4(adresse))
 Next
End If

1wreset
1wwrite Skip_rom
1wwrite Messen
Cls


Do
Call Temp
Loop

End

Sub Temp
If Takt <> Takt_alt Then
Takt_alt = Takt
Locate 3 , 1
Lcd Takt

1wverify Sensor1(1)
       Locate 1 , 1
       If Err = 1 Then
       Lcd "1 nicht gefunden"
       Elseif Err = 0 Then
      1wwrite Auslesen
      Sc(1) = 1wread(9)
      T = Makeint(sc(1) , Sc(2))
      T = T / 2
      Locate 1 , 6
      Lcd "T1=" ; T ; " C"
End If

1wverify Sensor2(1)
       Locate 2 , 1
       If Err = 1 Then
       Lcd "2 nicht gefunden"
       Elseif Err = 0 Then
      1wwrite Auslesen
      Sc(1) = 1wread(9)
      T = Makeint(sc(1) , Sc(2))
      T = T / 2
      Locate 2 , 6
      Lcd "T2=" ; T ; " C"
End If

1wverify Sensor3(1)
       Locate 3 , 1
       If Err = 1 Then
       Lcd "3 nicht gefunden"
       Elseif Err = 0 Then
      1wwrite Auslesen
      Sc(1) = 1wread(9)
      T = Makeint(sc(1) , Sc(2))
      T = T / 2
      Locate 3 , 6
      Lcd "T3=" ; T ; " C"
End If

1wverify Sensor4(1)
       Locate 1 , 1
       If Err = 1 Then
       Lcd "4 nicht gefunden"

      Elseif Err = 0 Then
      1wwrite Auslesen
      Sc(1) = 1wread(9)
      T = Makeint(sc(1) , Sc(2))
      T = T / 2
      Locate 4 , 6
      Lcd "T4=" ; T ; " C"
End If

   If Takt = 1 Then                                         'immer bei Takt XX Messen
   1wreset
   1wwrite Skip_rom
   1wwrite Messen
   End If
   Cursor Off
   End If
   If Takt > 59 Then
   Cls
   End If
   If Takt >= 60 Then Takt = 0
End Sub Temp

Taktgeber:
Load Timer1 , 15625
Takt = Takt + 1
Return


hab den Fehler schon gefunden. muss vor dem aufruf von Temp einfach noch etwas warten dann geht es aber wie gesagt das ist egal das stört mich nicht.
Werde jetzt mal noch die DCF einfügen das die noch geht.
 
Hallo nun habe ich mein Programm eigentlich soweit wie ich es will.
denke ich mal ich habe bis jetzt in der Funktion noch keine Auffälligkeiten entdecken können.
Weis ja nicht ob ihr welche seht was ich aber denke weil ihr schon etwas mehr ahnung habt wie ich. :)

Code:
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 16
$swstack = 32
$framesize = 32
'$sim

Match_rom Alias &H55
Skip_rom Alias &HCC
Auslesen Alias &HBE
Messen Alias &H44


Dim Sc(9) As Byte
Dim T As Integer
Dim Adresse As Byte
Dim Takt As Byte , Takt_alt As Byte
Dim Menge As Byte
Dim Sensor1(8) As Byte , Sensor2(8) As Byte , Sensor3(8) As Byte , Sensor4(8) As Byte
Dim Lftag As Byte
Dim Tz As Byte
Dim Zeit As Word


Config Timer1 = Timer , Prescale = 1024

Declare Sub Temp
Declare Sub Sectic
Declare Sub Showtime_lcd()
Declare Sub Init

Config 1wire = Portb.0
Config Portd.2 = Output

Dcfpon Alias Portd.2
Idcf Alias Pind.3

Reset Portd.3
Set Dcfpon

Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , _
Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Initlcd
Cls

Config Dcf77 = Pind.3 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic
Config Date = Dmy , Separator = .

Enable Interrupts
Enable Timer1

Sensor1(1) = 1wsearchfirst()
Sensor2(1) = 1wsearchnext()
Sensor3(1) = 1wsearchnext()
Sensor4(1) = 1wsearchnext()


'Auslesen Temp Sensoren
If Sensor1(8) = Crc8(sensor1(1) , 7) Then
 For Adresse = 1 To 8
 Lcd Hex(sensor1(adresse))
 Next
End If

If Sensor2(8) = Crc8(sensor2(1) , 7) Then
 For Adresse = 1 To 8
 Lcd Hex(sensor2(adresse))
 Next
End If

If Sensor3(8) = Crc8(sensor3(1) , 7) Then
 For Adresse = 1 To 8
 Lcd Hex(sensor3(adresse))
 Next
End If

If Sensor4(8) = Crc8(sensor4(1) , 7) Then
 For Adresse = 1 To 8
 Lcd Hex(sensor4(adresse))
 Next
End If

Set Dcfpon
Reset Dcfpon

1wreset
1wwrite Skip_rom
1wwrite Messen
Cls

'*************************************************************************
'                         Hier ist das Hauptprogramm
Do
    Zeit = _hour * 100                                      'Zeit Umrechnung
    Zeit = Zeit + _min                                      'Zeit Umrechnung

    If Dcf_status.7 = 0 Then
    Locate 1 , 1
    Lcd "sync"
    Locate 2 , 1
    Lcd Time$
    Print Date$ ; "  " ; Time$
    Cursor Off
    Else
    Call Showtime_lcd()
    End If

Loop

End

'***************************************************************************
'                         Ab Hier Sind Die Unterprogramme

Sub Temp
If Takt <> Takt_alt Then
Takt_alt = Takt

1wverify Sensor1(1)
       Locate 1 , 1
       If Err = 1 Then
       Lcd "1 nicht gefunden"
       Elseif Err = 0 Then
      1wwrite Auslesen
      Sc(1) = 1wread(9)
      T = Makeint(sc(1) , Sc(2))
      T = T / 2
      Locate 3 , 1
      Lcd "In " ; T ; "C"
End If

1wverify Sensor2(1)
       Locate 2 , 1
       If Err = 1 Then
       Lcd "2 nicht gefunden"
       Elseif Err = 0 Then
      1wwrite Auslesen
      Sc(1) = 1wread(9)
      T = Makeint(sc(1) , Sc(2))
      T = T / 2
      Locate 3 , 9
      Lcd "Out " ; T ; "C"
End If

1wverify Sensor3(1)
       Locate 3 , 1
       If Err = 1 Then
       Lcd "3 nicht gefunden"
       Elseif Err = 0 Then
      1wwrite Auslesen
      Sc(1) = 1wread(9)
      T = Makeint(sc(1) , Sc(2))
      T = T / 2
      Locate 4 , 1
      Lcd "T3 " ; T ; "C"
End If

1wverify Sensor4(1)
       Locate 1 , 1
       If Err = 1 Then
       Lcd "4 nicht gefunden"

      Elseif Err = 0 Then
      1wwrite Auslesen
      Sc(1) = 1wread(9)
      T = Makeint(sc(1) , Sc(2))
      T = T / 2
      Locate 4 , 9
      Lcd "T4 " ; T ; "C"
End If

   If Takt = 1 Then                                         'immer bei Takt = XX Messen
   1wreset
   1wwrite Skip_rom
   1wwrite Messen
   End If
   Cursor Off
   'If Takt > 59 Then
   'End If
   'If Takt > 60 Then Takt = 00
   End If

End Sub Temp

Sub Showtime_lcd()
  Lftag = Dayofyear()
  Incr Lftag
  Tz = Dcf77timezone()
  Print Date$ ; " " ; Time$ ; " " ; Lftag
  Locate 1 , 1
  Lcd Date$
  Locate 1 , 10
  Lcd "Tag:" ; Lftag
  Locate 2 , 1
  Lcd Time$
  Locate 2 , 12
  Lcd Zeit
  Call Temp                                                 'Tempmessung starten
  Cursor Off
End Sub Showtime_lcd()

Sectic:
Takt = _sec
Return

Was ich noch machen will ist das er mir noch Mo - So anzeigt aber da hab ich mich noch nicht wirklich beschäftigt nur mal kurz reingeschaut wobei das ja auch nicht das große Problem sein sollte.
 
hallo wieder mal

Ich bin nun bei der PWM und er macht nicht viel

Code:
If Dimm = 2 Then
For Hochdimmen = 100 To 150
Helligkeit = Hochdimmen
End If

If Dimm = 2 Then Dimm = 0
Next


und das ist der gesamte Code.

Denke das es besser ist wenn ich die PWM Sache dann direkt noch in die Hauptschleife mache und nicht über ein Unterprogramm aufrufe.

Code:
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 16
$swstack = 32
$framesize = 32
'$sim

Match_rom Alias &H55
Skip_rom Alias &HCC
Auslesen Alias &HBE
Messen Alias &H44


Dim Sc(9) As Byte
Dim T1 As Integer , T2 As Integer , T3 As Integer , T4 As Integer
Dim Adresse As Byte
Dim Takt As Byte , Takt_alt As Byte
Dim Sensor1(8) As Byte , Sensor2(8) As Byte , Sensor3(8) As Byte , Sensor4(8) As Byte
Dim Lftag As Byte
Dim Tz As Byte
Dim Zeit As Word
Dim Wochentag As Byte                                       'Wochentag
Dim Tempdif As Integer                                      'Heizungssteuerung
Dim Hochdimmen As Byte
Dim Runterdimmen As Byte
Dim Dimm As Byte


Config Timer0 = Pwm , Compare Pwm = Clear Down , Prescale = 256
Config Timer1 = Timer , Prescale = 1024

Declare Sub Temp
Declare Sub Sectic
Declare Sub Showtime_lcd()
Declare Sub Init
Declare Sub Zeitschaltung
Declare Sub Licht

Config 1wire = Portb.0
Config Portd.2 = Output

Config Porta.4 = Output
Config Porta.5 = Output
Config Porta.5 = Output
Config Porta.5 = Output

Dcfpon Alias Portd.2
Idcf Alias Pind.3
Filter Alias Porta.4
O2 Alias Porta.5
Gross Alias Porta.6
Klein Alias Porta.7
Helligkeit Alias Ocr0                                       'Portb.3 Timer0

Reset Portd.3
Set Dcfpon

Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , _
Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Initlcd
Cls
                                                                ' Update = 1 und UPDATETIME = 4 neu eingefügt
Config Dcf77 = Pind.3 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Update = 1 , Updatetime = 4 , Gosub = Sectic
Config Date = Dmy , Separator = .

Enable Interrupts
Enable Timer1
'Enable Timer0

Sensor1(1) = 1wsearchfirst()
Sensor2(1) = 1wsearchnext()
Sensor3(1) = 1wsearchnext()
Sensor4(1) = 1wsearchnext()


'Auslesen Temp Sensoren
If Sensor1(8) = Crc8(sensor1(1) , 7) Then
 For Adresse = 1 To 8
 Lcd Hex(sensor1(adresse))
 Next
End If

If Sensor2(8) = Crc8(sensor2(1) , 7) Then
 For Adresse = 1 To 8
 Lcd Hex(sensor2(adresse))
 Next
End If

If Sensor3(8) = Crc8(sensor3(1) , 7) Then
 For Adresse = 1 To 8
 Lcd Hex(sensor3(adresse))
 Next
End If

If Sensor4(8) = Crc8(sensor4(1) , 7) Then
 For Adresse = 1 To 8
 Lcd Hex(sensor4(adresse))
 Next
End If

Set Dcfpon
Reset Dcfpon

1wreset
1wwrite Skip_rom
1wwrite Messen
Cls

'*************************************************************************
'                         Hier ist das Hauptprogramm
Do
    If Takt = 0 Then
    Cls
    End If
    Locate 2 , 11                                           'Ocr0 wert anzeigen
    Lcd Helligkeit                                           'Ocr0 wert anzeigen
    Locate 1 , 16                                           'Dimm takt
    Lcd Dimm                                                'Dimm takt

    Call Temp                                               'Tempmessung starten
    Call Zeitschaltung
    Call Licht

    Zeit = _hour * 100                                      'Zeit Umrechnung
    Zeit = Zeit + _min                                      'Zeit Umrechnung

    If Tz = 2 Then                                          'Sommer / Winterzeit ausgleich
    Zeit = Zeit - 100                                       'Sommer / Winterzeit ausgleich
    End If                                                  'Sommer / Winterzeit ausgleich
    If Dcf_status.7 = 0 Then
    Locate 1 , 1
    Lcd "Suche DCF-77"
    Locate 2 , 1
    Lcd Time$
    Print Date$ ; "  " ; Time$
    Cursor Off
    Else
    Call Showtime_lcd()
    End If

Loop

End

'***************************************************************************
'                         Ab Hier Sind Die Unterprogramme

Sub Temp
If Takt <> Takt_alt Then
Takt_alt = Takt

1wverify Sensor1(1)
       Locate 1 , 1
       If Err = 1 Then
       Lcd "1 nicht gefunden"
       Elseif Err = 0 Then
      1wwrite Auslesen
      Sc(1) = 1wread(9)
      T1 = Makeint(sc(1) , Sc(2))
      T1 = T1 / 2
      Locate 3 , 1
      Lcd "In " ; T1 ; "C"
End If

1wverify Sensor2(1)
       Locate 2 , 1
       If Err = 1 Then
       Lcd "2 nicht gefunden"
       Elseif Err = 0 Then
      1wwrite Auslesen
      Sc(1) = 1wread(9)
      T2 = Makeint(sc(1) , Sc(2))
      T2 = T2 / 2
      Locate 3 , 9
      Lcd "Out " ; T2 ; "C"
End If

1wverify Sensor3(1)
       Locate 3 , 1
       If Err = 1 Then
       Lcd "3 nicht gefunden"
       Elseif Err = 0 Then
      1wwrite Auslesen
      Sc(1) = 1wread(9)
      T3 = Makeint(sc(1) , Sc(2))
      T3 = T3 / 2
      Locate 4 , 1
      Lcd "T3 " ; T3 ; "C"
End If

1wverify Sensor4(1)
       Locate 1 , 1
       If Err = 1 Then
       Lcd "4 nicht gefunden"

      Elseif Err = 0 Then
      1wwrite Auslesen
      Sc(1) = 1wread(9)
      T4 = Makeint(sc(1) , Sc(2))
      T4 = T4 / 2
      Locate 4 , 9
      Lcd "T4 " ; T4 ; "C"
End If

   If Takt = 1 Then                                         'immer bei Takt = XX Messen
   1wreset
   1wwrite Skip_rom
   1wwrite Messen
   End If
   Cursor Off
   End If

End Sub Temp

'********************************
Sub Showtime_lcd()
  Lftag = Dayofyear()
  Incr Lftag
  Tz = Dcf77timezone()
  Print Date$ ; " " ; Time$ ; " " ; Lftag
  Locate 1 , 9
  Lcd Date$
  Locate 2 , 9
  Lcd Time$
  Wochentag = Makebcd(_weekday)                             'Wochentags anzeige
  Locate 1 , 6                                              'Wochentags anzeige
  Lcd Lookupstr(wochentag , Wochentage)                     'Wochentags anzeige
  Cursor Off
End Sub Showtime_lcd()

'*******************************
Sub Zeitschaltung

If Zeit <= 559 Then Filter = 0
If Zeit >= 600 Then Filter = 1
If Zeit >= 2200 Then Filter = 0

End Sub Zeitschaltung


Sub Licht

If Dimm = 2 Then
For Hochdimmen = 100 To 150
Helligkeit = Hochdimmen
End If

If Dimm = 2 Then Dimm = 0
Next

End Sub Licht

Sectic:
Takt = _sec
Dimm = Dimm + 1
Return

' ----- Daten für Wochentag -----
Wochentage:
Data "  " , "MO" , "DI" , "MI" , "DO" , "FR" , "SA" , "SO"

Geburtstage:

'Sollten noch eingefügt werden das diese auf dem Display angezeigt werden 3Tage bevor jemand Geburtstag hat.
'aber besser erst wenn ein größeres Display geht.
 
ich habe die PWM jetzt so hier und so dimmt sie auch eigneltich genau so wie ich will.
nur fängt sie immer wieder bei 0 an wenn sie hochgezählt hat sie soll aber eigentlich ab Helligkeit >=186 komplett dem Portb.3 einschalten und nix mehr machen.

Code:
Sub Frueh
If Dimm >= 30 Then                                          'Alle 30 Sekunden

Hochdimmen = Helligkeit + 10                                '1 Schritt heller machen
Helligkeit = Hochdimmen

If Dimm >= 30 And Helligkeit < 30 Then Dimm = 0             'Wenn Helligkeit schritt 30 erreicht hat dann
If Helligkeit >= 32 Then Dimm = 15                          'wenn Helligkeit Größer Schritt 32 dann alle 15 Sekunden heller schalten
If Helligkeit >= 54 Then Dimm = 20                          'wenn Helligkeit Größer Schritt 54 dann alle 10 Sekunden heller schalten
If Helligkeit >= 90 Then Dimm = 25                          'wenn Helligkeit Größer Schritt 90 dann alle 5 Sekunden heller schalten
If Helligkeit >= 114 Then Dimm = 27                         'wenn Helligkeit Größer Schritt 114 dann alle 3 Sekunden heller schalten
If Helligkeit >= 186 Then Dimm = 29                         'wenn Helligkeit Größer Schritt 186 dann jede Sekunde heller schalten
If Helligkeit >= 254 Then Portb.3 = 1 Portb.3               'Komplett einschalten
                                                                         'Sollte genau 30 Minuten dauern

End If
End Sub Frueh

Habe es auch schon mit Stop Timer0 versucht nach dem Voll Einschalten aber das ging auch net.
Oder muss ich wenn er die Helligkeit erreicht hat gleich in ein anderes Unterprogramm verweisen. Das Wollte ich eigentlich erst später machen.
 
nur fängt sie immer wieder bei 0 an wenn sie hochgezählt hat sie soll aber eigentlich ab Helligkeit >=186 komplett dem Portb.3 einschalten und nix mehr machen.
In deinem Code steht aber etwas anderes:

If Helligkeit >= 254 Then Portb.3 = 1 Portb.3 'Komplett einschalten

wobei die Syntax hier etwas seltsam ist. Wahrscheinlich meinst du
If Helligkeit >= 254 Then Portb.3 = 1

Dazu müsste Helligkeit aber einen Wert von 254 oder größer annehmen. Kann es sein, dass dies aufgrund des
Hochdimmen = Helligkeit + 10 '1 Schritt heller machen
Helligkeit = Hochdimmen
nie passiert?

HBA
 
ja das stimmt weis auch nicht warum sich hier aus der 1 eine 10 gewurden ist
aber er macht es auch nicht wenn da eine 1 steht.
 
so nun hab ich in die PWM noch eine Variabel eingefügt da scheint das besser zu gehn habe jetzt nur das Problem das er nochmal Hochdimmt, dann das Licht anschaltet und wieder ausschaltet.
Nur wenn die Zeit erreicht ist das er wieder in den Hochdimm Modus gehen müsste dimmt er nicht hoch. Wenn er dann die Zeit erreicht hat wenn er oben sein müsste dann schaltet er wieder voll ein.

Code:
Sub Licht

'Tagphase 1 = Hochdimmphase
If Zeit = 800 Then Tagphase = 1

If Dimm >= 30 Then                                          'Alle 30 Sekunden
  'OCR0
Helligkeit = Hochdimmen + 1                                 '1 Schritt heller machen
Hochdimmen = Helligkeit

If Dimm >= 30 Then Dimm = 0

If Dimm >= 30 And Helligkeit < 32 Then Dimm = 0             'Wenn Helligkeit schritt 30 erreicht hat dann
If Helligkeit >= 32 Then Dimm = 15                          'wenn Helligkeit Größer Schritt 32 dann alle 15 Sekunden heller schalten
If Helligkeit >= 54 Then Dimm = 20                          'wenn Helligkeit Größer Schritt 54 dann alle 10 Sekunden heller schalten
If Helligkeit >= 90 Then Dimm = 25                          'wenn Helligkeit Größer Schritt 90 dann alle 5 Sekunden heller schalten
If Helligkeit >= 114 Then Dimm = 27                         'wenn Helligkeit Größer Schritt 114 dann alle 3 Sekunden heller schalten
If Helligkeit >= 186 Then Dimm = 29                         'wenn Helligkeit Größer Schritt 186 dann jede Sekunde heller schalten
If Helligkeit >= 246 Then Tagphase = 2

End If

                                                      'Sollte genau 30 Minuten dauern
'Tagphase 2  Licht an
If Tagphase = 2 Then
     Portb.3 = 1                                            'Portb.3 Komplett einschalten
     Stop Timer0
     Helligkeit = 0
     Hochdimmen = 0
     Dimm = 0
     'Portb.3 = 1

     If Zeit = 1930 Then
     Tagphase = 3
     End If
End If

'Tagphase 3 = Runterdimmphase
If Tagphase = 3 Then
     If Zeit = 1931 Then Tagphase = 4
     'muss ich noch einfügen aber erst muss das hochdimmen wieder gehen
End If

'Tagphase 4 Nachtphase Licht aus
If Tagphase = 4 Then
      Portb.3 = 0
      Stop Timer0
     If Zeit = 800 Then
     Helligkeit = 0
     Hochdimmen = 0
     Dimm = 0
     Start Timer0
     Tagphase = 1
     End If
End If

End Sub Licht
 
Hi Maik,

so nun hab ich in die PWM noch eine Variabel eingefügt da scheint das besser zu gehn habe jetzt nur das Problem das er nochmal Hochdimmt, dann das Licht anschaltet und wieder ausschaltet.
Nur wenn die Zeit erreicht ist das er wieder in den Hochdimm Modus gehen müsste dimmt er nicht hoch. Wenn er dann die Zeit erreicht hat wenn er oben sein müsste dann schaltet er wieder voll ein.

Ich hab mal ein paar weitere Bemerkungen in deinen Code eingefügt und
teilweise etwas anders eingerückt ...


CodeBox BASCOM

Sub Licht

' ___
' / \___ Helligkeit
' 1 2 3 4 Tagphase
'
' Umschaltkriterien
' Zeit 800 -----------> TP1
' Helligkeit >= 246 --> TP2
' Zeit 1930 ----------> TP3
' Zeit 1931 ----------> TP4
'
' Dimm : x Sekunden bis zum nächsten Dimmschritt ??
'

' === Tagphase 1 = Hochdimmphase ===
If Zeit = 800 Then Tagphase = 1 ' ===> Steht hinten nochmal bei Tagphase 4 drin

If Dimm >= 30 Then 'Alle 30 Sekunden
'OCR0
Helligkeit = Hochdimmen + 1 ' 1 Schritt heller machen ( Hochdimmen=Hochdimmen+1 )
Hochdimmen = Helligkeit ' Die beiden Zeilen machen Increment (also +1)
' === Helligkeit und Hochfdimmen haben ab hier immer den selben Wert ===

If Dimm >= 30 Then Dimm = 0 ' Also bei 30 und drüber wieder bei 0 anfangen

' === der nächste Befehl wird wegen dem vorherigen nie wahr werden da bereits Dimm=0 ist ===
If Dimm >= 30 And Helligkeit < 32 Then Dimm = 0 'Wenn Helligkeit schritt 30 erreicht hat dann

If Helligkeit >= 32 Then Dimm = 15 'wenn Helligkeit Größer Schritt 32 dann alle 15 Sekunden heller schalten
If Helligkeit >= 54 Then Dimm = 20 'wenn Helligkeit Größer Schritt 54 dann alle 10 Sekunden heller schalten
If Helligkeit >= 90 Then Dimm = 25 'wenn Helligkeit Größer Schritt 90 dann alle 5 Sekunden heller schalten
If Helligkeit >= 114 Then Dimm = 27 'wenn Helligkeit Größer Schritt 114 dann alle 3 Sekunden heller schalten
If Helligkeit >= 186 Then Dimm = 29 'wenn Helligkeit Größer Schritt 186 dann jede Sekunde heller schalten
If Helligkeit >= 246 Then Tagphase = 2

End If

'Sollte genau 30 Minuten dauern
' === Tagphase 2 Licht an ===
If Tagphase = 2 Then
Portb.3 = 1 'Portb.3 Komplett einschalten
Stop Timer0
Helligkeit = 0
Hochdimmen = 0
Dimm = 0
'Portb.3 = 1

If Zeit = 1930 Then
Tagphase = 3
End If
End If


' === Tagphase 3 = Runterdimmphase ===
If Tagphase = 3 Then
If Zeit = 1931 Then Tagphase = 4
'muss ich noch einfügen aber erst muss das hochdimmen wieder gehen
End If


' === Tagphase 4 Nachtphase Licht aus ===
If Tagphase = 4 Then
Portb.3 = 0
Stop Timer0
If Zeit = 800 Then
Helligkeit = 0
Hochdimmen = 0
Dimm = 0
Start Timer0
Tagphase = 1
End If
End If

End Sub Licht

Aber irgendwie komme ich mit der einzelnen Subroutine nicht klar. :confused:
Irgendwie hast du dich glaube ich in deinem Variablenwald etwas verlaufen.

Hochdimmen und Helligkeit haben immer den selben Wert. Also warum 2
Variablen ?

Dann hast du oben Dimm auf maximal 29 begrenzt ( bei >=30 Dimm=0 ) und
damit die nächste Zeile tot geschaltet.

Timer0 scheint für das PWM zuständig zu sein.

Mit Dimm sind anscheinend die Sekunden bis zum nächsten +1 von
Helligkeit/Hochdimmen gemeint.

Was genau ist die Variable Zeit ? Uhrzeit ? Ein String oder Dezimalwert ?
800 = 8:00h ? 1930 = 19:30 ? Irgendwie etwas konfus ... Die Vergleiche
testen auf eine Zahl aber dem Wert nach könntest du eine Uhrzeit gemeint
haben.

Tut mir leid aber irgendwie steig ich da nicht so richtig durch.

Gruß
Dino
 
Ja Zeit Ist einfach eine Umrechnung der Uhrzeit um es einfacher schreiben zu können.

ja Hochdimmen = Helligkeit kann raus

Hatte das schonmal versucht aber da hat er nix mehr gemacht wer weis was da war jetzt geht es auch ohne.

Und das mit dem Dimm >= 30 Then Dimm = 0 kann auch raus,
das war noch als ich alles in der gleichen Geschwindigkeit gedimmt hatte. Aber das hab ich ja auch jetzt hinbekommen das er wenn er heller ist schneller dimmt.


Das mit dem wieder hochdimmen denke ich auch das es daran liegt das ich den Port mit ( Portb.3 = 1 ) voll anschalte muss mit Sicherheit mit ( Helligkeit = 255 ) voll anschalten
 

Ü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)