+++ Hier werde ich nach und nach alle Programme aus meiner oder mit Quellangabe fremder Hand einfügen +++

bis dahin schaut in meinen Projekten Treppenlich, Einfahrtslicht. Codeschloss und Jalousiensteuerung nach. Dort sind die Programme verlinkt... Danke für Eure Geduld.


2015 - Projekt 5-fach Lamellenjalousiensteuerung mit Antrieben

2017 - Projekt Jalousien - Updade 2017

$regfile = "m32def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
$lib "DateTime.lbx"
'$sim
'Programmversionen
'Änderungshistorie:
'V1.0  2015-10-17  Software Entwicklung + Test Hardware
'V1.1  2015-10-18  Software Entwicklung + Test Hardware
'V1.3  2015-10-19  Software Entwicklung + Test Hardware
'V1.4  2015-10-21  Software Entwicklung + Test Hardware
'V1.5  2015-10-22  Software Entwicklung + Test Hardware
'V1.6  2015-10-23  Software Entwicklung + Test Hardware
'V1.7  2015-10-23  Software Entwicklung + Test Hardware
'V1.8  2015-10-24  Software Entwicklung + Test Hardware
'V1.9  2015-10-26  Software Entwicklung + Test Hardware
'V1.10 2015-10-27  Inbetriebnahme und Montage
'V1.11 2015-11-01  Fehlerbeseitigung 1
'V1.12 2015-11-02  Fehlerbeseitigung 2
'Beginn Änderungsprotokoll
'V1.13 2015-11-08
'      > Tag/Nacht Automatik erst bei aktiver Messwerterfassung (orange LED AUS)
'      > Senken neu mit 85% PWM
'      > Laufschrift Zeile 1 LCD
'      > neue Begrüßung vor Initialisierung, dann 500ms warten für Stopp zum
'      > überspringen
'      > erste Gruppenwahl = nur Display ein und Reset Tag/Nachtblockade
'      > zweite Gruppenwahl "Alles AUS"
'V1.14 2015-11-14
'      > Veränderung der Empfindlichkeit der Sonnensensoren (um 100% gedehnt)
'      > Heben immer bis kleiner Strom nicht vorrangig nach %
'      > Pause für Stimme vor Zuschalten der Motoren, sonst hört man sie nicht
'      > neue Voiceausgabe Beschreibung aller Funktionen für die Frauen
'      > Morgendämmerung träger machen, damit nicht immer auf und zu geht
'V1.15  2015-11-19
'      > V1.14 hing an der stelle wo die Stimme ausgehen soll, bevor die Motoren
'      > zugeschaltet werden
'      > bei Kabelbruch Sonnensensoren wird der Hitzeschutz nicht aktiviert
'      > Text Berechne Helligkeit in Zeile 2 solange LCD an
'      > neuer Merker Initok erzwingt immer 10 Durchläufe von Main nach rückkehr
'      > aus Motoren und/oder LCD aus (10x200ms = ca. 2-3s)
'      > warte bei Start Init auf Voice
'      > Pwm und Motorports im Mainschleife auf 0 setzen (ausser PORTC.7)
'V1.16 2015-11-26
'      > Hitzeschutz optimiert (es gingen nicht die richtigen Jalousien zu)
'      > Text Hitzeschutz wurde unterhalb der Schwelle nicht mehr angezeigt ob-
'      > wohl er aktiv warund auch andere Textanzeigen wurden optimiert
'      > Fehler durch verketten mit OR/AND beseitigt
'      > es darf hinter einer AND - OR Bedingung immer nur noch eine Variable stehen
'V1.17 2015-12-06
'      > neu wurde der Hitzeschutz in mehrer Schließhöhen gegliedert
'V1.18 2015-12-13
'      > Korrektur IF Then für Schließhöhen 50% bei Sonnenschutz
'V1.19 2016-02-16
'      > da immer Jalousie 5 unten bleibt, mehr Anlaufstrom für saubere
'      > Relaisansteuerung (Relais 5 zieht durch zu schnelle PWM
'      > Absenkung nicht sauber an)
'      > Motorstromdiagnose für Ausfall Relais + Anzeige leichter Fehler + Motornrtxt.
'      > Vereinfachung Betriebsartenwahl (neu....)
'V1.20 2016-03-05
'      > Motorunterstromüberwachung verbessert:
'      > - kam auch bei Sonnenschutz für die Jalousiern die oben bleiben sollten
'      > - nur Überwachen wenn Endlage noch nicht erreicht ist
'      > Zeiten für Senken gerinfügig verlängert
'V1.21 2016-03-17
'      > Vierstufige 1-4h Verzögerung Jallousien am morgen da schon 5:00 hell
'      > LCD Licht bei Tastenbetätigung
'V1.22 2016-03-23
'      > Fehlerbeseitigung Messfehler Restzeit, If then Fehler Tag/Nacht
'      > LCD Zeile 2 Vorrang für wichtige Texte eingeführt
'      > Reset Gruppenauswahl über blau nicht mehr rot, damit gestoppt werden kann
'      > ohne das die Gruppenwahl zurück gesetzt wird
'      > man. Stop kann durch Stopptaste wieder aufgehoben werden
'V1.23 2016-03-26
'      > Verzögerungen Rücksetzen Hitzeschutz min 1h muss es sonnenfrei sein
'      > manueller Stop gilt nun auch für Hitzeschutz und wird über Nacht zurückgesetzt
'      > Fehlerbeseitigung Motorfehler Unterstrom bei Hitzeschutz nur wenn zwischen
'      > 10 und 90% wird Fehler erkannt
'      > Hitzeschutz gegeneinander verriegelt (mehrere Modis)
'      > Texte Hitzeschutz optimiert
'V1.24 2016-04-01
'      > Rücksetzen 100% Hitzeschutz auf 0,5h verkürzt
'      > beim Heben in Gruppen immer beide Gruppen polwenden, da sonst Rückströme
'      > zum ungewollten senken der inaktiven Gruppe führen
'      > (ggf. müssen noch entkoppel C's eingebaut werden, damit die MOSFETs nicht
'      > durch Störspannungen aktiviert werden
'V1.25 2016-05-03
'      > Nach Sonnenschutz kam es Vor dass nochmal Tag erkannt wurde und trotz offener
'      > Jalousien versucht wurde zu öffnen, daher wurden neu die Merker für Tag und Nacht
'      > in die Abfragen eingebracht
'V1.26 2016-05-08
'      > Fehler 4h Offset Tag ging nicht wegen Überlauf Variable I neu als Long
'      > Bei Reset 0% oder 99% wird neu auch Sonnenschutz zurück gesetzt
'V1.27 2016-05-14
'      > Nacht schon früher erkennen bei 6 statt 3
'      > 100% PWM Impuls für Relais Heben von 3 auf 2 Zyclen verkürzt
'      > beim Hitzeschutzsenken/heben auf 50% kam es manchmal durch Unterstrom bei 50%
'      > zur Setzung auf 0% oder 99% und dadurch zum durchlaufen der Mitte, daher wird
'      > neu Unterstromerkennung nur angewendet, wenn Hitzss oder Hitzso
'      > ungleich 1 oder 3 sind
'      > Problem Sperre Lcd2 bei man. Stop behoben (Voicez subtraierte sich < 0)
'      > Problem mit Anzeigen des Status in LCD Zeile 2 behoben (If Then Kette)
'V1.28 2016-05-18
'      > Fehler bei Restzeit Verzögerung Tag beseitigt - neu Ablauf wird Nacht aktiviert,
'      > damit beim ersten Lauf mit Restzeit überhaupt Tag oder Nacht gesetzt wird
'V1.29 2016-05-25
'      > Hitzeschutz wiederholt einschalten wird neu zeitverzögert
'      > Sondermodis mit Hitzeschutz möglich
'      > wenn man Stop lange drückt werden Sondermodi zurück gesetzt
'      > selektives Endlagenabschalten bei I < 40 I > 10mA
'      > Rücksetzen man. Hitzeschutzsperre bei Tag/Nacht Erkennung
'V1.30 2016-06-01
'      > selektives Endlagenabschalten bei I < 40 I > 10mA wird immer wurde zurück gesetzt
'      > dadurch blinkten die Ports bei Endlage - neu wird nur noch einmal das Motorportmuster
'      > gesetzt, danach kann jeder Motor selektiv abgeschaltet werden, wenn err fertig ist
'      > diverse Programmoptimierungen, da V1.29 99% des Programmspeichers belegten
'      > neu 93%
'V1.31 2016-06-05
'      > Folgefehler aus Programmoptimierung beseitigt
'      > Fehler beim Senken behoben es wurden alle versehendlich auf 99% statt 0% gesetzt

'V1.32 2016-06-19
'      > Fehler Position bei Hitzeschutz bereinigt
'      > es darf erst nach dem Heben der Hitzsch. von 1 auf 2 bzw. 3 auf 4 und
'      > umgekerht gesetzt werden
'      > in Hitzeschutz Tagman eingebaut, damit heben/senken bei Hitzsch. möglich
'      > Zeitverzögerung Hitzeschutz 50% von 1h auch 30min gesenkt
'V1.33 2016-06-30
'      > komplett neue Reedkontakte eingebaut und bei heben neu sofort wenn
'      > Strom unter 200mA fällt abschalten wegen klappern der Relais
'      > Wenn manuelle gestoppt wird nichts an den % ändern.
'      > Anzeige Hitzschutz mit Tag = 1 verknüpft
'      > Anzeige der % nun durch Tasten grün+gelb bzw. grün + rot möglich
'      > bei längerem drücken Reset der % und auch Hitzeschutz und auch Gruppenschaltungen
'V1.34 2016-07-28
'      > selektives Ausschalten im Initprogramm
'      > Restzeitanzeige Hitzeschutz eingebaut
'      > Voiceasgabe massiv vereinfacht Val direkt auf Port geht auch!
'      > leider sind zwei Motoren gestorben, da die Überstromerkennung im PWM Sanftstopp
'      > nicht funktioniert, daher wurde die Ü-Stromerkennung in dieser Zeit verändert
'V1.35 2016-09-05
'      > Überstromerkennung in den Endlagen verbessert /synchron mit PWM
'      > kompletter Umbau aller If Then Abfragen auf ohne End If
'V1.36 2016-10-24
'      > Zykluszeit heben und senekn leicht erhöht, da einige Jalousien nicht
'        vollständig bis obern/unten laufen
'      > Einstellbare Helligkeitsschwelle für 50% Hitzeschutz SO und SS, da im
'        Winter auch 84% reichen (tief stehende Sonne) durch verketten des
'        Offset  0 = 84%+86% , 1 = 85%+87%, 2 = 86%+88%
'      > Reset Hitzs bei Stop >500ms oder Kurzschluss
'V1.37 2016-12-06
'      > Offset  0 = 83%+85% , 1 = 85%+87%, 2 = 86%+88%
'      > Reset Hitzs bei Stop >500ms oder Kurzschluss nachgebessert
'V1.38 2017-03-18
'      > bei 80% bzw. 20% auf 99% bzw. 0% Endlage setzen
'      > Hitzeschutz 50% besser eingestellt damit auch in der Hälfte stehen bleibt
'      > Positionen der Jalousien in Zeile 3+4 im Wechsel zu Helligkeiten anzeigen
'      > Uhrzeit + Wochentag darstellen
'      > Wochentag an Öffnungszeit koppeln
'V1.39 2017-03-25
'      > komplett neue Untermenustruktur für grün+gelb, grün+rot, grün+gelb+rot und blau
'      > Eichungsfaktor für Uhr
'      > Hitzeparameter einstellbar
'      > Umbau Restzeiten auf Echtzeit
'      > zur Programmverkleinerung Init Programm gelöscht
'      > Uhr stark vereinfacht mit Time lbx
'      > Fehler Variablenüberlauf behoben
'V1.40 2017-03-26
'      > alle Strinvariablen umbenannt auf ...txt wegen Variablenüberschreibungen
'      > diverse Texte verändert und optimiert
'      > F4Gruppenmodis besser in Sonneneschutz integriert
'      > neu Anzeige wenn Start Sonnenschutz läuft "3min"
'V1.41 2017-03-28
'      > Timervergleich geändert nicht Timer = 180 sondern Timer > 180 weil
'      > ja die 180 schon vorbei sein kann
'      > nochmal alle Stringvariablen wegen Überlauf geprüft und wieder Texte gefunden :o(
'      > Stacks erhöht wegen Variablenüberlauf
'V1.42 2017-04-02
'      > wichtige Merker zuerst deklariert, damit sie nie überschrieben werden
'      > Programm in eine neue Datei kopiert, da viele unerklärliche Fehler
'      > auftraten und vielleicht das mit den vielen Änderungen zusammen hängt?
'V1.43 2017-04-09
'      > neue Parameter Tag/Nachtschwellen
'      > Zeit senken gekürzt da Jalousien schneller und sanftauslauf wirkungslos
'      > Reihenfolge für Ende durch Pos.verändert
'      > String Variablen am ende deklariert wegen Überlaufproblemen
'V1.44 2017-05-01
'      > Gruppenschaltung verbessert(Clear LCD rausgen, Wait 1 am Ende für Vermeidung Stop)
'      > Zeiteinstellung verbessert (Eichfaktor auf 33500 gestellt da zu schnell)
'      > Senenknzeit verlängert durch PWM Auslauf in -5 Schritten
'      > Sonneneschutz Ostseite bereinigt
'      > Motorstromgrenze bei heben nach unten auf 300mA erhöht, da bei heben aus 50% Kurzschluss
'V1.45 2017-10-15
'      > Zeitoffset am WE korrigiert - neu wird genau 9:30 geöffnet
'      > Eichfaktor korrigiert - alt 33500 neu 33550 weil geringfügig vorgegangen
'      > neu bei Kurzschluss wird fertig gehoben oder gesenkt und nur der betroffene Motor ausgeschaltet
'V1.46 2017-10-22
'      > Auslauf PWM verlängert
'V1.47 2017-11-12
'      > Eichfaktor nun + und - und von 33000 - 35000 möglich
'      > Eichfaktor wird nun in RAM geschrieben
'      > Aufgrund Speicherüberlauf Gruppenschaltungen 9-13 gelöscht (nie benutzt) neu nur 95%
'V2.00 2017-12-18
'      > Korrektur Funktionsgruppen (9-13 gelöscht)
'      > neue Abschaltlogik mit Polwendung für betroffene Gruppe, damit defekter Mosfet nicht zum 
'        Motorabbrand führt

