Eine Zeitsteuerung, und weis nicht wie?

Moppel158

Neues Mitglied
07. Dez. 2015
19
0
1
51
Hallo, es handelt sich um ein Gerät das ein Relais und eine Lampe besitzt, es gibt Zwei (Schalter / Taster)
Einen NTC der eine Temperatur misst, und das Programm muss nach schliesen von Schalter1 Zweimal nach Temperatur abhängig das Relais ansteuern und die Lampe beim ersten Abschnitt Leuchten lassen, am Ende Lampe aus Relais an lassen, dann warten auf Schalter2 wenn dieser geschlossen wurde und wieder geöffnet ist, dann abschnitt zwei, relais weiterhin an und Lampe blinken bis zeit die temperaturabhängig ist vorbei ist, danach Lampe und Relais aus, und warten bis schalter 1 geöffnet wurde und wieder geschlossen, dann wieder sprung zum anfang.

was ich bis jetzt habe ist eine Tabelle mit Temperaturen Ohmschen werten und einem ADC Wert und die Berechnette Spannung aus NTC und Pullup wiederstand von 10.000 Ohm. dazu nZeit 1 und Zeit 2 die benutzt werden soll bei einem Temperaturpunkt, es gibt 36 Stück davon, die von 105°C bis Minus 62°C reichen.

Das Programm schaut bis jetzt so aus:

_______________________________

$regfile = "Tiny85.def.dat"
$crystal = 800000

Config Adc = Single , Prescaler = Auto , Reference = Avcc
START ADC
Dim Ergebnis As Word
Ergebnis = Getadc(0)

Config Portb.1 = Output
Config Portb.2 = Output
Config Pinb.3 = Input
Config Pinb.4 = Input
Portb.1 = 0
Portb.2 = 0
Pinb.3 = 0
Pinb.5 = 0
_________________________________


weiter reicht mein Verstand nicht, vorallem wie und wo erstelle oder lege ich wie werte aus meiner excel Tabelle ab, um diese zu verwenden.

LG
Michael
 
Moin,

hast du einen Schaltplan?
 
Hallo Moppel
nun, deine Hausaufgaben musst du schon selber machen. Der Programmschnipsel legt ja nur 2 Eingänge und 2 Ausgänge sowie einen Analogkanal fest. Ein wenig mager, oder nicht? Überleg doch mal, du brauchst einen Timer, der dir die Möglichkeit gibt, Zeiten abzuleiten. Am besten machst du dir erst einmal ein paar Blöcke, ganz ohne Programm. Lediglich sowas wie "1_Sek_impuls". Wie das Innere dann auszusehen hat, läßt du erst mal offen. Genauso gehst du mit den Eingängen vor. "Read_Digital_In" und "Read_Analog_In" könnten solche Blöcke werden. Schließlich gibts dann noch "Digital_Out" und ein Block "Die_Aufgabe". Ja, und nun ist es an der Zeit dich selbst zu fragen, hab ich Lust, solch ein Problem zu lösen, oder spiel ich lieber mit meinem Smartphone.... Janniiix3 hat schon recht, wenn er nach einem Schaltbild fragt. Das gehört einfach mal so dazu und auch wenn kein Werkzeug zum Zeichnen vorhanden ist, ein Paint-Programm ist in jedem Windows und erlaubt klene übersichtliche Zeichnungen. Die sind dann auch immer zur Hand, wenn es irgendwie nicht richtig will.
Wenn du deine Module dir dann so ansiehst, wirst du erkennen, welches eigentlich nicht mehr weiter zerlegt werden muss und wo eventuell weitere Blöcke in Frage kommen. So ist doch der Block "Die_Aufgabe" ziemlich umfassend und genau hier gibt es so viele kleine Zwischenaufgaben. Auswerten der Temperaturen und Bereichszuordnung.. was auch immer du irgendwie als kleine Aufgabe siehst, schreib es auf. Das nennt man einen Gedankensturm oder Neudeutsch "Brainstorm". Und wenn dir dann nichts mehr auf Anhieb einfällt, dann versuch es zu ordnen, dem Ganzen einen Ablauf zu geben. Dazu braucht es noch keine Programmierkenntnisse, schult aber das analytische Denken. Und dann darfst du dir Block für Block vornehmen und die Tätigkeit mit einem Programm beschreiben. Und so Gott will und deine Überlegungen richtig waren, läuft dann ein Programm so wie du willst.
Also, denk mal drüber nach. Mir ist es jedenfalls zu anstrengend aufgrund deiner diffusen Aufgabenbeschreibung ein solches Gerüst zu erstellen, ein Programm zu entwerfen und es dir dann als Sahnetörtchen zu übergeben.
Gruß oldmax
 
