Zwei Pumpen ansteuerung

Neuuser

Mitglied
11. Aug. 2008
465
0
16
Sprachen
Hallo Leute,
ich bin Neuling in Sachen Programmierung und suche dringend eine Steuerung womit ich zwei unterschiedliche Pumpen mit Schalten kann.
Nicht nur an und aus, sondern muss die eine so gesteuert werden ob sonne vorhanden ist oder nicht und sehen ob genug Saft auf die Batterien ist, das heißt eiene ist auf 12V und die andere auf 230 wen keine Sonne oder der Strom über die Batterien nicht mehr reicht muss umgeschaltet werden.
Ich babe hier ein Programm über eine Uhr , wo muss ich rein das ich noch die zeit einstellen kann wann sie ein und aus scheltet.
Erst das eine und dan das andere, mit schalten bei Sonne und Strom überwachung.
Kann jemand helfen.

Bye Neuuser
Code:
'************************************************************

'

'Atmega Softclock -> genau Uhrzeit ohne RTC (Real-Time-Clock)

'

'Benutzt wird ein Mega8/8, Fusebits auf Auslieferungszustand,

'Lcd An Portb , Taster Zum Stellen An Pd.0

'zum Hochzählen An Pd.3.

'zwischen XTAL ist ein 32.xxx Uhrenquarz

'************************************************************







$regfile = "m8def.dat"





Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5

Config Lcd = 20 * 2

Initlcd

Cursor Off

Cls



Enable Interrupts



Config Date = Mdy , Separator = /

Config Clock = Soft

Config Portd = Input





Portd.0 = 1                                                 'Taster1, Zeit/Datum stellen, PullUp ein, schaltet gegen Minus

Portd.3 = 1                                                 'Taster2,  Zahl hochzählen, PullUp ein, schaltet gegen Minus





Time$ = "00:00:00"                                          'Setzen auf Startwert

Date$ = "00/00/00"                                          'Setzen auf Startwert



Do

   Locate 1 , 1

   Lcd Time$                                                'Zeige Zeit in Zeile1

   Locate 2 , 1

   Lcd _day ; "/" ; _month ; "/0" ; _year                   'Zeige Datum in Form DD/MM/YYin Zeile2

'lcd Date$                                                     'zeige Datum in Form MM/DD/YY



   If Pind.0 = 0 Then Gosub Time                            'wiederhole Anzeige bis Taster 1 zum Stellen gedrückt, springe nach Sub "Time"

Loop

End





'Stunde

Time:

Waitms 200

Cls                                                         'lösche Zeilen

Do

Locate 1 , 1

Lcd "Set Hour:"                                             'Stunden setzen

Locate 2 , 1

Lcd _hour

         If Pind.3 = 0 Then                                 'Mit Taster 2

           Incr _hour                                       'hochzählen

           Locate 2 , 1

           Lcd _hour

         End If

If _hour > 23 Then                                          'Zählt bis Max, danach wieder ab 0

Cls

_hour = 00

End If                                                      'solange, bis Taster 1 gedrückt

Loop Until Pind.0 = 0

Waitms 200







'Minute

Cls

Do
 
Hallöli Neuuser,

erlaube mir erst mal ein paar allgemeine Fragen bevor wir loslegen, ok? :)

Aus welchem Grund möchtest Du so viel Aufwand betreiben und zwei Pumpen mit unterschiedlichen Versorgungsspannungen und komplett unterschiedlichen Konzepten betreiben. Wenn Du sowieso schon 230V für eine Pumpe vorliegen hast so wäre es doch einfacher komplett bei einer Spannungsversorgung zu bleiben, oder?
Hast Du für die Batterie irgendwo noch Fotovoltaik und Ladeelektronik zum Laden der Batterien?
Wie möchtest Du die Spannungsüberwachung der Batterie gestalten? Hierzu hast Du sicher eine Messmethode auf Deinem Controller vorgesehen, oder?

Bitte schreib uns noch a bissle mehr zum Hintergrund Deiner Anwendung und etwas über Dein bisheriges Design bzw. die Hardware welche Du verwendest.

Nun werfen wir mal einen Blick auf Deinen Code.