'      > LED + Display blinkt bei Überstrom
'      > Überstrommeldung kommt statt Fehlerfreimeldung
'      > EEPROM Speicherung diverser einstellbarer Parameter, damit bei Stromausfall nichts vergessen wird

'      > Überstromspeicher je Motor, damit andere Jalousien weiter laufen können.
'      > Überstromabfall wird überwacht wenn der Strom nicht abfällt, wird ganze Motorgruppe 
'        polgewendet siehe oben

'      > Motorüberstrom als Parameter und halber Strom beim Senken
'      > neue Hardware (Freilaufdioden über Motorversorgung, blaue LEDs)
'      > Sa + So erst 9:00 öffnen
'      > Zeiten für Senken und Heben über einstellbare Parameter eingeführt
'V2.01 2018-01-05
'      > Korrektur Anzeige Kurzschlusstrom
'      > sensiblere Kurzschlusstromreaktion
'V2.02 2018-06-10
'      > Korrektur Sonnenschutz
'      > Resetzeit für Sonnenschutz auf 15 min reduziert
'      > Texte optimiert
'      > Tag Nacht Schwelle erweitert Tag: 13-30, Nacht 1-12
'V2.03 2018-06-22
'      > Tag Nacht Schwelle nochmal erweitert Tag: 10-30, Nacht 1-20
'      > reset Position bei 50% Sonnenschutz
'      > Wenn Tag < Nacht Überlappung Schwellwerte aautomatisch korrigieren
'V2.03 2018-07-05
'      > Korrektur Mittenfehler bei vielen Sonnenschutzaktionen
'V2.04 2018-07-05
'      > Korrektur Mittenfehler bei vielen Sonnenschutzaktionen
'V2.05 2018-07-15
'      > Korrektur Mittenfehler bei vielen Sonnenschutzaktionen
'V2.06 2018-07-18
'      > Korrektur Mittenfehler bei vielen Sonnenschutzaktionen
'V2.07 2018-10-21
'      > Korrektur Endlagenfehler bei vielen Sonnenschutzaktionen
'V3.00 2018-12-28
'      > Einbau Quarz
'      > neue lustige Ansagen statt Sondermodis
'      > Zeiteinstellen bei Programmierung

'************************* Bedienungsanleitung Tasten *************************
' Hauptfunktionen
' Taste grün/A: öffen (wenn alle oben passiert nichts außer Sprachausgabe)
' Taste gelb/B: schließen  (wenn alle unten passiert nichts außer Sprachausgabe)
' Taste rot/C:  globaler Stopp, Reset Gruppenauswahl, Stopp Startroutiene
' Taste blau:   kurz = Gruppen- und Automatikauswahl, lang = Erklärung per Sprache

' Untermenus
' Taste grün+gelb - Motorsteruerung:
'         Taste grün:      alle Positionen auf oben = 99% oder auf unten = 0% setzen
'         Taste gelb:      PWM Endwert Senken erhöhen
'         Taste grün+gelb: alle Merker für Hitzeschutz und Motorgruppen zurück setzen
'         Taste blau:      max. Motorstrom verstellen +
'         Taste grün+blau: Zeit für Senken erhöhen +
'         Taste grün+rot:  Zeit für Heben erhöhen +
'         Taste rot:       save and exit
' Taste grün+rot - Ührzeit und Eichung:
'         Taste grün+gelb: Wochentag ändern >Mo>Di>Mi>Do>Fr>Sa>So>Mo...
'         Taste grün:      Stunde aufwärts einstellen +
'         Taste gelb:      Minute aufwärts einstellen +
'         Taste blau:      Minute abwärts einstellen -
'         Taste grün+blau: Eichwert - = Uhr läuft langsamer
'         Taste grün+rot:  Eichwert + = Uhr läuft schneller
'         Taste rot:       save and exit
' Taste grün+blau - Helligkeitssteuerungen:
'         Taste grün:      Schwellwert für Hitzeschutz 50% erhöhen (am Ende springt er wieder auf den 
'                          tiefsten Wert zurück)

'         Taste gelb:      Schwellwert für Hitzeschutz 100% erhöhen (am Ende springt er wieder auf den 
'                          tiefsten Wert zurück)

'         Taste grün+gelb: Offset Tagschwelle (im Sommer 1-4h später als Sonnenaufgang öffnen)
'         Taste blau:      Schwellwert Nachterkennung erhöhen
'         Taste grün+blau: Hysteresewert für Hitzeschutz erhöhen (wieviel unter dem Schwellwert 
'         wird Hitzeschutz deaktiviert)

'         Taste grün+rot:  Schwellwert Tagerkennung erhöhen
'         Taste rot:       save and exit

'************** Alle Ports als Eingang oder Ausgang definieren ****************
' 0 = Eingang; 1 = Ausgang
'Ddra = &B00000000  'nicht gesetzt, da als AD Wandler definiert
Ddrb = &B00011111
Ddrc = &B11111111
Ddrd = &B10111111

'******* Alle Ports auf 0 bzw. 1 setzen für definierten Anfangszustände *******
'Bei Eingängen durch 1 den Pulldownwiderstand aktivieren
'Porta = &B00000000  'nicht gesetzt, da als AD Wandler definiert
Portb = &B11111111
Portc = &B00000000
Portd = &B00000000

'************************ analoge Eingänge einstellen *************************
Config Adc = Single , Prescaler = Auto , Reference = Aref   'Internal
Start Adc

'************************** LCD und Ports definieren **************************
Config Lcd = 20 * 4                                         'wir verwenden ein 4 x 20 Zeichen Display
' Im I/O Mode wird jeder Prozessor Pin einzeln angegeben
Config Lcdpin = Pin , Db4 = Portd., Db5 = Portd., Db6 = Portd., _
       Db7 
= Portd., E = Portd., Rs = Portd.4
Cursor Off

'************************** Timer1 konfigurieren *******************************
Config Timer1 = Timer , Prescale = 256                      'Timer konfigurieren  8000000 / 256 = 31250Hz
Enable Timer1                                               'bei 16 bit 65535 Überlauf Startwert bei 34285
On Timer1 Sekundeisr                                        'Timerüberlaufsprungmarke setzen
Enable Interrupts
Start Timer1
'************************** Timer2 konfigurieren *******************************
Config Timer2 = Pwm , Compare Pwm = Clear Down , Prescale = 8
Ocr2 = 0                                                    'PWM-Kanal c des Timer2 Vergleiswert zuweisen
Enable Timer2                                               'Start des PWM-Timers
Timer2 = 0
Start Timer2

'******************** Übersicht Speicherbereiche Variablen ********************
'Dim as Bit     = 0 bis 1
'Dim as Byte    = 0 bis 255
'Dim as Integer = -32768 bis +32767
'Dim as Word    = 0 bis 65535
'Dim as Long    = -2147483648 bis 2147483647
'Dim as Single  = 1,5 x 10^-45 bis 3,4 x 10^38
'Dim as Double  = 5,0 x 10^-324 bis 1,7 x 10^308
'Dim as String  = 254 Zeichen

'****************************** Übersicht IO **********************************
'IN/OUT     Pin       Typ      Signalname
'PA0        40        I        Motorstrom 1 (Osten 1)
'PA1        41        I        Motorstrom 2 (Osten 2)
'PA2        42        I        Motorstrom 3 (Süden 1)
'PA3        43        I        Motorstrom 4 (Süden 2)
'PA4        44        I        Motorstrom 5 (Süden 3)
'PA5        45        I        Photowiderstand Tag
'PA6        46        I        Photowiderstand Osten
'PA7        47        I        Photowiderstand Süden
'PB0        1         O        Attiny 861A PB4 SW1
'PB1        2         O        Attiny 861A PB5 SW2
'PB2        3         O        Attiny 861A PB6 SW3
'PB3        4         O        Attiny 861A PA3 SW4
'PB4        5         O        Attiny 861A PA4 SW5
'PB5        6         I        MOSI + Funk Kanal 1
'PB6        7         I        MISO +  Funk Kanal 2  zusammen mit PB7 Funk Kanal 4
'PB7        8         I        SCK +  Funk Kanal 3   zusammen mit PB6 Funk Kanal 4
'PC0        22        O        Polwendung Motor 1-3 Süden
'PC1        23        O        Polwendung Motor 4-5 Osten
'PC2        24        O        Motor 1 Süden
'PC3        25        O        Motor 2 Süden
'PC4        26        O        Motor 3 Süden
'PC5        27        O        Motor 4 Osten
'PC6        28        O        Motor 5 Osten
'PC7        29        O        URef Photo/Motorstrom + Mute + LCD Hintergrundbeleuchtung
'PD0        14        O        LCD PIN 7 DB4
'PD1        15        O        LCD PIN 8 DB5
'PD2        16        O        LCD PIN 9 DB6
'PD3        17        O        LCD PIN 10 DB7
'PD4        18        O        LCD PIN 4 RS
'PD5        19        O        LCD PIN 5 E
'PD6        20        I        Voice in Action
'PD7        21        O        PWM Offset Motoren
'****************************** Subs declarieren ******************************
Declare Sub Init
Declare Sub Main
Declare Sub Motoren
Declare Sub Motorstrom
Declare Sub Motorports
Declare Sub Voice

'********************** globale Variablen declarieren *************************
'Variablen die nicht überschrieben werden dürfen zuerst (die anderen werden stetig neu gesetzt
'Zeitmerker
Dim Wochentag As Byte                         'Merker Wochentag als Ziffer
Dim Sekunde As Long                           'Zähler für Uhrzeit
Dim Timereichg As Word                        'Merker Eichfaktor Uhrzeit
Dim Timereichgx As Eram Word                  'Merker Eichfaktor im EPROM RAM
Dim Zeit0 As Word                             'Zeitmerker0 für Tagverzögerung
Dim Zeit1 As Word                             'Zeitmerker1 für Hitzeschutz Ost
Dim Deltaz1 As Byte                           'Restsekunden bis Hitzeschutz Ost
Dim Deltaz1m As Byte                          'Restminuten bis Hitzeschutz Ost
Dim Zeit2 As Word                             'Zeitmerker2 bis Rücksetzen Hiztzeschutz Ost
Dim Zeit3 As Word                             'Zeitmerker3 für Tagverzögerung und Hitzeschutz Süd
Dim Deltaz3 As Byte                           'Restsekunden bis Hitzeschutz Süd
Dim Deltaz3m As Byte                          'Restminuten bis Hitzeschutz Süd
Dim Zeit4 As Word                             'Zeitmerker4 bis Rücksetzen Hiztzeschutz Ost

'Motorsteuerung
Dim F4grup As Byte                            'Merker Taste blau + Gruppe
Dim Firstrun As Bit                           'Merker erster Start

'Tag/Nacht
Dim Tag As Bit                                'Merker Tag
Dim Patag As Byte                             'Merker Schaltschwelle Tag
Dim Patagx As Eram Byte
Dim Nacht As Bit                              'Merker Nacht
Dim Panacht As Byte                           'Merker Schaltschwelle Nacht
Dim Panachtx As Eram Byte
Dim Offset As Byte                            'Merker Sommerzeitoffset wegen heben vor 6:00Uhr
Dim Pahysterr As Byte                         'Merker Hysterese Sonnenschutz
Dim Pahysterrx As Eram Byte
Dim Mannacht As Bit                           'Merker Manuell gehoben/gesenkt bis nächsten Tag halten
Dim Mantag As Bit                             'Merker Manuell gehoben/gesenkt bis nächsten Nacht halten

'Sonnenschutz
Dim Pahitzhalb As Byte                                      'Merker Schaltschwelle Hitzeschutz 50%
Dim Pahitzhalbx As Eram Byte
Dim Pahitzvoll As Byte                                      'Merker Schaltschwelle Hitzeschutz 100%
Dim Pahitzvollx As Eram Byte
Dim Hitzso As Byte                                          'Merker Hitzschutz Ostsonne
Dim Hitzss As Byte                                          'Merker Hitzeschutz Südsonne

'LCD
Dim Lcd2 As Bit                                             'Merker LCD Zeile 2 blockiert

'#####################################################################################################
'Merker die temp.beschrieben werden  (Verlust der Daten nicht so wichtig)
'Motorsteuernde Merker
Dim F1heb As Bit                                            'Merker Taste grün
Dim F2senk As Bit                                           'Merker Taste gelb
Dim Strom1 As Integer                                       'Meßwert Motorstrom1 (Zahl)
Dim Strom2 As Integer                                       'Meßwert Motorstrom2 (Zahl)
Dim Strom3 As Integer                                       'Meßwert Motorstrom3 (Zahl)
Dim Strom4 As Integer                                       'Meßwert Motorstrom4 (Zahl)
Dim Strom5 As Integer                                       'Meßwert Motorstrom5 (Zahl)
Dim Pos1 As Byte                                            'Positionszähler Jalousie1 (0 = unten)
Dim Pos2 As Byte                                            'Positionszähler Jalousie2 (Zahl, 0 = unten)
Dim Pos3 As Byte                                            'Positionszähler Jalousie3 (Zahl, 0 = unten)
Dim Pos4 As Byte                                            'Positionszähler Jalousie4 (Zahl, 0 = unten)
Dim Pos5 As Byte                                            'Positionszähler Jalousie5 (Zahl, 0 = unten)
Dim Ende As Bit                                             'Merker Ende für Motorsteuerung
Dim Abbruch As Bit                                          'Merker manueller Abbruch
Dim Kurzs As Bit                                            'Merker Überstrom
Dim Kurzs1 As Byte                                          'Merker Überstrom Motor 1
Dim Kurzs2 As Byte                                          'Merker Überstrom Motor 1
Dim Kurzs3 As Byte                                          'Merker Überstrom Motor 1
Dim Kurzs4 As Byte                                          'Merker Überstrom Motor 1
Dim Kurzs5 As Byte                                          'Merker Überstrom Motor 1
Dim Motorfehler As Bit                                      'Merker ein Motor geht nicht
Dim Pahebet As Byte                                         'Merker Hebezeit 50
Dim Pahebetx As Eram Byte
Dim Pasenkt As Byte                                         'Merker Senkzeit 5
Dim Pasenktx As Eram Byte
Dim Papwmsenk As Byte
Dim Papwmsenkx As Eram Byte