Das ganze nennt man auch "PAP (ProgrammAblaufsPlan)" dafür gibt es extra ein Tool. Oder eben OldScool auf Papier.
 
Hallo, Etwa So?
Und wie und wo lege ich die Wertetabelle an und ab, und wie muss die aufgebaut sein, und wie mach ich das mit größer als und kleiner als, meine damit werte die von bis reichen, da ich ne Zeiteinteilung (Raster gemacht habe, es sind 36 Temperaturpunkte festgelegt und dazu verschiedene Zeiten, Zeit 1 und Zeit 2 die länger ist als die erste Zeit.
Dazu die Schutzabschaltung, für die maximale Zeit fals keine weitere Aktion nach Schalter 1 geschlossen geschieht.
Naja vermutlich eh viel zu hoch für mich, hab so ein Bascom Lernbuch mit ner Platine, aber egal wie oft ich da reinsehe, fällt bei mir der Groschen einfach nicht!
Zig Schreibfehler in dem Ding, vergesst es einfach

Mach vieleicht einfach eine Liste mit fester Zeit, ist zwar nicht gut aber einfach also wait ms und dann mach und wait und mach und wait und mach basta!
 

Anhänge

  • Programm ablauf.png
    Programm ablauf.png
    46,9 KB · Aufrufe: 21
Zuletzt bearbeitet:
In was willst du überhaupt Programmieren? Du hast hier nur einen Codeschnipsel aus einem "Bascom" Quellcode gepostet...
Also...?

Warteposition? Ich hoffe du meinst nicht mit "delay" sondern mit einem von Timer erzeugten "delay", so das die CPU dazwischen noch was leisten kann.

Tabellen werden meist im Flash oder EEPROM abgelegt (wobei die schreib Zyklen beachtet werden müssen, dies betrifft nur den EEPROM).

Für "kleiner als" oder "größer als" schau dir mal die "Logischen Operatoren" an.

@edit...

Dein Programmablaufplan ist ziemlich undurchsichtig und bestimmt noch optimierungsfähig. Es ließt sich ziemlich besch*****.
 
Zuletzt bearbeitet:
Bascom ich kann nicht besonders gut aber wenigstens schaff ich es so ne kindische Zeit ablaufgeschichte mit wait und mach was zu basteln, versuche zu verstehen wie was warum, aber wenn ich es nicht verstehe kann ich auch nicht mit etwas umgehen, hab das Bascom Buch vor und rückwärts zigmal durch, dann denke ich ja so geht es, aber irgendwie wieder garnicht, also drehe ich mich am anfang im kreis und hänge fest

Hätte das hier nicht schreiben dürfen, also die frage posten!
Hab mist gemacht damit.
 
Hätte das hier nicht schreiben dürfen, also die frage posten!
Hab mist gemacht damit.

Die Flinte ins Korn werfen, ist keine gute Idee. Aus Fehlern lernt man. Jeder hat schließlich bei "0" angefangen. Bei Bascom kann ich dir leider nicht weiterhelfen, da kommen die Bascom Experten ins Spiel.
 
Heuel, im Buch steht unter Operatoren, Vergleich: größer/kleiner usw. mehr nicht und unter info steht drunter Sehen Sie dazu in der Hilfe von Bascom nach.

in der Hilfe finde ich weder Vergleich noch größer noch kleiner ........
Es ist Sinnlos die Flinte ist im Korn und liegt im Ofen!
 
Etwa so richtig?

________________________

If ADC >= 37,01 And <= 203,36 then Time 1 = 8 Sekunden , Time 2 = 10 Sekunden
If ADC >= 203,37 And <= 304,43 then Time 1 = 18 Sekunden , Time 2 = 18 Sekunden
If ADC >= 304,44 And <= 368,96 then Time 1 = 24 Sekunden , Time 2 = 20 Sekunden
If ADC >= 368,97 And <= 397,08 then Time 1 = 30 Sekunden , Time 2 = 30 Sekunden
If ADC >= 397,09 And <= 410,25 then Time 1 = 36 Sekunden , Time 2 = 50 Sekunden
If ADC >= 410,26 And <= 435,00 then Time 1 = 42 Sekunden , Time 2 = 70 Sekunden
If ADC >= 435,01 And <= 468,59 then Time 1 = 50 Sekunden , Time 2 = 90 Sekunden
If ADC >= 468,60 And <= 478,95 then Time 1 = 54 Sekunden , Time 2 = 100 Sekunden
If ADC >= 478,96 And <= 488,94 then Time 1 = 58 Sekunden , Time 2 = 100 Sekunden
If ADC >= 488,95 And <= 498,56 then Time 1 = 62 Sekunden , Time 2 = 120 Sekunden
________________________

Keine ahnung ob damit der die das Hardware Programm MC etwas anfangen könnte?
ist etwa die hälfte der Temperaturen
 
Von den Abfragen sieht das soweit gut aus. Nur du musst dich halt noch um deine ganzen Variablen kümmern (Sekunden, ADC, Time1, Time2), sie also irgendwo im Programm deklarieren.

Und das "=" bei Werten die sich schnell ändern, ist nicht so eine gute Idee (kann der µC evtl. nicht mit bekommen) bei Werten die sich eher langsamer ändern (Minuten, Stunden etc.) ist das okay. Und wenn du mit "float" Werten arbeitest musst du auch noch ein paar Sachen berücksichtigen.
 
Wie ist das hier, könnte das Funktionieren?
Und Danke dir vielmals.


_______________________________

$regfile = "Tiny85.def.dat"
$crystal = 800000

Config Adc = Single , Prescaler = Auto , Reference = Avcc
START ADC
Dim Ergebnis As Word
Ergebnis = Getadc(0)

Config Portb.1 = Output
Config Portb.2 = Output
Config Pinb.3 = Input
Config Pinb.4 = Input
Portb.1 = 0
Portb.2 = 0
Pinb.3 = 0
Pinb.5 = 0
Schalter1 = Pinb.3
Schalter2 = Pinb.4
Relais = Portb.1
Lampe = Portb.2
Schutz = 470


Blinken:
Do
Toggle Portb.2
Waitms 500
Toggle Portb.2
Waitms 500
Loop


Warten:
Do
If Schalter1 = 1 Then Goto Messung And Goto Steuerung1 And Goto Warten2
Loop

Warten2:
Do
If Schalter1 = 1 And Schalter2 = 1 Then Goto Warten2a
Loop

Warten2a:
Do
If Schalter2 = 0 Then Goto Warten3
Loop

Warten3:
Do
If Schalter2 = 0 Then Set Timer1 = 0 And Goto Steuerung3
Loop


Messung:

If Ergebniss >= 37.01 And <= 203.36 , Then Zeit1 = 8 , Zeit2 = 10
If Ergebniss >= 203.37 And <= 304.43 , Then Zeit1 = 18 , Zeit2 = 18
If Ergebniss >= 304.44 And <= 368.96 , Then Zeit1 = 24 , Zeit2 = 20
If Ergebniss >= 368.97 And <= 397.08 , Then Zeit1 = 30 , Zeit2 = 30
If Ergebniss >= 397.09 And <= 410.25 , Then Zeit1 = 36 , Zeit2 = 50
If Ergebniss >= 410.26 And <= 435.00 , Then Zeit1 = 42 , Zeit2 = 70
If Ergebniss >= 435.01 And <= 468.59 , Then Zeit1 = 50 , Zeit2 = 90
If Ergebniss >= 468.60 And <= 478.95 , Then Zeit1 = 54 , Zeit2 = 100
If Ergebniss >= 478.96 And <= 488.94 , Then Zeit1 = 58 , Zeit2 = 100
If Ergebniss >= 488.95 And <= 498.56 , Then Zeit1 = 62 , Zeit2 = 120


Steuerung1:
Timer1 = Schutz
If Timer1 = 0 Then Set Relais = 0
If Timer1 = 0 Then Set Lampe = 0
If Relais = 0 And Lampe = 0 Then Goto Warten


Steuerung2:

Set Timer2 = Zeit1
Set Lampe = 1
If Timer2 = 0 Then Set Relais = 0
If Timer2 = 0 Then Set Lampe = 0
Waitms 1000
Goto Warten2



Steuerung3:

Set Timer2 = Zeit2
Set Lampe = Blinken
If Timer2 = 0 Then Set Relais = 0
If Timer2 = 0 Then Set Lampe = 0
Goto Warten1

End If

___________________________


LG
Michael
 
Blinken:
Do
Toggle Portb.2
Waitms 500
Toggle Portb.2
Waitms 500
Loop


Warten:
Do
If Schalter1 = 1 Then Goto Messung And Goto Steuerung1 And Goto Warten2
Loop

Blinken: Anstatt "Toggle" einfach "Pin High" wait_500ms "Pin Low"....

Und das ...:



CodeBox BascomAVR
If Schalter1 = 1 Then Goto Messung And Goto Steuerung1 And Goto Warten2

wird glaube ich so nicht klappen...
 
Offensichtlich soll das ganze ja in Form eines Zustandsautomaten umgesetzt werden.
Wenn das ganze nie geändert werden soll, keine zusätzlichen Tasks reinsollen, kann man das Blinken mit solchen Warteschleifen realisieren.
Besser ist es trotzdem, 'ne Zeitbasis zu nutzen.

Bei einem Zustandsautomaten hast Du immer einen von mehreren verschiedenen Zuständen (Blinken, Warten, Warten2a usw.). Den merkst Du Dir in Form einer Veriable (Könnte sinnigerweise "Zustand" heißen). Damit Du Dir nicht Zahlen für die Zustände merken mußt, verpaßt Du denen je ein Alias.

In Deiner Hauptschleife prüfst Du nun für jeden Zustand (zB "If Zustand=Blinken") ob dieser Zustand gerade aktiv ist, und wenn das der Fall ist wird der entsprechende Code ausgeführt (insbesondere wird geprüft, ob der Zustand wechseln soll ("Zustand=warten2").

Dann können später Problemlos weiter Zustände hinzugefügt/geändert werden. Und der Controller könnte nebenbei noch was anderes als diesen Automaten abarbeiten...

Nachtrag: setze mal bitte Dein Quellcode in "Bascom-Tags", dann wirds einfacher mit der Hilfe.
Oben weist Du irgendwelchen nichtdeklarierten Variablen die zu dem Zeitpunkt gültigen Werte einiger Prozessorbeine etc. zu. Du willst dort wahrscheinlich nur einen neuen Namen auf diese Beine etc. festlegen. Siehe Alias...

noch'n Nachtrag: "SET" setzt ein Bit in einer Bytevariable
je länger man liest, desto mehr Baustellen ... ohje...
Welche Vorstellung hast Du von den Timern??? Das ist quasi sowas wie'n Sekundenzeiger, der sich unabhängig von Deinem Programm im Kreis dreht. Wobei der Systemtakt die Geschwindigkeit festlegen kann...

Der ADC liefert immer Ganzzahlen. Ich kenne (ausser dem ATtiny5/10 mit 'nem 8Bit-ADC) nur AVR mit 10Bit-ADC. Dein ADC liefert also immer Ganzzahlen zwischen 0 und 1023. Wobei ein Bit dann einem 1/1024 der verwendeten Referenz entspricht.
 
Zuletzt bearbeitet:
Hallöchen, ist es so noch etwas besser?
Habe unter Garantie Fehler da drinn?

_______________________
$regfile = "Tiny85.def.dat"
$crystal = 800000

Config Adc = Single , Prescaler = Auto , Reference = Avcc
START ADC
Dim Ergebnis As Word
Ergebnis = Getadc(0)

Config Portb.1 = Output
Config Portb.2 = Output
Config Pinb.3 = Input
Config Pinb.4 = Input
Portb.1 = 0
Portb.2 = 0
Pinb.3 = 0
Pinb.5 = 0
Schalter1 = Pinb.3
Schalter2 = Pinb.4
Relais = Portb.1
Lampe = Portb.2


On Timer0 Timer0serv
Config Timer0 = Timer , Prescale = 64
Enable Timer0

Enable Interrupts
Dim Schutz As Word
Schutz = 470
Timer0 = Schutz

On Timer1 Timer1serv
Config Timer1 = Timer , Prescale = 64
Enable Timer1

Enable Interrupts
Dim Zeit1 As Word
Dim Zeit2 As Word
Timer1 = Zeit1 Or Zeit2


Blinken:
Do
Portb.2 = High
Waitms 500
Portb.2 = Low
Waitms 500
Loop


Warten:
Do
If Schalter1 = 1 Then Steuerung1 = 1
If Schalter1 = 1 Then Messung = 1
Goto Steuerung2
Loop

Warten2:
Do
If Schalter1 = 1 And Schalter2 = 1 Then Goto Warten3
Loop

Warten3:
Do
If Schalter2 = 0 Then Goto Steuerung3
Loop



Messung:

If Ergebnis >= 37.01 And <= 203.36 Then Zeit1 = 8 , Zeit2 = 10
If Ergebnis >= 203.37 And <= 304.43 Then Zeit1 = 20 , Zeit2 = 20
If Ergebnis >= 304.44 And <= 368.96 Then Zeit1 = 25 , Zeit2 = 30
If Ergebnis >= 368.97 And <= 397.08 Then Zeit1 = 30 , Zeit2 = 40
If Ergebnis >= 397.09 And <= 410.25 Then Zeit1 = 35 , Zeit2 = 50
If Ergebnis >= 410.26 And <= 435.00 Then Zeit1 = 40 , Zeit2 = 70
If Ergebnis >= 435.01 And <= 468.59 Then Zeit1 = 50 , Zeit2 = 90
If Ergebnis >= 468.60 And <= 478.95 Then Zeit1 = 55 , Zeit2 = 100
If Ergebnis >= 478.96 And <= 488.94 Then Zeit1 = 60 , Zeit2 = 100
If Ergebnis >= 488.95 And <= 498.56 Then Zeit1 = 70 , Zeit2 = 120
If Ergebnis >= 498.57 And <= 516.81 Then Zeit1 = 70 , Zeit2 = 180
If Ergebnis >= 516.81 And <= 533.82 Then Zeit1 = 80 , Zeit2 = 200
If Ergebnis >= 533.82 And <= 541.91 Then Zeit1 = 90 , Zeit2 = 220
If Ergebnis >= 541.91 And <= 549.75 Then Zeit1 = 100 , Zeit2 = 240
If Ergebnis >= 549.75 And <= 557.31 Then Zeit1 = 110 , Zeit2 = 260
If Ergebnis >= 557.31 And <= 564.65 Then Zeit1 = 120 , Zeit2 = 280
If Ergebnis >= 564.65 And <= 580.00 Then Zeit1 = 140 , Zeit2 = 300


Steuerung1:
Timer0 = Schutz
If Timer0 = 0 Then Set Relais = 0
If Timer0 = 0 Then Set Lampe = 0
If Relais = 0 And Lampe = 0 Then Goto Warten


Steuerung2:

Set Timer1 = Zeit1
Set Lampe = 1
If Timer1 = 0 Then Set Relais = 0
If Timer1 = 0 Then Set Lampe = 0
Waitms 1000
Goto Warten2



Steuerung3:

Set Timer2 = Zeit2
Lampe = Blinken
If Timer2 = 0 Then Set Relais = 0
If Timer2 = 0 Then Set Lampe = 0
Goto Warten

End If
_____________________________

LG
Michael
 
Hi Moppel, so wie ich das hier erkenne, wird das ein größerer Knorpel. Du solltest dich vielleicht Stück für Stück voran tasten, mit kleinen codestückchen, die dann, wenn sie laufen(!), zum Ganzen kombiniert werden. Dazu wäre ein Experimentierboard ganz nützlich, wo ein Taster und eine Led dran sind, die man für Ein- und Ausgabe verwenden kann. Dann wäre der erste code die Programmierung eines timers, damit du die Sicherheitsabschaltung hinkriegst. Die restlichen Zeiten könntest du mit waits vertrödeln. Die Aufdröselei nach den Temperaturwerten geht mit 'select case' ganz gut, aber das käme alles erst, wenn dein timer klappt.
Also, wie schaut denn deine hardware aus?
 
Schau Dir mal den PAP Designer an, Dein Bild macht einem mit den Pfeilen echt 'n Knoten ins Hirn.

@Tschoeatsch: select Case ist letztlich auch nichts anderes als 'ne IF-Then-Else-Kaskade (genaugenommen alles nur Conditional Branches BRxx) - aber in'ner Hochsprache natürlich besser lesbar (*Zustimm*)
 
Hochsprache, klingt ja fast als ob es Roland von Gilead gesagt hätte "grins"
Also Select Case das muss ich mir mal anschaun.
Und ist der ablaufplan so wichtig, das ich dafür noch ein Programm brauche?
Miauh...
Habe gerade die Zeit mit dem Gehäuse von meinem Programmer vertrödelt, der wird nun Hoffentlich nicht auch schnell mal einfach tot sein?!
 

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