Wenn ich mir Deinen Code ansehe dann habe ich den Eindruck, dass Du nicht alles hier abgebildet hast. Kann das sein? Ansonsten sind einige prinzipielle Fehler enthalten auf die ich zuerst eingehen möchte. Wir sollten zuerst die Grundlagen klären und dann machen wir weiter, ok?

Also:

1. Du solltest auf jeden Fall mit dem "$crystal" Befehl Deinem BASCOM-Compiler mitteilen, dass Du den internen 1MHz Oszillator Deines Mega8 verwendest. Es kann sein dass NASCOM dies indirekt annimmt es ist aber auf jeden Fall guter Stil das anzugeben.
Wichtig: Alle Timer und Zeitparameter von BASCOM basieren auf Deiner / dieser Vorgabe.

2. Warum enablest Du interrupts zu einem zeitpunkt wo sie noch garnichts zu tun haben? Du hast auch keine ISR Routinen aktiviert, was möchtest Du damit machen?

3. Das Kommando "End" sollte immer ganz am Ende Deiner Programmroutinen stehen. End in BASCOM ist nichts anderes als eine Endlosschleife die verhindern soll, dass das Programm durch einen Fehler wild im Speicher umher läuft und versucht ggf. Daten als ausführbaren Code zu interpretieren. Triff der "wildgewordene" Prozessor auf das End so wird er "eingefangen" und läuft sauber im Kreis :D

4. GOSUB-Routinen benötigen am Ende immer eine "Return" mit dem Du zur Aufgrufenden Stelle "GOSUB blablabla" zurückspringen kannst. Das finde ich in Deinem Beispiel nirgends.

5. Die Routine zum Stellen der Uhr mit Stunden und Minuten ist sehr umständlich programmiert. Du prüfst direkt die Zustände der Taster selbst. Schau Dir hierzu mal den "debounce"-Befehl von BASCOM an. Vielleicht hilft der Dir weiter. So bekommst Du auch etwas mehr Struktur rein. Außerdem kümmert sich debounce selbst um das Entprellen der Tasten und jeder Tastendruck wird auch nur einmal ausgewertet.