'Helligkeiten
Dim Tagnacht As Integer                                     'Helligkeit Tag/Nacht
Dim Osonne As Integer                                       'Helligkeit Ostsonne
Dim Ssonne As Integer                                       'Helligkeit Südsonne
Dim Osonnetemp As Byte                                      'Helligkeit Ostsonne temporär zur Mittelwertbildung
Dim Ssonnetemp As Byte                                      'Helligkeit Südsonne temporär zur Mittelwertbildung

'temporäre Zähler
Dim I As Byte                                               'Zähler in PWM Modul
Dim J As Long                                               'Zähler Tagverzögerung
Dim K As Long                                               'Zähler Resthitzschutz Ost
Dim L As Long                                               'Zähler Resthitzschutz Süd
Dim Z As Byte                                               'Zähler Motorstrommessung zur Glättung
Dim T1 As Byte                                              'Zähler Laufschrift Zeile 1 immer 20 +1

'PWM Steuerung
Dim Pwm As Byte                                             'PWM Tastverhältnis 255 = 0% !!!!
Dim Pwm1 As Integer                                         'PWM umgerechnet in %
Dim Kurzstrpwm As Long                                      'an Pwm angepasste Kurzschlussstromschwelle
Dim Pakurzs As Word                                         'Parameter Kurzschlussstromschwelle
Dim Pakurzsx As Eram Word

'Spachausgabe
Dim File As Byte                                            'Merker Voicedateinummer
Dim Voicez As Byte                                          'Timer Voicenachlauf

'LCD Ansteuerung
Dim Blkurzs As Bit                                          'Merker für blinkenden Text Kurzschluss
Dim Blzeile4 As Byte                                        'Merker für blinkenden Text Zeile 4

'String Variablen wegen Überlauf am Ende
Dim Wotagtx As String * 3                                   'Merker Wochentag als Text
Dim Zeittxt As String * 8                                   'Textmerker für Anzeige Zeit
Dim Zeit1txt As String * 2                                  'Restsekunden bis Hitzeschutz Ost als Text für LCD
Dim Zeit3txt As String * 2                                  'Restsekunden bis Hitzeschutz Süd als Text für LCD
Dim Restzeittxt As String * 8                               'Restzeit bis verzögerter Tag als Text für LCD
Dim Resthsotxt As String * 2                                'Restminuten bis Hitzeschutz Ost zurück gesetzt wird
Dim Resthsstxt As String * 2                                'Restminuten bis Hitzeschutz Süd zurück gesetzt wird
Dim Strom1txt As String * 3                                 'Meßwert Motorstrom1 (Text, Format 000)
Dim Strom2txt As String * 3                                 'Meßwert Motorstrom2 (Text, Format 000)
Dim Strom3txt As String * 3                                 'Meßwert Motorstrom3 (Text, Format 000)
Dim Strom4txt As String * 3                                 'Meßwert Motorstrom4 (Text, Format 000)
Dim Strom5txt As String * 3                                 'Meßwert Motorstrom5 (Text, Format 000)
Dim Pos1txt As String * 2                                   'Positionszähler Jalousie1 (Text, Format00)
Dim Pos2txt As String * 2                                   'Positionszähler Jalousie2 (Text, Format00)
Dim Pos3txt As String * 2                                   'Positionszähler Jalousie3 (Text, Format00)
Dim Pos4txt As String * 2                                   'Positionszähler Jalousie4 (Text, Format00)
Dim Pos5txt As String * 2                                   'Positionszähler Jalousie5 (Text, Format00)
Dim Motornrtxt As String * 10                               'Motornummern
Dim Tagnachtxt As String * 2                                'String für Helligkeit Tag/Nacht in %
Dim Osonnetxt As String * 2                                 'String für Helligkeit Ostsonne in %
Dim Ssonnetxt As String * 2                                 'String für Helligkeit Südsonne in %
Dim Pwmtxt As String * 3                                    'PWM (Text, Format 000)
Dim Lcdz1txt As String * 20                                 'String für LCD Zeile 1
Dim Lcdz2txt As String * 20                                 'String für LCD Zeile 2
Dim Lcdz3txt As String * 20                                 'String für LCD Zeile 3
Dim Lcdz4txt As String * 20                                 'String für LCD Zeile 4
Dim Textz1txt As String * 255                               'Laufschrift LCD Zeile 1
Dim Offsettxt As String * 20                                'Merker Sommerzeitoffset als Text für LCD

'Schutzvariable für Überlaufprobleme
Dim Schutz As String * 30

'***************** Initialisiserung Position + Helligkeit *********************
 Sub Init
'Reset weitere Variablen
 F1heb = 0
 F2senk = 0
 F4grup = 0
 Tag = 0
 Nacht = 0
 Tagnacht = 0
 Tagnachtxt = "??"
 Osonne = 0
 Osonnetxt = "??"
 Ssonne = 0
 Ssonnetxt = "??"
 Hitzso = 0
 Hitzss = 0
 File = 20
 Mantag = 0
 Mannacht = 0
 T1 = 0
 Motorfehler = 0
 Kurzs = 0
 Kurzs1 = 0
 Kurzs2 = 0
 Kurzs3 = 0
 Kurzs4 = 0
 Kurzs5 = 0
 I = 0
 J = 0
 K = 0
 L = 0
 Offsettxt = "Lichtsensoren Tag+0h"
 Offset = 0
 Lcd2 = 1
 'alle Positionen auf 99% = offen setzten
 Pos1 = 99
 Pos2 = 99
 Pos3 = 99
 Pos4 = 99
 Pos5 = 99
 Pos1txt = "??"
 Pos2txt = "??"
 Pos3txt = "??"
 Pos4txt = "??"
 Pos5txt = "??"
 Strom1 = 0
 Strom2 = 0
 Strom3 = 0
 Strom4 = 0
 Strom5 = 0
 Strom1txt = "  0"
 Strom2txt = "  0"
 Strom3txt = "  0"
 Strom4txt = "  0"
 Strom5txt = "  0"
 Motornrtxt = "- - - - - "
 Wochentag = 7
 Sekunde = 0
 Sekunde = 18 * 60
 Sekunde = Sekunde + 40
 Sekunde = Sekunde * 60
 Firstrun = 0
 Zeit0 = 0
 Zeit1 = 0
 Zeit2 = 0
 Zeit3 = 0
 Zeit4 = 0

 'ERAM Parameter lesen
 'Eichfaktor
 If Timereichgx < 34200 Or Timereichgx > 34350 Then Timereichgx = 34285    '>34285< +31250 = 65535
 'Tagschwelle
 If Patagx > 30 Then Patagx = 15
 'Nachtschwelle
 If Panachtx > 20 Then Panachtx = 5
 'Hitzeschwelle50%
 If Pahitzhalbx > 99 Then Pahitzhalbx = 84
 'Hitzeschwelle100%
 If Pahitzvollx > 99 Then Pahitzvollx = 85
 'Hysterese Hitzeschutz
 If Pahysterrx > 5 Then Pahysterrx = 0
 'Kurschlussschwelle in mA
 If Pakurzsx > 415 Then Pakurzsx = 380
 'Faktor Hebezeit
 If Pahebetx > 99 Then Pahebetx = 45
 'Faktor Senkzeit
 If Pasenktx > 30 Then Pasenktx = 10
  'Faktor Senkpwm
 If Papwmsenkx > 245 Then Papwmsenkx = 240

'LCD Beleuchtung für Init ein
'Vertärker ein und alle Motorports und PWM aus
 Portc.= 0
 Pwm = 0
 Ocr2 = Pwm
 Call Voice
 Lcdz1txt = "System Start V3.00"
 Lcdz2txt = "Softwareanalyse..."
 Lcdz3txt = "Hartwarediagnose.."
 Lcdz4txt = "Motoren+Sensoren.."

'LCD Initialisieren
 Cls
 Locate 1 , 1                                               'Cursor auf 1 Zeile, 1. Zeichen
 Lcd Lcdz1txt
 Waitms 1500
 Locate 2 , 1                                               'Cursor auf 2 Zeile, 1. Zeichen
 Lcd Lcdz2txt
 Waitms 1500
 Lcdz2txt = Lcdz2txt + "OK"
 Locate 2 , 1                                               'Cursor auf 2 Zeile, 1. Zeichen
 Lcd Lcdz2txt
 Locate 3 , 1                                               'Cursor auf 3 Zeile, 1. Zeichen
 Lcd Lcdz3txt
 Waitms 1500
 Lcdz3txt = Lcdz3txt + "OK"
 Locate 3 , 1                                               'Cursor auf 3 Zeile, 1. Zeichen
 Lcd Lcdz3txt
 Waitms 1500
 Locate 4 , 1                                               'Cursor auf 4 Zeile, 1. Zeichen
 Lcd Lcdz4txt
 Waitms 1500
 Lcdz4txt = Lcdz4txt + "OK"
 Locate 4 , 1                                               'Cursor auf 4 Zeile, 1. Zeichen
 Lcd Lcdz4txt
 Waitms 1500
 Call Main
 End Sub

'==============================================================================
'==============================================================================
'==============================================================================
'****************** Hauptprogramm Tasten und Helligkeit ***********************
'Test:
Sub Main
 Portc.= 0
 Voicez = 100

'Reset Zähler und Lcd2Merker
 I = 0
 J = 0
 Lcd2 = 1

 'Main Schleife!!!
 Do
      'Parameter aus ERAM holen, falls verloren oder unplausible Werte aus ERAM holen
       Timereichg = Timereichgx
       Patag = Patagx
       Panacht = Panachtx
       Pahitzhalb = Pahitzhalbx
       Pahitzvoll = Pahitzvollx
       Pahysterr = Pahysterrx
       Pakurzs = Pakurzsx
       Pasenkt = Pasenktx
       Pahebet = Pahebetx
       Papwmsenk = Papwmsenkx

      'Überlauf Timer begrenzen
       If Zeit0 > 18000 Then Zeit0 = 0                      '5h reset Zähler für temporäre Zeitzähler0
       If Zeit1 > 18000 Then Zeit1 = 0                      '5h reset Zähler für temporäre Zeitzähler1
       If Zeit2 > 18000 Then Zeit2 = 0                      '5h reset Zähler für temporäre Zeitzähler2
       If Zeit3 > 18000 Then Zeit3 = 0                      '5h reset Zähler für temporäre Zeitzähler3
       If Zeit4 > 18000 Then Zeit4 = 0                      '5h reset Zähler für temporäre Zeitzähler4

      'alle Motor-Ports ausschalten außer PortC7=Voice/LCD/Uref
       Portc.= 0
       Portc.= 0
       Portc.= 0
       Portc.= 0
       Portc.= 0
       Portc.= 0
       Portc.= 0

      'Pwm auf 0% setzen
       Pwm = 0
       Ocr2 = Pwm

      'Nachlauf Verstärker und LCD Licht
      'Uref = 5VDC/Verstärker AUS
      'Abfrage Helligkeit Für Nachlauf Verstärker / Lcd Licht Unterdrücken
       If Voicez > 1 Then
         If Voicez < 6 Then Portc.= 1
           Voicez = Voicez - 1
           Lcd2 = 1
           If Tag = 0 And Nacht = 0 And Kurzs = 0 And Motorfehler = 0 Then
             If Voicez > 60 Then
               Lcd2 = 0
               Lcdz2txt = "lese Lichtsensoren  "
               Portc.= 0
               Goto Ohelligkeit
             End If
             If Voicez < 60 And Voicez > 55 Then
               Lcd2 = 0
               Portc.= 1
             End If
             If Voicez < 50 And Voicez > 30 Then
               Lcd2 = 0
               Lcdz2txt = "Analyse Tag/Nacht/So"
               Portc.= 0
                Goto Ohelligkeit
             End If
             If Voicez < 30 Then
               Lcd2 = 1
               Portc.= 1
             End If
           Else
             Goto Ohelligkeit
           End If
       Else
         Voicez = 0
         Portc.= 1
       End If

      'Eingänge Helligkeit auswerten
      'Tag oder Nacht abfragen
       Tagnacht = Getadc(5)
       Tagnacht = Tagnacht - 1024                   'Wert negieren, da 5V = Nacht = 0%
       Tagnacht = Tagnacht / -10                    'Wert durch -10 damit Wert positiv und von 0-102
       'If Tagnacht > 99 Then Tagnacht = 99         'Wert auf 99 begrenzen 0-5V in 100 Schritten
       'If Tagnacht < 1 Then Tagnacht = 0
       Tagnachtxt = Str(tagnacht)                   'Zahl in String umwandeln
       Tagnachtxt = Format(tagnachtxt , " 0")       'gleitendes Leerzeichen statt Vornullen

      'starke Sonne von Ostseite (Jalousien M5 und M4) abfragen
      'zwei mal messen wegen Mittelwert
       Osonne = Getadc(6)
       Osonne = Osonne + Getadc(6)
       Osonne = Osonne / 2
       Osonne = Osonne - 1024                   '-1024 = 100% 0 = 0%
       Osonne = Osonne / -2                     'Wert durch -2 damit Wert positiv und gedehnt wird
       'If Osonne < 1 Then Osonne = 0           '0-99% sind demnach 5-2,5 V  in 100 Schritten                         'das ganze wurde geändert, da sonst zu unempfindlich
       'If Osonnetemp > 99 Then Osonnetemp = 99
       Osonne = Osonnetemp + Osonne
       Osonne = Osonne \ 2
       Osonnetemp = Osonne
       Osonnetxt = Str(osonne)
       Osonnetxt = Format(osonnetxt , " 0")

      'starke Sonne von Südseite (Jalousien M3, M2 und M1) abfragen
       Ssonne = Getadc(7)
       Ssonne = Ssonne + Getadc(7)
       Ssonne = Ssonne / 2
       Ssonne = Ssonne - 1024
       Ssonne = Ssonne / -2
       'If Ssonne < 1 Then Ssonne = 0
       'If Ssonne > 99 Then Ssonne = 99
       Ssonne = Ssonnetemp + Ssonne
       Ssonne = Ssonne \ 2
       Ssonnetemp = Ssonne
       Ssonnetxt = Str(ssonne)
       Ssonnetxt = Format(ssonnetxt , " 0")

       Ohelligkeit:


      'Kurzschlusserkennung ausgeben oder Laufschrift erste Zeile
       If Kurzs = 1 Then
         Lcd2 = 0
         If Blkurzs = 0 Then
           Lcdz1txt = "Jalousien-Steuerung "
           Lcdz2txt = "                    "
           Lcdz3txt = " Motorstrom zu hoch "
           Lcdz4txt = "                    "
           Blkurzs = 1
           Elseif Blkurzs = 1 Then
             Lcdz2txt = "!!SCHWERER FEHLER!! "
             Lcdz4txt = " " + Strom5txt + " " + Strom4txt + " " + Strom3txt + " " + _
                        Strom2txt 
+ " " + Strom1txt
             Blkurzs = 0
             Portc.= 0
         End If
       End If

      'Motorfehler ausgeben oder Laufschrift erste Zeile
       If Motorfehler = 1 And Kurzs = 0 Then
         Lcd2 = 0
         If Blkurzs = 0 Then
           Lcdz1txt = "Jalousien-Steuerung "
           Lcdz2txt = "                    "
           Lcdz3txt = "kein Motorstrom an  "
           Lcdz4txt = "                    "
           Blkurzs = 1
           Elseif Blkurzs = 1 Then
             Lcdz2txt = "!!leichter Fehler!! "
             Lcdz4txt = "Motornr.  " + Motornrtxt
             Blkurzs = 0
         End If
       End If

      'Bei keinem Fehler Laufschrift 1. Zeile  max. 255 Zeichen
       If Kurzs = 0 And Motorfehler = 0 Then
         If Voicez < 50 Then Lcd2 = 1
         'Laufschrift 1. Zeile  max. 255 Zeichen
         Textz1txt = "Jalousien-Steuerung + Programmversion V3.00 + erst"       'die ersten 50 Zeichen
         Textz1txt = Textz1txt + "ellt von Ralf Domschke + Funktionen + Taste A/gn=h"       '100 Zeichen
         Textz1txt = Textz1txt + "eben + B/ge=senken + C/rt=Stopp/Mute + D/blau=LCD-"       '150 Zeichen
         Textz1txt = Textz1txt + "-Ein/AUS/Gruppenwahl/lang=Sprachinfo + gnge=Pos, +"       '200 Zeichen
         Textz1txt = Textz1txt + " + gnrt=Zeit + gnbl=Hitzs./Offset + Jalousien-Steuerung " '255 Zeichen
         If T1 < 235 Then T1 = T1 + 1 Else T1 = 1
         Lcdz1txt = Mid(textz1txt , T1 , 20)
         'Informationen in Zeile 3 und 4 wechseln lassen
         If Blzeile4 < 30 Then
           If Panacht > 9 Then Offsettxt = "Tag >" Else Offsettxt = "Tag  >"
           Offsettxt = Offsettxt + Str(patag) + "%  Nacht <" + Str(panacht) + "%"
           If Blzeile4 < 20 Then Offsettxt = "Tag+" + Str(offset) + "h Hitz." + _
           
Str(pahitzhalb) + "|" + Str(pahitzvoll) + "%-" + Str(pahysterr)
           Lcdz3txt = Offsettxt
           Lcdz4txt = "SO:" + Osonnetxt + "% SS:" + Ssonnetxt + "% TN:" + Tagnachtxt + "%"
         End If
         If Blzeile4 > 29 And Blzeile4 < 41 Then
           Lcdz3txt = "Jalousien-Positionen"
           Lcdz4txt = " " + Pos5txt + "% " + Pos4txt + "% " + Pos3txt + "% " + Pos2txt + _
                      
"% " + Pos1txt + "%"
         End If
         Blzeile4 = Blzeile4 + 1
         If Blzeile4 > 40 Then Blzeile4 = 1
       End If

'Eingang 1 Heben Funkkanal1 /Taste grün auswerten
       If Pinb.= 0 And Pinb.= 1 And Pinb.= 1 And Kurzs = 0 And F4grup <> 1 Then
         Portc.= 0                                        'LCD Beleuchtung an
         Voicez = 100
         F1heb = 1
         F2senk = 0
         File = 1
         Call Voice
         If Tag = 1 Then
           Mantag = 1
           Mannacht = 0
           Hitzso = 0
           Hitzss = 0
           Elseif Nacht = 1 Then
             Mannacht = 1
             Mantag = 0
         End If
         'Warte bis Taste losgelassen wurde
         Loslassh:
         Waitms 100
         If Pinb.= 0 Then Goto Loslassh
         Goto Los
       End If

'Eingang 2 Senken Funkkananl2 /Taste gelb auswerten
       If Pinb.= 0 And Pinb.= 1 And Pinb.= 1 And Kurzs = 0 And F4grup <> 1 Then
         Portc.= 0                                        'LCD Beleuchtung an
         Voicez = 100
         F1heb = 0
         F2senk = 1
         File = 2
         Call Voice
         If Tag = 1 Then
           Mantag = 1
           Mannacht = 0
           Hitzso = 0
           Hitzss = 0
           Elseif Nacht = 1 Then
             Mannacht = 1
             Mantag = 0
         End If
         'Warte bis Taste losgelassen wurde
         Loslass:
         Waitms 100
         If Pinb.= 0 Then Goto Loslass
         Goto Los
       End If

'Eingang 3 Stop Funkkanal3 /Taste rot auswerten
      'Reset für manuell getroffene Gruppenschaltungen
      'Reset aller Motorports
       If Pinb.= 0 And Pinb.= 1 And Pinb.= 1 Then
         Portc.= 0                                        'LCD Beleuchtung an
         Voicez = 100
         F1heb = 0
         F2senk = 0
         Kurzs = 0
         Kurzs1 = 0
         Kurzs2 = 0
         Kurzs3 = 0
         Kurzs4 = 0
         Kurzs5 = 0
         Lcd2 = 1
         Motorfehler = 0
         Lcd2 = 0
         Motornrtxt = "- - - - - "
         Portc = &B00000000
         Ocr2 = 0
         Pwm = 0
         File = 3
         F4grup = 0
         Call Voice
         Lcdz2txt = "!!manueller  Stopp!!"
         Locate 2 , 1
         Lcd Lcdz2txt
         Waitms 1000
         If Pinb.= 0 And Pinb.= 1 And Pinb.= 1 Then
         Hitzso = 0
         Hitzss = 0
          'Wenn beim aut. lange Heben Stop gedrückt wird, wird bis zum nächsten
          'Abend nicht wieder aut. gehoben  und wenn schon man Stop gesetz wird das wieder aufgehoben
           If Tag = 1 And Mantag = 0 Then
             Mantag = 1
             Lcdz2txt = "Standy - Tag nur man"
             Elseif Nacht = 1 And Mannacht = 0 Then
               Mannacht = 1
               Lcdz2txt = "Standby - Nacht man."
               Elseif Tag = 1 And Mantag = 1 Then
                 Mantag = 0
                 Mannacht = 0
                 Lcdz2txt = "Standy - Tag autom. "
                 Elseif Nacht = 1 And Mannacht = 1 Then
                   Mannacht = 0
                   Mantag = 0
                   Lcdz2txt = "Standy - Nacht autom"
           End If
           'LCD zurücksetzen und neu schreiben
           Cls
           Locate 1 , 1
           Lcd Lcdz1txt
           Locate 2 , 1
           Lcd Lcdz2txt
           Locate 3 , 1
           Lcd Lcdz3txt
           Locate 4 , 1
           Lcd Lcdz4txt
         End If
         F4grup = 0
         'Warte bis Taste losgelassen wurde
         Loslasst:
         Waitms 100
         If Pinb.= 0 And Voicez > 1 Then Goto Loslasst
       End If

'Eingang 4 Gruppen Funkkanal4 /Taste blau auswerten / neu Beschreibung aufsagen
       If Pinb.= 0 And Pinb.= 0 And Pinb.= 1 And F1heb = 0 And F2senk = 0 And Kurzs = 0 Then
         Locate 1 , 1
         Lcd "halten f.Erklaerung "
         Mantag = 0
         Mannacht = 0
         Portc.= 0                                        'LCD Beleuchtung an
         Voicez = 100
         Waitms 800
         'Ansage aller Funktionen wenn lange gedrückt
         If F4grup = 0 And Pinb.= 0 And Pinb.= 0 And Pinb.= 1 Then
           'bei langem Drücken kommt neu eine ausführliche Sprachprogrammbeschreibung
           'für meine Frauen, die aber durch nochmaliges Drücken unterbrogen werden kann.
           File = 21
           Call Voice
         End If
         Loslassg:
         Waitms 1000
         If F4grup = 0 Then
           Lcdz2txt = "Tag/Nacht Automatic "
           Lcdz3txt = "mit Hitzeschutz S+O "
         End If
         If F4grup = 1 Then
           Lcdz2txt = "alles ausser Betrieb"
           Lcdz3txt = "Motoranst. gesperrt "
         End If
         If F4grup = 2 Then
           Lcdz2txt = "Tag/Nacht Automatic "
           Lcdz3txt = "ohne Hitzeschutz SO "
         End If
         If F4grup > 2 Then
           Lcdz2txt = "manuelle Steuerung  "
           If F4grup = 4 Then Lcdz3txt = " Motor M5 Ostseite  "
           If F4grup = 5 Then Lcdz3txt = " Motor M4 Ostseite  "
           If F4grup = 6 Then Lcdz3txt = " Motor M3 Suedseite "
           If F4grup = 7 Then Lcdz3txt = " Motor M2 Suedseite "
           If F4grup = 8 Then Lcdz3txt = " Motor M1 Suedseite "
         End If
         'LCD temp Texte schreiben
         Locate 1 , 1
         Lcd "bl>Autom/Gruppenwahl"
         Locate 2 , 1
         Lcd Lcdz2txt
         Locate 3 , 1
         Lcd Lcdz3txt
         Locate 4 , 1
         Lcd "Save mit roter Taste"
         'Funktionsgruppen hochzählen wenn blau gedrückt
         If Pinb.= 0 And Pinb.= 0 Then
           Voicez = 100
           F4grup = F4grup + 1
           If F4grup = 9 Then F4grup = 0
           File = 4
           If F4grup > 1 Then File = 3 + F4grup             '
           If F4grup <> 1 Then Call Voice
           Hitzss = 0
           Hitzso = 0
         End If
         Voicez = Voicez - 1
         'erst wenn rot gedrückt wird Ausstieg
         If Voicez > 1 Then
           If Pinb.= 1 Or Pinb.= 0 Then Goto Loslassg
           Waitms 1000
         End If
       End If

'Eingang 5 (Grün+gelb) - Motoren
      '- alles auf 0% setzen gelb loslassen
      '- alles auf 99% setzen grün loslassen
      '- Gruppenschaltung und Hiztzeschutz reseten
      '- Parameter Kurzschlussstrom ändern
      '- Parameter Senkzeit ändern
      '- Parameter Hebezeit ändern
      '- Parameter PWM Senken ändern

       If Pinb.= 0 And Pinb.= 0 And Pinb.= 1 Then
          Portc.= 0                                       'LCD Beleuchtung an
          Voicez = 100
          'LCD temp Texte schreiben
          Lcdz1txt = "G 0>99>0 G&Y-RHitzG "
          Lcdz2txt = "G&R ZeitH G&B ZeitS "
          Lcdz3txt = " " + Pos5txt + "% " + Pos4txt + "% " + Pos3txt + "% " + Pos2txt + _
                     