So, das waren ein paar Worte zu dem Code welche ich mir kurz überflogen habe. Dann möchte ich Dir noch eine Antwort auf Deine Frage geben. Wobei Du von mir keine Komplettlösung erwarten darfst den den Freude über den Erfolg überlasse ich Dir, ok?`Von mir gibt es Hilfestellungen, Ratschläge und Querdenken :cool:

Nun, Du fragst wo Du rein musst um Deine Timer zu stellen. Hmmmm, die von Dir verwendete Softclock ist zunächst nichts anderes als eine auf dem Kontroller zum laufen gebrachte Echtzeituhr welche Ihren Takt durch den externen Uhrenquarz bezieht. Prüfe hier bitte die richtige Beschaltung, ggf. noch entsprechende Kondensatoren damit die Uhrzeit stabil läuft, die richtige Fuse-Konfiguration.
Damit ist es dann aber schon gewesen. Wenn Du zeitgesteuert Aktionen auslösen möchtest so musst Du Dir selbst entsprechende Zeitwerte / Variablen erzeugen die Deine Steuerungszeit beinhalten. Das wird Dir nicht fertig geboten sondern das musst Du von Hand dazu programmieren. Du brauchst auf jeden Fall für Stunden und Minuten ggf. auch für das Datum zusätzliche Variablen die Du einstellen können musst und solltest.
Anschließend ist es Aufgabe Deines Hauptprogramms (DO-LOOP-Schleife) Deine Zeitvariablen mit der Softclock zu vergleichen. Wenn die Zeiten übereinstimmen kannst Du ein Ereignis starten oder beenden. Auch hier helfen in der Regel relative Zeitrechnungen von einer Basis ausgeend. Wenn Du Start und Stop-Zeiten benötigst so benötigst Du nochmals einen Satz Variablen um das getrennt zu steuern.

Das Einstellen der Start und Stop-Zeiten würde ich ähnlich wie das Stellen der Uhr machen. Nur würde ich wirklich auf debounce umstellen. Die Überprüfung der Zeiten und das Ansteuern Deiner Pumpen würde ich über das Hauptmenü abprüfen.
Es gibt hierzu vieleicht noch eine andere Möglichkeit. Schau mal nach ob es einen SECTICK Parameter für die Softclock gibt und überlege Dir, ob das helfen kann.
Eventuell wird Deine Steueraufgabe für SECTICK zu groß, dann kann man aber über SECTICK ein Flag setzen was im Hauptprogtramm abgeprüft wird.

So nun habe ich ne Menge geschrieben und Du hast wahrscheinlich nur Bahnhof verstanden. Nimm Dir die Zeit und schau Dir die Befehle welche ich Dir hier genannt habe in der BASCOM Hilfe in Ruhe an und ich bin mir sicher, dass Dir das ganze klarer erscheinen wird.

Teile mir Deine Meinung dazu und die weiter entstandenen Fragen mit und wir werden weitersehen. Gut Ding will Weile haben und ein bisschen Spass und Entdeckergeist muss auch sein, oder?

Grüße bis dahin,
Markus
 
Hallo Markus,
mann mann mann, das passt ja gar nicht auf einer Seite, was du mir da geschrieben hast, das ist gut, besser als gar keine Antwort :) .
Das Programm habe ich nicht selber geschrieben, das ist gefunden aus dem Netz, wie gesagt bin Anfänger und möchte auch was lernen.
Werde mir alles in ruhe durchlesen und deine befehle raussuchen und zu verstehen, morgen werde ich dazu antworten.

Bis dann, Neuuser
 
Hallo Markus,
so nun, ich denke ich werde deine Fragen so gut ich es kann beantworten.
$crystal 1Mhz und End ich denke das ist klar das es vorn und am Ende am besten Deklariert wird.

Warum enablest Du interrupts zu einem zeitpunkt wo sie noch garnichts zu tun haben? Du hast auch keine ISR Routinen aktiviert, was möchtest Du damit machen?
da fragst du mich zu viel.:rolleyes:

Wie möchtest Du die Spannungüberwachung der Batterie gestalten? Hierzu hast Du sicher eine Messmethode auf Deinem Controller vorgesehen, oder?
genau und zwar habe ich dazu auch aus dem Buch ein kleines Programm was über zwei Potis die Spannung abfragt.
den werde ich noch mal mit reingeben das du ihn anschauen kannst.

Den Befehl Debounce habe ich gefunden der Entprellt die Taster für eine bestimmte milliyzeit automatisch ,sollte wohl am besten sein.

Prüfe hier bitte die richtige Beschaltung, ggf. noch entsprechende Kondensatoren damit die Uhrzeit stabil läuft, die richtige Fuse-Konfiguration.
Die Fuse ist auf 1Mhz eingestellt Kondensatoren für den Quarz sind noch keine dran, aber ich denke zwei 22p könnten reichen, oder?
ich habe das ganze schon an ein Testbord von Roland Walter dran und es ist am Laufen.

Das Einstellen der Start und Stop-Zeiten würde ich ähnlich wie das Stellen der Uhr machen.

Kann man dazu die Einstellung für das Datum verwenden, das Datum wird eigentlich nicht gebraucht, das ich danach etwas einschalten lasse.

Den Befehl Sectick habe ich nicht gefunden :confused:
die Umschaltung auf 239V kann man erstmal weg lassen und alles nur auf die eine Pumpe zu konzentrieren.
Das ganze ist für ein Pol, ich habe ca 650 Ah zu Verfügung die über eine Solaranlage geladen wird und es ist im Sommer viel Strom dann über, deswegen die 12V Pumpe.

Gruß Neuuser
 
Hi Neuuser!

Welches Buch verwendest Du, aus dem Du die Schaltung mit den zwei Potis hast?

1. Ja, 22pF Keramik-C's an den externen Quarz reicht, würde ich sagen!

2. Ich gehe davon aus, dass Du für Deine Zeiteinstellungen die Du zum Einschalten und Ausschalten benötigst die Einstellungen für das Datum nicht verwenden kannst.
Außer zum Einstellen der Uhr würde ich prinzipiell die Finger von den internen Variablen der Softclock lassen. Ich würde mir eigene Variablen erzeugen und diese mit den aktuellen Inhalten der Softclock vergleichen.

3. Sectic ist kein Befehl sondern Bestandteil der Softclok-Konfiguration. Schau Dir hierzu mal "config clock" in der Hilfe von BASCOM an, dann verstehst Du was ich meine! Diese im Sekunden Takt aufgerufene Routine welche Du selbst definieren kannst eignet sich herforagend um zwei Zeiten miteinander zu vergleichen!


CONFIG CLOCK = soft | USER [, GOSUB = SECTIC]

Sectic
This option allows to jump to a user routine with the label sectic.
Since the interrupt occurs every second you may handle various tasks in the sectic label. It is important that you use the name SECTIC and that you return with a RETURN statement from this label.
The usage of the optional SECTIC routine will use 30 bytes of the hardware stack. This option only works with the SOFT clock mode. It does not work in USER mode.

Wenn Du sectic verwendest so musst Du eine Routine definieren welche genau so heißt. z.B:

Code:
'------------------------------------------------------------------------------
' Service-Routine sectic für Softclock
' Routine wird als Parameter bei Config Clock übergeben und automatisch jede
' Sekunde ausgeführt. Damit ist SekundenTick für Gesamtsystem ohne zusätzlichen
' Timer möglich.
'------------------------------------------------------------------------------
Sectic:
   ' mache irgendwas
Return
'-- End Sectic ----------------------------------------------------------
Grüße,
Markus
 
Hi Markus,
das Buch ist von Roland Walter und dort beschrieben das es über ein A/D Wandler mit zwei Potis eine Strommessung vorgenommen werden kann.
Ich muss erst mal sehen das ich das auf die Reihe bekomme mit der Uhr das ist nicht einfach als Anfänger zu sehen wo man die einzeln Code einsetzt das sie richtig funktionieren.
Am bestens ich schiebe die Uhr noch zurück und baue erstmal eine Akkuüberwachung mit Lichtsensor, ich habe hier ein kleines zusammen Geschustert aber es funktioniert nicht immer, es soll mit ca 30 Sekunden Verzögerung ausschalten aber ich habe es nur so hin bekommen das es mit Verzögerung ein und aus geht, gehe mit ein Fotowiederstand und ein Poti rein.
Bei viel Licht ein und 30 sec verzögert wieder aus.
Oder sollte man dieses über ein Timer Programm laufen lassen :confused: ?

Gruß Neuuser
 
Hi,

es kommt darauf an, wie Du Deine 30 Sekunden realisiert hast. Wenn Du hierzu "waits 30" verwendest dann macht der Mega nix anderes als mit riesigen Variablen 30 Sekunden im Kringel zu rennen. Hier empfiehlt es sich auch jeden Fall Timer einzusetzen. Allerdings wirst Du selbst mit einem Clock von 1 MHz einen 16-Bit Timer benötigen um 30 Sekunden abzubilden. Bereits mit 3,684 MHz Clock schaffst Du das nicht mehr.

Hier könntest Du wieder die SoftClock einsetzen, den sectic für den Sekunden-Takt verwenden, Dir einen kleinen Scheduler bauen in dem Du die Takte mitzählst und nach 30 Sekunden eine Aktion ausführtst.

Der Vorteil dieser Lösung ist, dass der Controller in der Zwischenzeit für alle anderen Aufgaben frei ist und nur jede Sekunde kurz unterbrochen wird.

Grüße,
Ma
 
ja ich sehe schon ,ich werde mich erst noch etwas belesen, das ich das bissel auf die Reihe bekomme, dann werde ich mich nochmals melden, so wird das nix.:eek:

Gruß Neuuser
 
Ja, das ist auf jeden Fall der absolut richtige Ansatz. Wenn Du Dir Software aus dem Inernet "zusammenstupfelst" so solltest Du schon wissen was die SW macht und vor allem, was Du damit machst. Du wirst dann auch sehr schnell auf den Trichter kommen Deinen Code teilweise selbst zus chreiben denn alles selbsr geschriebene hat man 100% nachvollziehbar verinnerlicht.

Ich kann Dir für die Einarbeitung in die AVR Welt unter BASCOM ein ganz gutes Buch empfeheln. Nämlich:

Programmieren der AVR RISC Microcontroller mit BASCOM-AVR von Claus Kühnel

Gibt es als Taschenbuch z.B. bei AMAZON für 34,95EUR. Damit hab ich damals z.B. auch angefangen.

Grüße,
Markus
 

Über uns

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

User Menu

 Kaffeezeit

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

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


     Spende uns! (Paypal)