"% " + Pos1txt + "%"
          Lcdz4txt = "Y PWM B Strom R Exit"
          Cls
          Locate 1 , 1
          Lcd Lcdz1txt
          Locate 2 , 1
          Lcd Lcdz2txt
          Locate 3 , 1
          Lcd Lcdz3txt
          Locate 4 , 1
          Lcd Lcdz4txt
          Loslass5:
          Waitms 1000
          If Pinb.= 0 And Pinb.= 0 And Pinb.= 1 Then Goto Loslass5
          Loslass5a:
          Waitms 100
          'nur GN Positionen auf 99% = oben oder unten setzen
          If Pinb.= 0 And Pinb.= 1 And Pinb.= 1 Then
            If Lcdz3txt = "  0%  0%  0%  0%  0%" Then
              Pos1 = 99
              Pos2 = 99
              Pos3 = 99
              Pos4 = 99
              Pos5 = 99
              Pos1txt = "99"
              Pos2txt = "99"
              Pos3txt = "99"
              Pos4txt = "99"
              Pos5txt = "99"
              Lcdz3txt = " 99% 99% 99% 99% 99%"
            Else
              Pos1 = 0
              Pos2 = 0
              Pos3 = 0
              Pos4 = 0
              Pos5 = 0
              Pos1txt = " 0"
              Pos2txt = " 0"
              Pos3txt = " 0"
              Pos4txt = " 0"
              Pos5txt = " 0"
              Lcdz3txt = "  0%  0%  0%  0%  0%"
            End If
            Voicez = 100
          End If
          'GN+GE Reset Gruppenschaltung + Hitzeschutz
          If Pinb.= 0 And Pinb.= 0 And Pinb.= 1 Then
            F4grup = 0
            Osonne = 0
            Ssonne = 0
            Hitzss = 0
            Hitzso = 0
            Voicez = 100
            Lcdz2txt = "F4G= " + Str(f4grup) + " HSS= " + Str(hitzss) + " HSO= " + Str(hitzso)
          End If
          'nur GE PWM Rate für Senken erhöhen
          If Pinb.= 1 And Pinb.= 0 And Pinb.= 1 Then
            If Papwmsenk < 246 Then Papwmsenk = Papwmsenk + 1 Else Papwmsenk = 200
            Lcdz2txt = "PWM senken: " + Str(papwmsenk) + " %  +"
            Voicez = 100
          End If
          'BL Kurzschlussstrom erhöhen
          If Pinb.= 1 And Pinb.= 0 And Pinb.= 0 Then
            If Pakurzs < 416 Then Pakurzs = Pakurzs + 1 Else Pakurzs = 300
            Lcdz2txt = "Motorstrom: " + Str(pakurzs) + " mA +"
            Voicez = 100
          End If
          'GN+BL Senkzeit erhöhen
          If Pinb.= 0 And Pinb.= 0 And Pinb.= 0 Then
            If Pasenkt < 31 Then Pasenkt = Pasenkt + 1 Else Pasenkt = 1
            Lcdz2txt = "Senkzeit: " + Str(pasenkt) + " ms/Zykl"
            Voicez = 100
          End If
          'GN+RT Hebezeit erhöhen
          If Pinb.= 0 And Pinb.= 1 And Pinb.= 0 Then
            If Pahebet < 100 Then Pahebet = Pahebet + 1 Else Pahebet = 20
            Lcdz2txt = "Hebezeit: " + Str(pahebet) + " ms/Zykl"
            Voicez = 100
          End If
         'LCD aktuelle Texte schreiben
          If Voicez < 70 Then Lcdz2txt = "G&R ZeitH G&B ZeitS "
          Locate 2 , 1
          Lcd Lcdz2txt
          Locate 3 , 1
          Lcd Lcdz3txt
          Voicez = Voicez - 1
          If Voicez > 1 Then
            If Pinb.= 0 Or Pinb.= 0 Or Pinb.= 1 Then Goto Loslass5a
             Waitms 1000
          End If
          Pakurzsx = Pakurzs
          Pasenktx = Pasenkt
          Pahebetx = Pahebet
          Papwmsenkx = Papwmsenk
       End If

'Eingang 6 grün+rot - Zeit
      '- Stunden / Minuten / Woche /Eichfaktor einstellen
       If Pinb.= 0 And Pinb.= 1 And Pinb.= 0 Then
         Portc.= 0                                        'LCD Beleuchtung an
         Voicez = 100
         'LCD temp Texte schreiben
         Lcdz1txt = "G&Y Tag+ G hh+ Y mm+"
         Lcdz2txt = ">Mo>Mi>So>  " + Zeittxt
         Lcdz3txt = "Eich G&B- G&R+:" + Str(timereichg)
         Lcdz4txt = "B mm- Red Save+Exit "
         Cls
         Locate 1 , 1
         Lcd Lcdz1txt
         Locate 2 , 1
         Lcd Lcdz2txt
         Locate 3 , 1
         Lcd Lcdz3txt
         Locate 4 , 1
         Lcd Lcdz4txt
         Loslass6:
         Waitms 100
         If Pinb.= 0 And Pinb.= 1 And Pinb.= 0 Then Goto Loslass6
           Loslass6a:
           Waitms 300
           'Wochentag einstellen grün+gelb
           If Pinb.= 0 And Pinb.= 0 And Pinb.= 1 Then
             Naechstertag:
             Wochentag = Wochentag + 1
             If Wochentag = 8 Then Wochentag = 1
             If Wochentag = 1 Then Lcdz3txt = "Wochentag >Montag<  "
             If Wochentag = 2 Then Lcdz3txt = "Wochentag >Dienstag<"
             If Wochentag = 3 Then Lcdz3txt = "Wochentag >Mittwoch<"
             If Wochentag = 4 Then Lcdz3txt = "Wochentag Donnerstag"
             If Wochentag = 5 Then Lcdz3txt = "Wochentag >Freitag< "
             If Wochentag = 6 Then Lcdz3txt = "Wochentag >Samstag< "
             If Wochentag = 7 Then Lcdz3txt = "Wochentag >Sonntag< "
             Waitms 200
           End If
          'Stunde einstellen - grün
           If Pinb.= 0 And Pinb.= 1 And Pinb.= 1 Then
             Sekunde = Sekunde + 3600
             If Sekunde > 86399 Then Sekunde = Sekunde - 86400  '86400s = 24h damit Minuten erhalten bleiben
             Zeittxt = Time(sekunde)
             Lcdz2txt = "Set+ Stunde " + Zeittxt
             Voicez = 100
           End If
           'Minute einstellen - gelb vor
           If Pinb.= 1 And Pinb.= 0 And Pinb.= 1 Then
             Sekunde = Sekunde + 60
             If Sekunde > 86399 Then Sekunde = Sekunde - 86400
             Zeittxt = Time(sekunde)
             Lcdz2txt = "Set+ Minute " + Zeittxt
             Voicez = 100
           End If
           'Minute einstellen - blau zurück
           If Pinb.= 1 And Pinb.= 0 And Pinb.= 0 Then
             Sekunde = Sekunde - 60
             If Sekunde < 0 Then Sekunde = 86400 + Sekunde
             Zeittxt = Time(sekunde)
             Lcdz2txt = "Set- Minute " + Zeittxt
             Voicez = 100
           End If
           'Timereichung- grün+blau
           If Pinb.= 0 And Pinb.= 0 And Pinb.= 0 Then
             Timereichg = Timereichg - 1
             If Timereichg < 34200 Then Timereichg = 34200
             Lcdz3txt = "Eichfaktor-    " + Str(timereichg)
             Voicez = 100
           End If
           'Timereichung+ grün+rot
           If Pinb.= 0 And Pinb.= 1 And Pinb.= 0 Then
             Timereichg = Timereichg + 1
             If Timereichg > 34350 Then Timereichg = 34350
             Lcdz3txt = "Eichfaktor+    " + Str(timereichg)
             Voicez = 100
           End If
           'LCD Texte schreiben
           If Voicez < 60 Then Lcdz3txt = "Eich G&B- G&R+:" + Str(timereichg)
           Locate 2 , 1
           Lcd Lcdz2txt
           Locate 3 , 1
           Lcd Lcdz3txt
           Voicez = Voicez - 1
           'Schleife nur wenn rot allein gedrückt wird Ausstieg
           If Voicez > 1 Then
             If Pinb.= 0 Or Pinb.= 0 Or Pinb.= 1 Then Goto Loslass6a
              Waitms 1000
           End If
           Timereichgx = Timereichg                         '>34285< +31250 = 65535
       End If

'Eingang 7 gn+bl  oder gn+ge+rt - Helligkeitsteuerungen
      '- Tagverzögerung, Hitzeschutz und Tagnachtschwellen einstellen
       If Pinb.= 0 And Pinb.= 0 And Pinb.= 0 Then
         Portc.= 0                                        'LCD Beleuchtung an
         Voicez = 100
         'LCD temp Texte schreiben
         Lcdz1txt = "Hitzesc G=50% Y=100%"
         Lcdz2txt = "G+Y=Off G+R=Tag BL=N"
         Lcdz3txt = Offsettxt
         Lcdz4txt = "G+B=Hy Red Save+Exit"
         Cls
         Locate 1 , 1
         Lcd Lcdz1txt
         Locate 2 , 1
         Lcd Lcdz2txt
         Locate 3 , 1
         Lcd Lcdz3txt
         Locate 4 , 1
         Lcd Lcdz4txt
         Loslass7:
         Waitms 100
         If Pinb.= 0 And Pinb.= 0 And Pinb.= 0 Then Goto Loslass7
         Loslass7a:
         Waitms 300
         'Schaltschwelle Tag einstellen - grün + rot
         If Pinb.= 0 And Pinb.= 1 And Pinb.= 0 Then
           Patag = Patag + 1
           If Patag = 31 Then Patag = 10
           If Patag <= Panacht Then Patag = Panacht + 1
           Voicez = 100
           If Panacht > 9 Then Offsettxt = "Tag >" Else Offsettxt = "Tag  >"
           Offsettxt = Offsettxt + Str(patag) + "%  Nacht <" + Str(panacht) + "%"
           Goto Lcdhalten
           'Schaltschwelle Nacht einstellen - gelb + rot
           Elseif Pinb.= 1 And Pinb.= 0 And Pinb.= 0 Then
             Panacht = Panacht + 1
             If Panacht = 21 Then Panacht = 10
             If Patag <= Panacht Then Panacht = Patag - 1
             Voicez = 100
             If Panacht > 9 Then Offsettxt = "Tag >" Else Offsettxt = "Tag  >"
             Offsettxt = Offsettxt + Str(patag) + "% - Nacht <" + Str(panacht) + "%"
             Goto Lcdhalten
         End If
         'Offset einstellen - grün+gelb
         If Pinb.= 0 And Pinb.= 0 And Pinb.= 1 Then
           Offset = Offset + 1
           Voicez = 100
           Goto Lcdoffsethitz
           'Hitzeschutzschwelle 50% einstellen - grün
           Elseif Pinb.= 0 And Pinb.= 1 And Pinb.= 1 Then
             Pahitzhalb = Pahitzhalb + 1
             If Pahitzhalb = 99 Then Pahitzhalb = 70
             Voicez = 100
             Goto Lcdoffsethitz
             'Hitzeschutzschwelle 100% einstellen - gelb
             Elseif Pinb.= 1 And Pinb.= 0 And Pinb.= 1 Then
               Pahitzvoll = Pahitzvoll + 1
               If Pahitzvoll = 99 Then Pahitzvoll = 70
               Voicez = 100
               Goto Lcdoffsethitz
         End If
         'Hysterese einstellen - grün+blau
         If Pinb.= 0 And Pinb.= 0 And Pinb.= 0 Then
           Pahysterr = Pahysterr + 1
           Voicez = 100
           Goto Lcdoffsethitz
         End If
         Goto Lcdhalten
         Lcdoffsethitz:
         If Pahysterr > 5 Then Pahysterr = 0
         If Offset > 4 Then Offset = 0
         Offsettxt = "Tag+" + Str(offset) + "h Hitz." + Str(pahitzhalb) + "|" + _
         
Str(pahitzvoll) + "%-" + Str(pahysterr)
         Lcdhalten:
         'LCD Texte schreiben
         Lcdz3txt = Offsettxt
         Locate 3 , 1
         Lcd Lcdz3txt
         Voicez = Voicez - 1
         If Voicez > 1 Then
           If Pinb.= 0 Or Pinb.= 0 Or Pinb.= 1 Then Goto Loslass7a
           Waitms 1000
         End If
         Patagx = Patag
         Panachtx = Panacht
         Pahitzhalbx = Pahitzhalb
         Pahitzvollx = Pahitzvoll
         Pahysterrx = Pahysterr
       End If
'Ende Eingaben
'#########################################################################################################
'Auswertungen
       If Kurzs = 0 And Voicez < 40 Then
         'Auswertung ob Nacht und automatisch senken
          If Tagnacht < Panacht And F4grup <> 1 And Nacht = 0 And Mannacht = 0 Then
            If Firstrun = 0 Then
              Pos1 = 0
              Pos2 = 0
              Pos3 = 0
              Pos4 = 0
              Pos5 = 0
              Pos1txt = " 0"
              Pos2txt = " 0"
              Pos3txt = " 0"
              Pos4txt = " 0"
              Pos5txt = " 0"
            End If
            J = 0
            Firstrun = 1
            F2senk = 1
            F1heb = 0
            File = 12
            Tag = 0
            Nacht = 1
            Mantag = 0
            Motorfehler = 0
            Hitzso = 0
            Hitzss = 0
            Zeit0 = 0
            Zeit1 = 0
            Zeit3 = 0
            Call Voice
            Goto Los
          End If
         'Auswertung ob wieder Tag und automatisch öffnen
          If Tagnacht > Patag And F4grup <> 1 And Tag = 0 And Mantag = 0 Then
            If Firstrun = 0 Then
              Pos1 = 99
              Pos2 = 99
              Pos3 = 99
              Pos4 = 99
              Pos5 = 99
              Pos1txt = "99"
              Pos2txt = "99"
              Pos3txt = "99"
              Pos4txt = "99"
              Pos5txt = "99"
              Firstrun = 1
            End If
            If Offset = 0 And Wochentag < 6 Then
              Elseif Offset = 1 And Wochentag < 6 And Zeit0 < 3600 Then
                J = 3600 - Zeit0                            '3600s = 1h
                Goto Restzeit
                Elseif Offset = 2 And Wochentag < 6 And Zeit0 < 7200 Then
                  J = 7200 - Zeit0                          '7200s = 2h
                  Goto Restzeit
                  Elseif Offset = 3 And Wochentag < 6 And Zeit0 < 10800 Then
                    J = 10800 - Zeit0                       '10800s = 3h
                    Goto Restzeit
                    Elseif Offset = 4 And Wochentag < 6 And Zeit0 < 14400 Then
                      J = 14400 - Zeit0                     '14400s = 4h
                      Goto Restzeit
                      Elseif Wochentag > 5 And Sekunde < 34200 Then
                        J = 34200 - Sekunde                 '32400 = 9:00 Uhr
                        Goto Restzeit
            End If
              Offsettxt = "Tag+" + Str(offset) + "h Hitzs." + Str(pahitzhalb) _
                         
+ "|" + Str(pahitzvoll) + "%-" + Str(pahysterr)
              J = 0
              Tag = 1
              Hitzso = 0
              Hitzss = 0
              Nacht = 0
              Mannacht = 0
              If Mantag = 1 Then Goto Ohnerestzeit
              F1heb = 1
              F2senk = 0
              File = 13
              Motorfehler = 0
              Zeit0 = 0
              Zeit1 = 0
              Zeit3 = 0
              Call Voice
              Goto Los
            Restzeit:
            If J > 0 Then Restzeittxt = Time(j)
            Offsettxt = "Oeffnen in  " + Restzeittxt
            Lcdz3txt = Offsettxt
            Tag = 0
            Nacht = 1
            Ohnerestzeit:
          Else
            If Tagnacht <= Patag Then Zeit0 = 0
          End If

         'Hitzeschutz Ostseite für 50% setzen
          If Tag = 1 And Mantag = 0 And Osonne > Pahitzhalb And Hitzso = 0 Then
            If Zeit1 > 179 Then                             '180s = 3min mindestens 3 Minuten Sonne
              Resthsotxt = "??"
              F2senk = 1
              F1heb = 0
              Hitzso = 1
              Zeit1 = 0
              File = 14
              If Zeit3 > 179 Then
                Resthsstxt = "??"
                Hitzso = 1
                File = 2
                Zeit3 = 0
              End If
              Call Voice
              Goto Los
            End If
          Else
            If Hitzso < 2 Then Zeit1 = 0
          End If
          'Hitzeschutz Ostseite für 100% setzen
          If Tag = 1 And Mantag = 0 And Osonne > Pahitzvoll And Hitzso = 2 Then
            If Zeit1 > 179 Then                             '180s = 3min mindestens Sonne
              Resthsotxt = "??"
              F2senk = 1
              F1heb = 0
              Hitzso = 3
              Zeit1 = 0
              File = 14
              Pos4 = 60
              Pos5 = 60
              If Zeit3 > 179 Then
                Hitzso = 3
                File = 2
                Zeit3 = 0
              End If
              Call Voice
              Goto Los
            End If
          Else
            If Hitzso > 1 Then Zeit1 = 0
          End If
          'Wenn durch Gruppenschaltung Ostseite abgewählt dann Timer für Hitzeschutz auf 0 setzen
          If Tag = 1 Then
            If F4grup <> 0 Then Zeit1 = 0
          End If
         'Hitzeschutz Ostseite zurücksetzen (bei null = nacht oder Kabelbruch nicht mehr!)
          If Pahysterr > 0 Then Pahitzhalb = Pahitzhalb - Pahysterr
          If Tag = 1 And Mantag = 0 And Osonne < Pahitzhalb And Hitzso = 2 Then
            If Zeit2 < 901 Then
              K = 960 - Zeit2                               '960-901 = 60/60 = 1
              K = K / 60
              Resthsotxt = Str(k)
              Resthsotxt = Format(resthsotxt , " 0")
            End If
            If Zeit2 > 960 Then                             '960s = 16min
              K = 0
              F1heb = 1
              F2senk = 0
              Hitzso = 1
              Zeit2 = 0
              File = 15
              Pos4 = 30
              Pos5 = 30
              If Pahysterr > 0 Then Pahitzhalb = Pahitzhalb + Pahysterr
              Call Voice
              Goto Los
            End If
          Else
            If Hitzso < 3 Then Zeit2 = 0
          End If
          If Pahysterr > 0 Then Pahitzhalb = Pahitzhalb + Pahysterr
          'Hitzeschutz Ostseite auf 50% zurücksetzen (bei null = nacht oder Kabelbruch nicht mehr!)
          If Pahysterr > 0 Then Pahitzvoll = Pahitzvoll - Pahysterr
          If Tag = 1 And Mantag = 0 And Osonne < Pahitzvoll And Hitzso = 4 Then
            If Zeit2 < 901 Then
              K = 960 - Zeit2                               '1800-901 = 60/60 = 1
              K = K / 60
              Resthsotxt = Str(k)
              Resthsotxt = Format(resthsotxt , " 0")
            End If
            If Zeit2 > 960 Then                             '960s = 16min
              K = 0
              F1heb = 1
              F2senk = 0
              Hitzso = 3
              Zeit2 = 0
              File = 15
              Pos4 = 0
              Pos5 = 0
               If Pahysterr > 0 Then Pahitzvoll = Pahitzvoll + Pahysterr
              Resthsotxt = "??"
              Call Voice
              Goto Los
            End If
          Else
            If Hitzso > 2 Then Zeit2 = 0
          End If
          If Pahysterr > 0 Then Pahitzvoll = Pahitzvoll + Pahysterr
         'Hitzeschutz Südseite für 50% setzen
          If Tag = 1 And Mantag = 0 And Ssonne > Pahitzhalb And Hitzss = 0 Then
            If Zeit3 > 179 Then                             '180s = 3min mindestens Sonne
              Resthsstxt = "??"
              F2senk = 1
              F1heb = 0
              Hitzss = 1
              Zeit3 = 0
              File = 16
              Call Voice
              Goto Los
            End If
          Else
            If Hitzss < 2 Then Zeit3 = 0
          End If
          'Hitzeschutz Südseite für 100%  setzen
          If Tag = 1 And Mantag = 0 And Ssonne > Pahitzvoll And Hitzss = 2 Then
            If Zeit3 > 179 Then                             '180s = 3min mindestens 3 Minuten Sonne
              Resthsstxt = "??"
              F2senk = 1
              F1heb = 0
              Hitzss = 3
              Zeit3 = 0
              File = 16
              Pos1 = 60
              Pos2 = 60
              Pos3 = 60
              Call Voice
              Goto Los
            End If
          Else
            If Hitzss > 1 Then Zeit3 = 0
          End If
          'Wenn durch Gruppenschaltung Südseite abgewählt, dann Timer für Hitzeschutz auf 0 setzen
          If Tag = 1 Then
            If F4grup <> 0 Then Zeit3 = 0
          End If

         'Hitzeschutz Südseite zurücksetzen  (bei null = nacht oder Kabelbruch nicht mehr!)
          If Pahysterr > 0 Then Pahitzhalb = Pahitzhalb - Pahysterr
          If Tag = 1 And Mantag = 0 And Ssonne < Pahitzhalb And Hitzss = 2 Then
            If Zeit4 < 901 Then
              L = 960 - Zeit4                               '960-901 = 60/60 = 1
              L = L / 60
              Resthsstxt = Str(l)
              Resthsstxt = Format(resthsstxt , " 0")
            End If
            If Zeit4 > 960 Then                             '960s = 16min
              L = 0
              F2senk = 0
              F1heb = 1
              Hitzss = 1
              Zeit4 = 0
              File = 17
              Pos1 = 30
              Pos2 = 30
              Pos3 = 30
              If Pahysterr > 0 Then Pahitzhalb = Pahitzhalb + Pahysterr
              Call Voice
              Goto Los
            End If
          Else
           If Hitzss < 3 Then Zeit4 = 0
          End If
          If Pahysterr > 0 Then Pahitzhalb = Pahitzhalb + Pahysterr
          'Hitzeschutz Südseite auf 50% zurücksetzen  (bei null = nacht oder Kabelbruch nicht mehr!)
          If Pahysterr > 0 Then Pahitzvoll = Pahitzvoll - Pahysterr
          If Tag = 1 And Mantag = 0 And Ssonne < Pahitzvoll And Hitzss = 4 Then
            If Zeit4 < 901 Then
              L = 960 - Zeit4                               '960-901 = 60/60 = 1
              L = L / 60
              Resthsstxt = Str(l)
              Resthsstxt = Format(resthsstxt , " 0")
            End If
            If Zeit4 > 960 Then                             '960s = 16min
              L = 0
              F2senk = 0
              F1heb = 1
              Hitzss = 3
              Zeit4 = 0
              File = 17
              Pos1 = 0
              Pos2 = 0
              Pos3 = 0
              If Pahysterr > 0 Then Pahitzvoll = Pahitzvoll + Pahysterr
              Resthsstxt = "??"
              Call Voice
              End If
          Else
            If Hitzss > 2 Then Zeit4 = 0
          End If
      End If

      If Pahysterr > 0 Then Pahitzvoll = Pahitzvoll + Pahysterr
      Los:
      'Final LCD Texte generieren
      'Nur in bestimmten Modis wird dieser Text angezeigt
      If Lcd2 = 1 Then
         Wotagtx = "?? "
         If Wochentag = 1 Then Wotagtx = "Mo "
         If Wochentag = 2 Then Wotagtx = "Di "
         If Wochentag = 3 Then Wotagtx = "Mi "
         If Wochentag = 4 Then Wotagtx = "Do "
         If Wochentag = 5 Then Wotagtx = "Fr "
         If Wochentag = 6 Then Wotagtx = "Sa "
         If Wochentag = 7 Then Wotagtx = "So "
         If Tag = 1 And F4grup <> 1 And Mantag = 0 Then Lcdz2txt = "Tag auto " + Wotagtx + Zeittxt
         If Zeit1 > 0 And Voicez < 1 Then
           If Deltaz1 > 59 Then
             Deltaz1m = Deltaz1 / 60
             Deltaz1m = Deltaz1m + 1
             Zeit1txt = Str(deltaz1m)
             Lcdz2txt = "Ost in " + Zeit1txt + "min " + Zeittxt
           Else
             Zeit1txt = Str(deltaz1)
             Zeit1txt = Format(zeit1txt , " 0")
             Lcdz2txt = "Ost in " + Zeit1txt + "s  " + Zeittxt
           End If
         End If
         If Zeit3 > 0 And Voicez < 1 Then
           If Deltaz3 > 59 Then
             Deltaz3m = Deltaz3 / 60
             Deltaz3m = Deltaz3m + 1
             Zeit3txt = Str(deltaz3m)
             Lcdz2txt = "Sud in " + Zeit3txt + "min " + Zeittxt
             If Zeit1 > 0 Then Lcdz2txt = "O|S " + Zeit1txt + "|" + Zeit3txt + " min " + Zeittxt
           Else
             Zeit3txt = Str(deltaz3)
             Zeit3txt = Format(zeit3txt , " 0")
             Lcdz2txt = "Sud in " + Zeit3txt + "s  " + Zeittxt
             If Zeit1 > 0 Then Lcdz2txt = "O|S " + Zeit1txt + "|" + Zeit3txt + " s " + Zeittxt
           End If
         End If
         If Tag = 1 And F4grup <> 1 And Mantag = 1 Then Lcdz2txt = "Tag man. " + Wotagtx + Zeittxt
         If Nacht = 1 And F4grup <> 1 And Mannacht = 0 Then Lcdz2txt = "Nachtaut " + Wotagtx + Zeittxt
         If Nacht = 1 And F4grup <> 1 And Mannacht = 1 Then Lcdz2txt = "Nachtman " + Wotagtx + Zeittxt
         If Nacht = 1 And F4grup <> 1 And J > 0 Then Lcdz2txt = "bald Tag " + Wotagtx + Zeittxt
         If Tag = 0 And Nacht = 0 Then Lcdz2txt = "Analyse Tag/Nacht/So"
         If Tag = 1 And Nacht = 1 Then Lcdz2txt = "Analyse Tag/Nacht/So"
         If Hitzso = 2 And Hitzss = 0 Then Lcdz2txt = "50% Hitzes.Ost " + Resthsotxt + "min"
         If Hitzso = 4 And Hitzss = 0 Then Lcdz2txt = "100% Hitze.Ost " + Resthsotxt + "min"
         If Hitzss = 2 And Hitzso = 0 Then Lcdz2txt = "50% Hitze.Sued " + Resthsstxt + "min"
         If Hitzss = 4 And Hitzso = 0 Then Lcdz2txt = "100% Hitz.Sued " + Resthsstxt + "min"
         If Hitzso = 2 And Hitzss = 2 Then Lcdz2txt = "50%Hitz.O|S " + Resthsotxt + "|" + Resthsstxt + "min"
         If Hitzso = 4 And Hitzss = 4 Then Lcdz2txt = "100%HitzO|S " + Resthsotxt + "|" + Resthsstxt + "min"
         If Hitzso = 2 And Hitzss = 4 Then Lcdz2txt = "50% O 100%S " + Resthsotxt + "|" + Resthsstxt + "min"
         If Hitzso = 4 And Hitzss = 2 Then Lcdz2txt = "100%O 50% S " + Resthsotxt + "|" + Resthsstxt + "min"
         If Hitzso = 2 And Hitzss = 0 And Mantag = 1 Then Lcdz2txt = "50% Hitzes.Sued man."
         If Hitzss = 2 And Hitzso = 0 And Mantag = 1 Then Lcdz2txt = "50% Hitzes.Sued man."
         If Hitzso = 4 And Hitzss = 0 And Mantag = 1 Then Lcdz2txt = "100% Hitzes.Ost man."
         If Hitzss = 4 And Hitzso = 0 And Mantag = 1 Then Lcdz2txt = "100%Hitzes.Sued man."
         If F4grup = 1 Then Lcdz2txt = "alles ausser Betrieb"
      End If
      'Refresh LCD Display
       Locate 1 , 1                                         'Cursor auf 1 Zeile, 1. Zeichen
       Lcd Lcdz1txt
       Locate 2 , 1                                         'Cursor auf 2 Zeile, 1. Zeichen
       Lcd Lcdz2txt
       Locate 3 , 1                                         'Cursor auf 3 Zeile, 1. Zeichen
       Lcd Lcdz3txt
       Locate 4 , 1                                         'Cursor auf 4 Zeile, 1. Zeichen
       Lcd Lcdz4txt
      'Wenn heben oder senken ohne Kurzschluss angewählt wurde und die Sprachausgabe beendet ist
      'zu Unterprogramm Motorenreglung springen und zuvor nochmal die Gruppenschaltung ansagen
       If F1heb = 1 And F2senk = 1 Then
         F1heb = 0
         F2senk = 0
       End If
       If F1heb = 1 Or F2senk = 1 Then
         If Kurzs = 0 And Pinb.= 1 And F4grup <> 1 Then
           Endevoices:
           Waitms 100
           'wenn Sprache beendet dann Motoren ein, sonst hört man nix
           If Pind.= 0 Then Call Motoren Else Goto Endevoices
         End If
       End If

 'Zeitgesteuerte Sonderansagen
 '20:15 es ist Fernsehzeit
 If Sekunde = 72900 Then File = 24
 '23:15 es ist Werktags und du solltest ins Bett gehen
 'If Wochentag < 6 And Sekunde = 83700 Then File = 25
 '00:00 Es Ist Mitternacht
 If Sekunde = 0 Then File = 26
 '23:45 Bist Du Schon Eingeschlafen
 If Sekunde = 83700 Then File = 27
 '21:00 Hura Es Ist Freitag
 If Wochentag = 5 And Sekunde = 75600 Then File = 28
 '22:30 So Ein Mist das WE ist vorbei
 If Wochentag = 7 And Sekunde = 81000 Then File = 29
 '21:30 Du solltest mal mit dem Hund gehen
 If Sekunde = 77400 Then File = 30
 '23:00 Handy laden nicht vegessen
 If Sekunde = 82800 Then File = 31
 If File > 23 Then Call Voice

 Waitms 100
Loop
End Sub


'==============================================================================
'==============================================================================
'==============================================================================
'*********************** Unterprogramm Motorsteuerung *************************
Sub Motoren
'Reset Zähler PWM
 I = 1
 J = 0

'LCD feste Texte schreiben um bei PWM Zeit zu sparen
 If F1heb = 1 Then
   If F4grup < 4 Then Lcdz1txt = "Heben aktiv - alle  "     'alle
   If Hitzso = 1 Then Lcdz1txt = "Aufheben Hitzs. Ost "     'M5+M4
   If Hitzss = 1 Then Lcdz1txt = "Aufheben Hitzs. Sued"     'M3+M2+M1
   If Hitzso = 3 Then Lcdz1txt = "Reduzierung Hitzs.O "     'M5+M4
   If Hitzss = 3 Then Lcdz1txt = "Reduzierung Hitzs.S "     'M3+M2+M1
   If Hitzso = 1 And Hitzss = 1 Then Lcdz1txt = "Aufheben Hitzs. alle"       'alle
   If Hitzso = 3 And Hitzss = 3 Then Lcdz1txt = "Reduzierung Hitzs.SO"       'alle
   If F4grup = 4 Then Lcdz1txt = "Heben aktiv  M5 Ost "
   If F4grup = 5 Then Lcdz1txt = "Heben aktiv  M4 Ost "
   If F4grup = 6 Then Lcdz1txt = "Heben aktiv  M3 Sued"
   If F4grup = 7 Then Lcdz1txt = "Heben aktiv  M2 Sued"
   If F4grup = 8 Then Lcdz1txt = "Heben aktiv  M1 Sued"
 End If
 If F2senk = 1 Then
   If F4grup < 4 Then Lcdz1txt = "Senken aktiv - alle "     'alle
   If Hitzso = 1 Then Lcdz1txt = "Senken 50% Hitzs.Ost"     'M5+M4
   If Hitzss = 1 Then Lcdz1txt = "Senken 50%Hitzs.Sued"     'M3+M2+M1
   If Hitzso = 3 Then Lcdz1txt = "Senken 100%Hitzs.Ost"     'M5+M4
   If Hitzss = 3 Then Lcdz1txt = "Senken 100%Hitzs.Sue"     'M3+M2+M1
   If Hitzso = 1 And Hitzss = 1 Then Lcdz1txt = "Aufheben Hitzs. alle"       'alle
   If Hitzso = 3 And Hitzss = 3 Then Lcdz1txt = "Reduzierung Hitzs.SO"       'alle
   If F4grup = 4 Then Lcdz1txt = "Senken aktiv M5 Ost "
   If F4grup = 5 Then Lcdz1txt = "Senken aktiv M4 Ost "
   If F4grup = 6 Then Lcdz1txt = "Senken aktiv M3 Sued"
   If F4grup = 7 Then Lcdz1txt = "Senken aktiv M2 Sued"
   If F4grup = 8 Then Lcdz1txt = "Senken aktiv M1 Sued"
 End If
 Lcdz3txt = "Strom in mA  PWM  0%"
 Locate 1 , 1                                               'Cursor auf 1 Zeile, 1 Spalte
 Lcd Lcdz1txt
 Locate 3 , 1                                               'Cursor auf 3 Zeile, 1 Spalte
 Lcd Lcdz3txt

'Motorenports mit PWM nur einmalig ansteuern
 Call Motorports


'==============================================================================
'Hauptschleife für PWM und Motorsteuerung
  Do
      'Wenn heben angefordert...
      If F1heb = 1 And F2senk = 0 Then
        'Position zählen
        If Pos1 < 99 Then Pos1 = Pos1 + Portc.2
        If Pos2 < 99 Then Pos2 = Pos2 + Portc.3
        If Pos3 < 99 Then Pos3 = Pos3 + Portc.4
        If Pos4 < 99 Then Pos4 = Pos4 + Portc.5
        If Pos5 < 99 Then Pos5 = Pos5 + Portc.6
        'Motorströme lesen
        Call Motorstrom
        'PWM für Anlauf heben und steigern auf 100% und für Endlage senken
        If I = 1 Then Pwm = 200
        If Pwm < 251 And Ende = 0 Then Pwm = Pwm + 5
        If Ende = 1 And Pwm > 190 Then Pwm = Pwm - 5
        'Tastverhältis 100% da heben
        Ocr2 = Pwm
        Ocr2 = Pwm
        'Faktor zur Anpassung Hebezeit
        Waitms Pahebet
        'Erkennung ob Jalousien oben (reine Zeitbegrenzung)
        If Ende = 0 Then
          If F4grup < 4 Then
            'Stop vor vollständig oben bei Hitzeschutz 50%
            If Hitzss = 3 Then
              If Pos1 > 35 Or Pos2 > 35 Or Pos3 > 35 Then Ende = 1
            End If
            If Hitzso = 3 Then
              If Pos4 > 35 Or Pos5 > 35 Then Ende = 1
            End If
            If Pos1 > 97 And Pos2 > 97 And Pos3 > 97 And Pos4 > 97 And Pos5 > 97 Then Ende = 1
          End If
          If F4grup = 4 And Pos5 > 97 Then Ende = 1
          If F4grup = 5 And Pos4 > 97 Then Ende = 1
          If F4grup = 6 And Pos3 > 97 Then Ende = 1
          If F4grup = 7 And Pos2 > 97 Then Ende = 1
          If F4grup = 8 And Pos1 > 97 Then Ende = 1
        End If
        'falls alle Motoren abgeschaltet < 200mA und PWM > 45%, dann müssen die
        'Jalousien alle oben sein
        If Strom1 < 150 And Strom2 < 150 And Strom3 < 150 And Strom4 < 150 And _
        
Strom5 < 150 And I > 10 Then Ende = 1

        'vorzeitiges Abschalten einzelner Jalousien wenn früher fertig
        If Portc.= 1 And I > 10 And Strom1 < 150 Or Pos1 > 98 Then Portc.= 0
        If Portc.= 1 And I > 10 And Strom2 < 150 Or Pos2 > 98 Then Portc.= 0
        If Portc.= 1 And I > 10 And Strom3 < 150 Or Pos3 > 98 Then Portc.= 0
        If Portc.= 1 And I > 10 And Strom4 < 150 Or Pos4 > 98 Then Portc.= 0
        If Portc.= 1 And I > 10 And Strom5 < 150 Or Pos5 > 98 Then Portc.= 0
       'Heben erfolgreich abgeschlossen
        If Ende = 1 And Pwm < 215 Then
          Pwm = 0
          File = 22
          Call Voice
        End If
      End If

      '===============================================================================
      'Wenn Senken angefordert
      If F2senk = 1 And F1heb = 0 Then
        'Position zählen (nur die Jalousien zählen die auch bewegt werden)
        If Pos1 > 0 Then Pos1 = Pos1 - Portc.2
        If Pos2 > 0 Then Pos2 = Pos2 - Portc.3
        If Pos3 > 0 Then Pos3 = Pos3 - Portc.4
        If Pos4 > 0 Then Pos4 = Pos4 - Portc.5
        If Pos5 > 0 Then Pos5 = Pos5 - Portc.6
        'Motorströme lesen
        Call Motorstrom
        'PWM für Anlauf senken und steigern auf 85% und für Endlage senken
        If I = 1 Then Pwm = 125
        If Pwm < Papwmsenk And Ende = 0 Then Pwm = Pwm + 10 '250 = 90%,  205 = 80%, 180 = 70%
        If Ende = 1 And Pwm > 50 Then Pwm = Pwm - 5
        Ocr2 = Pwm
        'Faktor zur Anpassung Senkzeit
        Waitms Pasenkt
        'Erkennung ob Jalousien unten (reine Zeitbegrenzung)
        If Ende = 0 Then
          If F4grup < 4 Then
            'Stop vor vollständig unten bei Hitzeschutz 50%
            If Hitzss = 1 Then
              If Pos1 < 70 Or Pos2 < 70 Or Pos3 < 70 Then Ende = 1
            End If
            If Hitzso = 1 Then
              If Pos4 < 70 Or Pos5 < 70 Then Ende = 1
            End If
            If Pos1 < 15 And Pos2 < 15 And Pos3 < 15 And Pos4 < 15 And Pos5 < 15 Then Ende = 1
          End If
          If F4grup = 4 And Pos5 < 15 Then Ende = 1
          If F4grup = 5 And Pos4 < 15 Then Ende = 1
          If F4grup = 6 And Pos3 < 15 Then Ende = 1
          If F4grup = 7 And Pos2 < 15 Then Ende = 1
          If F4grup = 8 And Pos1 < 15 Then Ende = 1
        End If
        'falls alle Motoren abgeschaltet < 40mA aber noch 45% PWM angefordert, dann
        'müssen die Jalousien alle unten sein
        If Strom1 < 40 And Strom2 < 40 And Strom3 < 40 And Strom4 < 40 And Strom5 < 40 And I > 10 Then Ende = 1
        'vorzeitiges Abschalten einzelner Jalousien wenn früher fertig
        If Portc.= 1 And I > 10 And Strom1 < 35 Or Pos1 < 1 Then Portc.= 0
        If Portc.= 1 And I > 10 And Strom2 < 35 Or Pos2 < 1 Then Portc.= 0
        If Portc.= 1 And I > 10 And Strom3 < 35 Or Pos3 < 1 Then Portc.= 0
        If Portc.= 1 And I > 10 And Strom4 < 35 Or Pos4 < 1 Then Portc.= 0
        If Portc.= 1 And I > 10 And Strom5 < 35 Or Pos5 < 1 Then Portc.= 0
       'Senken erfolgreich abgeschlossen
        If Ende = 1 And Pwm < 51 And Kurzs = 0 Then
          File = 23
          Pwm = 0
          Call Voice
        End If
      End If

      '===============================================================================
      'globale Kurzschlusserkennung
      'neu Kurzschlussstrom anhand der PWM Rate reduzieren
      If I > 10 Then
        Kurzstrpwm = Pakurzs * Pwm
        Kurzstrpwm = Kurzstrpwm / 255       'Bei 400mA  PWM190 = 298ma , 220 = 345mA , 255 = 400mA´
      Else
        Kurzstrpwm = Pakurzs
      End If

      'beim Senken nur halber Wert
      If F1heb = 1 Then Kurzstrpwm = Pakurzs Else Kurzstrpwm = Pakurzs * 0.7       
      
'beim Senken nur 70% des Kurzschlusswertes

      'Wenn Kurzschluss schon in der vorherigen Schleifer erkannt wurde aber Motorstrom 
      'immer noch zu hoch, dann über

      'Polwendung ganze Gruppe abschalten
      If Kurzs1 > 2 And Strom1 > Kurzstrpwm And Portc.= 1 Then Portc.= 0
      If Kurzs2 > 2 And Strom2 > Kurzstrpwm And Portc.= 1 Then Portc.= 0
      If Kurzs3 > 2 And Strom3 > Kurzstrpwm And Portc.= 1 Then Portc.= 0
      If Kurzs4 > 2 And Strom4 > Kurzstrpwm And Portc.= 1 Then Portc.= 0
      If Kurzs5 > 2 And Strom5 > Kurzstrpwm And Portc.= 1 Then Portc.= 0

      'selektive Kurzschlusserkennung zählt Motorstromüberschreitungen mit
      If Strom1 > Kurzstrpwm Then Kurzs1 = Kurzs1 + 1
      If Strom2 > Kurzstrpwm Then Kurzs2 = Kurzs2 + 1
      If Strom3 > Kurzstrpwm Then Kurzs3 = Kurzs3 + 1
      If Strom4 > Kurzstrpwm Then Kurzs4 = Kurzs4 + 1
      If Strom5 > Kurzstrpwm Then Kurzs5 = Kurzs5 + 1

      'selektive Kurzschlusserkennung schaltet betroffenen Mosfet ab
      If Kurzs1 = 1 And Portc.= 1 Then Portc.= 0
      If Kurzs2 = 1 And Portc.= 1 Then Portc.= 0
      If Kurzs3 = 1 And Portc.= 1 Then Portc.= 0
      If Kurzs4 = 1 And Portc.= 1 Then Portc.= 0
      If Kurzs5 = 1 And Portc.= 1 Then Portc.= 0

      'Summenmeldung Kurzschluss generieren
      If Kurzs1 = 1 Or Kurzs2 = 1 Or Kurzs3 = 1 Or Kurzs4 = 1 Or Kurzs5 = 1 Then Kurzs = 1


      'alle Motorports sofort abschalten wenn Abbruchtaste
      If Pinb.= 0 Then
        Portc = &B00000000
        Ende = 1
        Pwm = 0
        Ocr2 = 0
        Abbruch = 1
      End If

      'PWM in % umrechnen
      Pwm1 = Pwm * 100
      Pwm1 = Pwm1 / 255
      Pwmtxt = Str(pwm1)
      Pwmtxt = Format(pwmtxt , "  0")

      'nach 20 Zyclen Motorstrom auf Unterstrom überprüfen
      If I = 20 And Kurzs = 0 Then
        If Strom5 < 70 And Portc.= 1 And Pos5 > 15 And Pos5 < 85 Then _
        Motornrtxt 
= "5 " Else Motornrtxt = "- "
        If Strom4 < 70 And Portc.= 1 And Pos4 > 15 And Pos4 < 85 Then _
        
Motornrtxt = Motornrtxt + "4 " Else Motornrtxt = Motornrtxt + "- "  
               If Strom3 < 70 And Portc.= 1 And Pos3 > 15 And Pos3 < 85 Then _
       M
otornrtxt = Motornrtxt + "3 " Else Motornrtxt = Motornrtxt + "
       
If Strom2 < 70 And Portc.= 1 And Pos2 > 15 And Pos2 < 85 Then_
       
Motornrtxt = Motornrtxt + "2 " Else Motornrtxt = Motornrtxt + "- "
        
If Strom1 < 70 And Portc.= 1 And Pos1 > 15 And Pos1 < 85 Then_
        
Motornrtxt = Motornrtxt + "1 " Else Motornrtxt = Motornrtxt + "- "
        
If Motornrtxt = "- - - - - " Then Motorfehler = 0 Else Motorfehler = 1
      
End If

      'damit Variable I nicht überläuft
      If I < 21 Then I = I + 1

      'Positionen in LCD String umwandeln siehe Sub Main
      Pos1txt = Str(pos1)
      Pos2txt = Str(pos2)
      Pos3txt = Str(pos3)
      Pos4txt = Str(pos4)
      Pos5txt = Str(pos5)
      Pos1txt = Format(pos1txt , " 0")
      Pos2txt = Format(pos2txt , " 0")
      Pos3txt = Format(pos3txt , " 0")
      Pos4txt = Format(pos4txt , " 0")
      Pos5txt = Format(pos5txt , " 0")

      'LCD Texte schreiben
      Lcdz2txt = " " + Pos5txt + "% " + Pos4txt + "% " + Pos3txt + "% " + Pos2txt + "% " + Pos1txt + "%"
      Lcdz3txt = "Strom in mA  PWM" + Pwmtxt + "%"
      Lcdz4txt = " " + Strom5txt + " " + Strom4txt + " " + Strom3txt + " " + Strom2txt + " " + Strom1txt
      Locate 2 , 1
      Lcd Lcdz2txt
      Locate 3 , 1
      Lcd Lcdz3txt
      Locate 4 , 1
      Lcd Lcdz4txt

'Schleife bis Ende erkannt oder Abbruchtaste betätigt oder Kurzschluss erkannt
 Loop Until Ende = 1 And Pwm = 0 Or Abbruch = 1

'alle Motorports abschalten
 Portc = &B00000000

'Endlagen Abgleich und wenn Abbruch durch Taste oder Kurzschluss dann alle Positionen lassen
 If Kurzs1 = 0 Then
   If Pos1 < 20 Then Pos1 = 0
   If Pos1 > 80 Then Pos1 = 99
   If Hitzss = 1 And Pos1 < 70 Then Pos1 = 50
   If Hitzss = 3 And Pos1 > 30 Then Pos1 = 50
 End If
 If Kurzs2 = 0 Then
   If Pos2 < 20 Then Pos2 = 0
   If Pos2 > 80 Then Pos2 = 99
   If Hitzss = 1 And Pos2 < 70 Then Pos2 = 50
   If Hitzss = 3 And Pos2 > 30 Then Pos2 = 50
 End If
 If Kurzs3 = 0 Then
   If Pos3 < 20 Then Pos3 = 0
   If Pos3 > 80 Then Pos3 = 99
   If Hitzss = 1 And Pos3 < 70 Then Pos3 = 50
   If Hitzss = 3 And Pos3 > 30 Then Pos3 = 50
 End If
 If Kurzs4 = 0 Then
   If Pos4 < 20 Then Pos4 = 0
   If Pos4 > 80 Then Pos4 = 99
   If Hitzso = 1 And Pos4 < 70 Then Pos4 = 50
   If Hitzso = 3 And Pos4 > 30 Then Pos4 = 50
 End If
 If Kurzs5 = 0 Then
   If Pos5 < 20 Then Pos5 = 0
   If Pos5 > 80 Then Pos5 = 99
   If Hitzso = 1 And Pos5 < 70 Then Pos5 = 50
   If Hitzso = 3 And Pos5 > 30 Then Pos5 = 50
 End If

'Positionen in LCD String umwandeln siehe Sub Main
 Pos1txt = Str(pos1)
 Pos2txt = Str(pos2)
 Pos3txt = Str(pos3)
 Pos4txt = Str(pos4)
 Pos5txt = Str(pos5)
 Pos1txt = Format(pos1txt , " 0")
 Pos2txt = Format(pos2txt , " 0")
 Pos3txt = Format(pos3txt , " 0")
 Pos4txt = Format(pos4txt , " 0")
 Pos5txt = Format(pos5txt , " 0")

 'Hitzeschutz setzen
 If F2senk = 1 Then
   If Hitzso = 1 Then Hitzso = 2
   If Hitzso = 3 Then Hitzso = 4
   If Hitzss = 1 Then Hitzss = 2
   If Hitzss = 3 Then Hitzss = 4
 End If
 If F1heb = 1 Then
   If Hitzso = 1 Then Hitzso = 0
   If Hitzso = 3 Then Hitzso = 2
   If Hitzss = 1 Then Hitzss = 0
   If Hitzss = 3 Then Hitzss = 2
 End If

'Merker Heben oder Senken usw. zurück setzen
 F1heb = 0
 F2senk = 0
 Ende = 0
 Pwm = 0
 Abbruch = 0
 I = 0
 J = 0

 If Kurzs = 1 Then
   File = 19
   Call Voice
 End If
'zurück zu Main
 End Sub

'==============================================================================
'==============================================================================
'==============================================================================
'********************** Unterprogramm Motorstrom ******************************
 Sub Motorstrom
 Z = 0
 'zum Mittelwert bilden wird 10x gemessen addiert und danach durch 20
 'geteilt damit wieder auf 512mA gemittelt wird
 '10 bit = 1024 : 2 = 512mA
 Strom1 = 0
 Strom2 = 0
 Strom3 = 0
 Strom4 = 0
 Strom5 = 0
 For Z = 1 To 10
 Strom1 = Getadc(0) + Strom1
 Strom2 = Getadc(1) + Strom2
 Strom3 = Getadc(2) + Strom3
 Strom4 = Getadc(3) + Strom4
 Strom5 = Getadc(4) + Strom5
 Next Z
 Strom1 = Strom1 / 20
 Strom2 = Strom2 / 20
 Strom3 = Strom3 / 20
 Strom4 = Strom4 / 20
 Strom5 = Strom5 / 20
'Strom mit letztem mitteln und Stromwert Zahl in String umwandeln
'neu nur wenn kein Kurzschluss vorliegt, damit Werte gespeichert werden
 If Kurzs1 = 0 Then Strom1txt = Str(strom1)
 If Kurzs2 = 0 Then Strom2txt = Str(strom2)
 If Kurzs3 = 0 Then Strom3txt = Str(strom3)
 If Kurzs4 = 0 Then Strom4txt = Str(strom4)
 If Kurzs5 = 0 Then Strom5txt = Str(strom5)
 'String in Format ohne Vornull aber mit gleitendem Leerzeichen
 'umwandeln, damit Wert im LCD nicht hin und her springt
 If Kurzs1 = 0 Then Strom1txt = Format(strom1txt , "  0")
 If Kurzs2 = 0 Then Strom2txt = Format(strom2txt , "  0")
 If Kurzs3 = 0 Then Strom3txt = Format(strom3txt , "  0")
 If Kurzs4 = 0 Then Strom4txt = Format(strom4txt , "  0")
 If Kurzs5 = 0 Then Strom5txt = Format(strom5txt , "  0")
 End Sub
'==============================================================================
'==============================================================================
'==============================================================================
'********************** Unterprogramm Motorports ******************************
 Sub Motorports
'PC0        22        O        Polwendung Motor 1-3 Süden   0 = senken
'PC1        23        O        Polwendung Motor 4-5 Osten   0 = senken
'PC2        24        O        Motor 1 Süden 1 = Motor an
'PC3        25        O        Motor 2 Süden 1 = Motor an
'PC4        26        O        Motor 3 Süden 1 = Motor an
'PC5        27        O        Motor 4 Osten 1 = Motor an
'PC6        28        O        Motor 5 Osten 1 = Motor an
'Motorstrommittelwertmerker zurück setzen
 Strom1 = 0
 Strom2 = 0
 Strom3 = 0
 Strom4 = 0
 Strom5 = 0
'Motorenports je nach Betriebsart für senken oder heben ansteuern zuerst senken
 If F4grup <> 1 Then
   If F4grup < 4 Then Portc = &B01111100                    'M5|M4|M3|M2|M1
   If F4grup = 0 Then
     If Hitzso = 1 Then Portc = &B01100000                  'M5+M4 Hitzso 50%
     If Hitzso = 3 Then Portc = &B01100000                  'M5+M4 Hitzso 100%
     If Hitzss = 1 Then Portc = &B00011100                  'M3+M2+M1 Hitzss 50%
     If Hitzss = 3 Then Portc = &B00011100                  'M3+M2+M1 Hitzss 100%
     If Hitzso = 1 And Hitzss = 1 Then Portc = &B01111100
     If Hitzso = 3 And Hitzss = 3 Then Portc = &B01111100
   End If
   If F4grup = 4 Then Portc = &B01000000                    'M5 Ostseite
   If F4grup = 5 Then Portc = &B00100000                    'M4 Ostseite
   If F4grup = 6 Then Portc = &B00010000                    'M3 Südseite
   If F4grup = 7 Then Portc = &B00001000                    'M2 Südseite
   If F4grup = 8 Then Portc = &B00000100                    'M1 Südseite
   'Bei Heben PortC.0 und 1 nachträglich ansteuern
   If F2senk = 0 And F1heb = 1 Then
     If F4grup > 5 Or F4grup < 4 Then Portc.= 1           '|M3-1|
     If F4grup < 6 Then Portc.= 1                         '|M4-5|
   End If
 Else
   Portc = &B00000000                                       'alle AUS
 End If

 Waitms 200
'Set PWM
 Pwm = 255
 Ocr2 = Pwm
 End Sub
'==============================================================================
'==============================================================================
'==============================================================================
'*************************** Unterprogramm Voice ******************************
'Übersicht Voicedateien
'File 1     =  manuelles heben
'File 2     =  manuelles senken
'File 3     =  manueller Stop
'File 4     =  Gruppenauswahl 0-alle
'File 5     =  Gruppenauswahl 2-alle ohne Hitzeschutz
'File 6     =  Gruppenauswahl 3-alle manuell
'File 7     =  Einzelsteuerung 4-M5
'File 8     =  Einzelsteuerung 5-M4
'File 9     =  Einzelsteuerung 6-M3
'File 10    =  Einzelsteuerung 7-M2
'File 11    =  Einzelsteuerung 8-M1
'File 12    =  Nacht
'File 13    =  Tag
'File 14    =  Sonnenschutz aktiv Osten
'File 15    =  Sonnenschutz deaktiviert Osten
'File 16    =  Sonnenschutz aktiv Süden
'File 17    =  Sonnenschutz deaktiviert Süden
'File 18    =  Kurzschluss bei Initialisierung
'File 19    =  Kurzschluss bei Normalbetrieb
'File 20    =  Begrüßung
'File 21    =  neu Programmbeschreibung / Alles AUS
'File 22    =  Heben erfolgreich abgeschlossen
'File 23    =  Senken erfolgreich abgeschlossen
'File 24    =  Es ist Fernsehzeit
'File 25    =  Es ist Werktags und du solltest ins Bett gehen
'File 26    =  Es ist Mitternacht
'File 27    =  Bist du schon eingeschlafen
'File 28    =  Hura es ist Freitag
'File 29    =  so ein Mist das WE ist vorbei
'File 30    =  Du solltest mal mit dem Hund gehen
'File 31    =  Handy laden nicht vegessen

' Programm 5 bit decoder für sound
'PB0        1         O        Attiny 861A PB4 SW1
'PB1        2         O        Attiny 861A PB5 SW2
'PB2        3         O        Attiny 861A PB6 SW3
'PB3        4         O        Attiny 861A PA3 SW4
'PB4        5         O        Attiny 861A PA4 SW5
 Sub Voice
'Vertärker + LCD Licht ein
 Portc.= 0
 Warte:
'wenn Voice Stopp oder Gruppe ankommt, wird das Warten auf noch laufende Voices abgebrochen
 If File > 2 And File < 12 Then Goto Weiter
 If Pind.= 1 Then Goto Warte
 Weiter:
 'da das 8bit Muster negativ sein muss (0= aktiv) muss 255- file gerechenet werden
 'Bsp. file 1 = 255 =   11111110
 If File < 255 Then File = 255 - File Else File = 253       'Bei Überlauf Stop ausgeben
 Portb = File
 Waitms 200
 Portb = 255
 Voicez = 100                                               'für Abwärtztimer Voic/LCD Lichtnachlauf
 If File > 23 Then Wait 1
 File = 0
 End Sub
'==============================================================================
'==============================================================================
'==============================================================================
'*************************** Unterprogramm Urzeit ******************************
'Uhrzeitinterupt
 Sekundeisr:
 Timer1 = Timereichg                                        '= Startwert für eine s je Überlauf
 Incr Sekunde
 Incr Zeit0
 Incr Zeit1
 Incr Zeit2
 Incr Zeit3
 Incr Zeit4
 Zeittxt = Time(sekunde)
 If Sekunde > 86399 Then
   Sekunde = 0
   If Wochentag < 7 Then Wochentag = Wochentag + 1 Else Wochentag = 1
 End If
 'Restzeit Sonnenschutzverzögerung 3min
 If Zeit1 < 181 Then Deltaz1 = 181 - Zeit1
 If Zeit3 < 181 Then Deltaz3 = 181 - Zeit3
 Return
 End

 

Nach oben