Pumpensteuerung

Daten werden mit PORTx bzw PORTx.y gelesen und mit PINx bzw. PINx.y gelesen.
Hallo Marcus, hier meintest du bestimmt
Daten werden mit PORTx bzw PORTx.y geschrieben und mit PINx bzw. PINx.y gelesen.

Aber, wenn wir ihn jetzt noch nicht vollständig verwirrt haben, dann hier noch einen oben drauf:
Wenn z.B. der PinC.4 als Ausgang konfiguriert ist und du schreibst
PinC.4 = 1
dann wird der Ausgang PortC.4 getoggelt. Und das in 2 Takten.
Natürlich kannst du das auch durch
Toggle PortC.4
erreichen, aber erst in 4 Takten.

HBA
 
1. Ja, Tippfehler :eek:

2. Noch was zum verwirren.
Anstelle von Variable = Variable / 4 würde ich Shift Variable, right, 4 machen, das geht schneller da OP-Code dafür existiert :D
 
Hi Markus,
2. Noch was zum verwirren.
Anstelle von Variable = Variable / 4 würde ich Shift Variable, right, 4 machen, das geht schneller da OP-Code dafür existiert :D

durch vier Teilen entspricht rechts shift um 2, hast sicherlich zu schnell geschrieben ;) Wenn der Compiler ausreichend "intelligent" ist, müsste er das erkennen und die Version mit dem Shift verwenden.

Grüße,
Dirk
 
Hallo Robin,

habe mir mal Deine Code angesehen und dazu habe ich folgenden Kommentar:

[0] Alle Änderungen in Deinem Code habe ich mit ' /* Ma */ gekennzeichnet



CodeBox Bascom

$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$framesize = 100
$swstack = 100

'Automatikgeschwindigkeit ein - aus
Config Pind.6 = Output ' /* Ma */
Led_automatik Alias Portd.6

'höchster Geschwindigkeitswert, der mit Poti eingestellt worden ist ' /* Ma */
Config Pind.5 = Output
Led_auto_geschwindigkeit_hoch Alias Portd.5

'höchster Geschwindigkeitswert -30
Config Pinb.4 = Output ' /* Ma */
Led_auto_geschwindigkeit_mittel Alias Portb.4

'höchster Geschwindigkeitswert - 60
Config Pinb.5 = Output ' /* Ma */
Led_auto_geschwindigkeit_niedrig Alias Portb.5

'Taster zum Einschalten der "Automatik-Funktion" Taster=0, Automatik ein, Taster-
'druck erfolgt erneut, Automatik ausgeschaltet
Config Pinc.4 = Input ' /* Ma */
Portc.4 = 0 ' /* Ma */ PullUp ausschalten
Taster_automatik Alias Pinc.4

'Sensor für die mit Poti R15 eingestellte Geschwindigkeit (ORC2-Wert
Config Pind.4 = Input ' /* Ma */
Portd.4 = 0 ' /* Ma */ PullUp ausschalten
Geschw_sensor_hoch Alias Pind.4

Config Pind.1 = Input
Portd.1 = 0 ' /* Ma */ PullUp ausschalten
Geschw_sensor_mittel Alias Pind.1 ' /* Ma */

Config Pind.0 = Input ' /* Ma */
Portd.0 = 0 ' /* Ma */ PullUp ausschalten
Geschw_sensor_niedrig Alias Pind.0

'Debounce auf 50 ms festlegen
Config Debounce = 50

'Timer 1 wird konfiguriert
Config Timer1 = Timer , Prescale = 8
On Timer1 500ms_interrupt
Timer1 = 3036

Enable Timer1
Enable Interrupts

'A/D-Wandler wir konfiguriert
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

'PWM wird Konfiguriert
Config Timer2 = Pwm , Prescale = 1 , Compare = Clear
Enable Timer2
Timer2 = 0
Start Timer2

'Variable des PWM-Wertes wird auf 16 bit festgelegt
Dim Analogwert As Word

'Flag für OC2
Dim Flag_ic4_ansteuerung As Word
Flag_ic4_ansteuerung = 0

'Flag für Trockenlauf
Dim Flag_trockenanzeige As Word
Flag_trockenanzeige = 0

'Flag für Automatikprogramm
Dim Flag_automatik As Byte
Flag_automatik = 0

Dim Geschwindigkeit As Byte

'*********** MAINLOOP *************
Do
'PWM
'Analogwert wird in 10-bit-Länge digitalisiert, Kanal 1 wird festgelegt
'die anderen Pins des Port C sind frei verfügbar

Analogwert = Getadc(1)

'Anpassung der 10-bit des ADC auf byte-Größe des Timer 2
Analogwert = Analogwert / 4

'Höchstmöglicher Analogwert
If Analogwert > 255 Then
Analogwert = 255
Else
'Ansonsten eingestellter Wert zwischen 0 und 255
Ocr2 = Analogwert
End If

'Bei Tasterwechsel 1 auf Null soll Subroutine Automatik angesprungen werden
Debounce Pinc.4 , 0 , Automatik , Sub
Loop

End

500ms_interrupt:
Timer1 = 3036
If Flag_automatik = 0 Then
Incr Flag_automatik
If Flag_automatik > 0 Then
Led_automatik = 1
Toggle Led_automatik
End If
End If

If Taster_automatik = 0 And Flag_automatik = 0 Then
Led_automatik = 0
End If
Return

'Sub Automatik
Automatik:
Flag_automatik = 0
'Falls Taster_Automatik und Flag_automatik = 0 sind(beim ersten Drücken des Tasters)
If Taster_automatik = 0 And Flag_automatik = 0 Then
'erhöhe Flag_automatik um den Wert 1
Incr Flag_automatik

'Wenn Flag_automatik den Wert 100 erreicht hat - um Überlauf zu vermeiden, bleibt der Wert auf
'100 stehen
If Flag_automatik > 100 Then
Flag_automatik = 100
End If
End If

If Geschw_sensor_hoch = 1 And Geschw_sensor_mittel = 1 And Geschw_sensor_niedrig = 1 Then
Geschwindigkeit = Analogwert
Led_auto_geschwindigkeit_hoch = 1
Led_auto_geschwindigkeit_mittel = 1
Led_auto_geschwindigkeit_niedrig = 1
End If


If Geschw_sensor_hoch = 0 And Geschw_sensor_mittel = 1 And Geschw_sensor_niedrig = 1 Then
Geschwindigkeit = Analogwert - 30
Led_auto_geschwindigkeit_hoch = 0
Led_auto_geschwindigkeit_mittel = 1
Led_auto_geschwindigkeit_niedrig = 1
End If


If Geschw_sensor_hoch = 0 And Geschw_sensor_mittel = 0 And Geschw_sensor_niedrig = 1 Then
Geschwindigkeit = Analogwert - 60
Led_auto_geschwindigkeit_hoch = 0
Led_auto_geschwindigkeit_mittel = 0
Led_auto_geschwindigkeit_niedrig = 1
End If

'Abschalten der Automatik
If Taster_automatik = 0 And Flag_automatik > 1 Then
Led_automatik = 0
Led_auto_geschwindigkeit_hoch = 0
Led_auto_geschwindigkeit_mittel = 0
Led_auto_geschwindigkeit_niedrig = 0
Flag_automatik = 0
Geschw_sensor_hoch = 1
Geschw_sensor_mittel = 1
Geschw_sensor_niedrig = 1

'Pumpengeschwindigkeit soll die der eingestellten Gescw. entsprechen
Geschwindigkeit = Analogwert
End If
Return




[1] Die Konfiguration Deiner Input- und Output-Pin's war meiner Meinung nach nicht korrekt

[2] Hast Du schon mal geprüft, ob Deine PWM überhaupt funktioniert? Ich vermisse die Initialisierung der CompareA und CompareB Register!!
==> schau Dir mal die PWM-Konfiguration an

[3] Ich bin mir nicht sicher ob die Verkettung von Debounce mit normalen Abfragen des PIN's so glücklich ist. Ich vermute daher rührt Dein Problem.

Es heißt in der Beschreibung:
The DEBOUNCE statement tests the condition of the specified pin and if true there will be a delay for 25 mS and the condition will be checked again. (eliminating bounce of a switch)
When The Condition Is Still True And There Was No Branch Before , It Branches To Specified The Label.
When The Condition Is Not True , Or The Logic Level On The Pin Is Not Of The Specified Level , The Code On The Next Line Will Be Executed.
When Debounce Is Executed Again , The State Of The Switch Must Have Gone Back In The Original Position Before It Can Perform Another Branch. So If You Are Waiting For A Pin To Go Low , And The Pin Goes Low , The Pin Must Change To High , Before A New Low Level Will Result In Another Branch.
Each Debounce Statement , Which Uses A Different Port , Uses 1 Bit Of The Internal Memory To Hold Its State. And As The Bits Are Stored In Sram , It Means That Even While You Use Only 1 Pin / Bit , A Byte Is Used For Storage Of The Bit.
Debounce Will Not Wait For The Input Value To Met The Specified Condition. You Need To Use Bitwait If You Want To Wait Until A Bit Will Have A Certain Value.
Auf jeden Fall wertest Du den PIN auch in der Interrupt-Routine aus. Diese unterbricht so oder so das Verhalten von Debounce und damit beginnt das gewürstel! Hmmmmm, habs nur überflogen aber das gefällt mir nicht.
Das würde ich auf jeden Fall anders lösen und ggf. den PIN auch in der Main-Loop von Hand abfragen und nicht über Debounce.
Debounce wartet auch und spring sogar erst, wenn sich am Zustand wirklich etwas geändert hat.

Die Logik in den IF's usw. habe ich jetzt mal noch nicht angeschaut da ich nicht genau verstanden habe wie Dein Programm arbeiten soll und Du das besser weißt.

Aber die Kommentare wären meiner Meinung nach mal ein Ansatz zum Nachdenken!

Grüße,
Markus
 
Hallo Zusammen,

nochmal kurz ein paar Worte eines Nicht- Profis zu der Konfiguration der Ports eines AVR:
Die Verwirrung bei AVR- Neustartern, wie anfänglich auch bei mir, zeigt sich in den verschiedenen Schreibweisen wie DDRB=0 oder Configx.y=z.
Ich verwende inzwischen im Programmkopf diese Schreibweise (Beispiel):

DDRB = &B0000_0001 ' PortB = Eingang, B.0 Ausgang
PORTB = &B0000_0000 ' PullUp's aus
VAR alias PORTB.0

Und zwar setze ich ALLE verfügbaren Ports (je nach AVR), also auch die, die nicht gebraucht werden. So habe ich immer einen Überblick, welche PIN's wie abgefragt und welche PORTS wie gesetzt werden müssen. Alle PullUp's sind standardmässig aus bis auf die, die von vornherein gebraucht werden. Die Bits setze ich dann je nach Bedarf des Programmablaufs. So weiss ich immer, was rein und was raus soll.

Diese "saubere" Schreibweise macht meines Erachtens wohl am ehesten Sinn. SO kann sich der Eine oder Andere vielleicht schon eher das Shiften/ Durchzählen der Bits eines (oder mehrerer) PORTS, z. Bsp. für ein LED- Lauflicht, vorstellen.


Grüsse,

Michael
 
Hallo zusammen,

seit vorgestern sind ja sehr viele interessante Beiträge eingestellt worden, die ich gerade esrt einmal überflogen habe; vielen Dank für Eure Hilfe, mir das Leben mit Bascom ein wenig zu erleichtern!:flowers: :flowers:

Dirk, Dein Beitrag zur Preisentwicklung/-gestaltung im Elektroniksektor bestätigt meine Vermutung. Die Warenmenge wird künstlich reduziert, um entweder den Markt zu testen, ob sich dieser Preis dauerhaft durchsetzen lässt oder es werden nun "Reparationskosten" eines Marktkrieges gezahlt. Die Leittragenden sind letztendlich die "Kleinen", in erster Linie die kleinen und mittleren Elektronikvertriebe, bedingt durch Umsatzrückgänge ihres Klientels. Der Großdistributor beliefert weiterhin lustig die Industrie, die die "produktbedingten" Erhöhungen an den Endverbraucher mittels "dezenter Preisnivilierung" weiter leitet. Weshalb auch zwei Liter Milch verkaufen, wenn ich für einen Liter den gleichen Preis erzielen kann!:rolleyes:

Die interessanten Beiträge über Port und Pin, die Hinweise, wie man diesen allzeit lauernden Fallen entgehen kann, schaue ich mir morgen mal in Ruhe genauestens an. Das scheint schlechthin die Fehlerquelle des Anfängers zu sein.

Markus, vielen Dank für Deine Hilfe, auch bei der Durchsicht meines Codes. Morgen werde ich mal die Änderungen umsetzen und dann werde ich mich wieder melden. Die PWM funktioniert sehr gut, bis zur LED4, die sich butterweich dimmen lässt. Mit heißer Kohle habe ich die Platine noch nicht befeuert. Cassio erhob ja auch dahingehend Einspruch und bemängelt den vorgesehenen MOC3042 mit Nulldurchgangsdetektor. Ich habe beide da und werde es mal testen. Mal sehen, wie sich voreilende Spannung oder hinkender Strom bei dem 10 Watt Pümpchen verhalten werden, wenn's ernst wird.

Ich finde es toll, dass Ihr Eure Zeit opfert, mir bei meinem Problem zu helfen, schließlich könntet Ihr diese Zeit auch anders nutzen!!

Schöne Grüße

robin
 
Hi Robin,

Cassio erhob ja auch dahingehend Einspruch und bemängelt den vorgesehenen MOC3042 mit Nulldurchgangsdetektor. Ich habe beide da und werde es mal testen. Mal sehen, wie sich voreilende Spannung oder hinkender Strom bei dem 10 Watt Pümpchen verhalten werden, wenn's ernst wird.
paß beim dimmen auf das du keine Gleichspannungsanteile erhälst. Also zB die
positive Halbwelle länger als die negative durchgesteuert wird. Das haben
induktive Lasten wegen der kleinen Gleichspannungswiderstände sehr ungern.
Ich hab das mal schmerzhaft erfahren indem ich mir so ca 8-10 Halogentrafos
gehimmelt habe (durchgekocht und dann durchgebrannt). Ohmsche Lasten wie
230V-Glühlampen haben da keine Probleme mit.

Ich hab mir für sowas mal nen Meßgerät gebaut. Oder wenn du es einfach
haben willst, dann stell mal dein Multimeter auf 400V DC ein und pack es
parallel zur Pumpe. Wenn du 0V siehst ist alles OK. Wenn es positiv oder
negativ wird (vor allem für mehrere Sekunden) dann solltest du vorsichtig
werden.

Bei mir war das Problem das ich 3-Quadranten-TRIACS verwendet habe.
Mit 4-Quadranten-TRIACS war das Problem weg. Das mit den Quadranten
heißt so weil du ein Diagramm mit positiven und negativen Steuer- und
Lastströmen hast. Durch die Kombinationen +S/+L , +S/-L , -S/+L , -S/-L
hat man dann Kennlinien in 4 Quadranten des Diagramms (oder eben nur 3).

Gruß
Dino
 
Hi Dino, besten Dank für den Tipp! Frage: Welche Triacs hattest Du verwendet?

Beste Grüße

robin
 
Hi Robin,

Frage: Welche Triacs hattest Du verwendet?
:eek: Ups ... Gute Frage, nächste frage ... :eek:
Das ist schon nen paar Jährchen her ...
da muß ich erstmal ein wenig in alten Unterlagen graben. Ich weiß noch das die
komplett isoliert waren. Also brauchst du keine Isolierscheiben für den Kühlkörper.
Und die konnten glaube ich 8A oder so ab. Ich hab sie auf jeden Fall mit 6,3A
träge abgesichert.

Ich suche mal ...

Gruß
Dino
 
Hi zusammen,

ich habe nun an dem Quelltext lange Zeit herumgeschraubt, einiges verändert, aber es läuft nicht:confused: :confused: ! Ich stelle den Quelltext nochmals ein, der blaue Teil macht keine Probleme, der rote Teil umso mehr. Ich schreibe dazu, was das Programm an den kritischen Stellen machen soll, vllt. sieht von Euch ja jemand den Fehler, den ich nicht sehe.


Code:
[COLOR="Blue"]$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$framesize = 100
$swstack = 100



'BPW42 - Tag-Nacht-Erkennung
'Pullup ausgeschaltet  D.2=0 Tag, D.2=1 Nacht
Config Pind.2 = Input
Portd.2 = 0
Bpw42 Alias Pind.2

'Ic4 Ansteuerung mit PWM
Config Pinb.1 = Output
Ic4_ansteuerung Alias Portb.1

'Einschaltzeit IC4
Config Pinb.3 = Output
Ic4_ansteuerzeit Alias Portb.3

'LED für Trockenlauf
Config Pinb.0 = Output
Led_trockenlauf Alias Portb.0

'LED für Tagbetrieb
Config Pinb.2 = Output
Led_tag Alias Portb.2

'LED für Nachtbetrieb
Config Pind.7 = Output
Led_nacht Alias Portd.7

[COLOR="Blue"]'Trockenlaufsensor
'  Pullup ausgeschaltet  D.3=0 Trockenlauf. D.3=1 Normalbetrieb
Config Pind.3 = Input
Portd.3 = 0
Trockenlaufsensor Alias Pind.3[/COLOR]



[/COLOR]


[COLOR="Blue"]'A/D-Wandler wir konfiguriert
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc


'Tmer 1 wird konfiguriert
Config Timer1 = Timer , Prescale = 8
On Timer1 500ms_interrupt
Timer1 = 3036
Enable Timer1
Enable Interrupts


'PWM wird Konfiguriert
Config Timer2 = Pwm , Prescale = 1 , Compare = Clear
Enable Timer2
Timer2 = 0
Start Timer2





'Variable des PWM-Wertes wird auf 16 bit festgelegt
Dim Analogwert As Word


'Flag für OC2
Dim Flag_ic4_ansteuerung As Word
Flag_ic4_ansteuerung = 0

'Flag für Trockenlauf
Dim Flag_trockenanzeige As Word
Flag_trockenanzeige = 0

[COLOR="Black"]Variable soll hochgezählt werden, wenn das Automatikprogramm eingeschaltet wird und Null sein, wenn das Automatikprogramm ausgeschaltet wurde. Startbedingung: Automatik ist aus[/COLOR]
[COLOR="Red"]Dim Flag_automatik As Byte
Flag_automatik = 0[/COLOR]
[/COLOR]

[COLOR="Black"]ist maximal so groß wie der Analogwert (OCR2), minimal: Analogwert -60 [/COLOR]
[COLOR="Red"]Dim Geschwindigkeit As Byte

[COLOR="Black"]'Automatik ein - aus, die LED soll blinken, wenn die Automatik mit 'Taster_Automatik eingeschaltet worden ist[/COLOR]
Config Pind.6 = Output
Led_automatik Alias Portd.6


[COLOR="Black"]'höchster Geschwindigkeitswert, der mit Poti eingestellt worden ist[/COLOR]
Config Pind.5 = Output
Led_auto_geschwindigkeit_hoch Alias Portd.5


[COLOR="Black"]'höchster Geschwindigkeitswert - 30[/COLOR]
Config Pinb.4 = Output
Led_auto_geschwindigkeit_mittel Alias Portb.4


[COLOR="Black"]'höchster Geschwindigkeitswert - 60[/COLOR]
Config Pinb.5 = Output
Led_auto_geschwindigkeit_niedrig Alias Portb.5


[COLOR="Black"]'Taster zum Einschalten der "Automatik-Funktion" Taster=0, Automatik ein, 'Tasterdruck erfolgt erneut, Automatik ausgeschaltet[/COLOR]
Config Pinc.4 = Input
Portc.4 = 0
Taster_automatik Alias Pinc.4


[COLOR="Black"]'Sensor für die mit Poti R15 eingestellte Geschwindigkeit (ORC2-Wert)[/COLOR]
Config Pind.4 = Input
Portd.4 = 0
Geschw_sensor_hoch Alias Pind.4

[COLOR="Black"]'Sensor für die mit Poti R15 eingestellte Geschwindigkeit (ORC2-Wert) minus 30[/COLOR]
Config Pind.1 = Input
Portd.1 = 0
Geschw_sensor_mittel Alias Pind.1

[COLOR="Black"]'Sensor für die mit Poti R15 eingestellte Geschwindigkeit (ORC2-Wert) minus 60[/COLOR]
Config Pind.0 = Input
Portd.0 = 0
Geschw_sensor_niedrig Alias Pind.0


'Debounce auf 50 ms festlegen
Config Debounce = 50

[/COLOR]


  '*********** MAINLOOP *************
[COLOR="Blue"]Do

'PWM
'Analogwert wird in 10-bit-Länge digitalisiert, Kanal 1 wird festgelegt
'die anderen Pins des Port C sind frei verfügbar
Analogwert = Getadc(1)


'Anpassung der 10-bit des ADC auf byte-Größe des Timer 2
Analogwert = Analogwert / 4

'Höchstmöglicher Analogwert
If Analogwert > 255 Then
Analogwert = 255
Else

'Ansonsten eingestellter Wert zwischen 0 und 255
Ocr2 = Analogwert
End If



'*** Auswertung Trockenlaufsensor

 If Trockenlaufsensor = 0 Then

      Ic4_ansteuerung = 0
      Flag_ic4_ansteuerung = 0
      Flag_trockenanzeige = 0

'Anzeige Trockenlauf bereits gestartet?
    If Flag_trockenanzeige = 0 Then
       Incr Flag_trockenanzeige
    End If
'nach xx Interrupts Blinken
    If Flag_trockenanzeige >= 480 Then                      '4 Minuten
    If Trockenlaufsensor = 1 Then
    Ic4_ansteuerung = 1
    Else
    Ic4_ansteuerung = 0
    End If
    End If

  End If




'*** Auswertung Lichtsensor
  If Bpw42 = 0 Then

    Gosub Tag

       If Flag_ic4_ansteuerung = 0 Then
      Incr Flag_ic4_ansteuerung
    End If

Else
    Gosub Nacht

    'Starte Nachtmodus
    If Flag_ic4_ansteuerung = 0 Then
      Incr Flag_ic4_ansteuerung
    End If

    'IC4-Ansteuerung Auszeit  (xx * 500ms)
 '10 Minuten ausgeschaltet
    If Flag_ic4_ansteuerung <= 1200 Then                    'Auszeit = 10 Minuten 1200:2:60= 10 Minuten
       Ic4_ansteuerung = 0
    'Relais Anzeit  (xx * 500ms)
 '3 Minuten eingeschaltet
   Elseif Flag_ic4_ansteuerung <= 1560 Then                 'Anzeit =Auszeit + 4 Minuten = 1200+360 !!!!

       Ic4_ansteuerung = 1
                                  '
 Else
       Flag_ic4_ansteuerung = 0
    End If

  End If

[/COLOR]
[COLOR="Black"]Hier wird die Variable auf max. 100 beschränkt[/COLOR]
[COLOR="Red"]If Flag_automatik > 100 Then
Flag_automatik = 100
End If


[COLOR="Black"]'Taster wird entprellt und beim Wechsel von 1 auf 0 zur Sub Automatik gesprungen, die Automatik wird eingeschaltet[/COLOR]
Debounce Pinc.4 , 0 , Automatik , Sub

[COLOR="Black"]'Automatik ausschalten, Taster dürfte nicht entprellt sein. wie ich das anstellen kann, weiß ich noch nicht????[/COLOR]
If Taster_automatik = 0 And Flag_automatik > 0 Then
 Gosub Automatik_aus
 End If

[COLOR="Black"]'Wenn die Automatik eingeschaltet ist, ist die Flag_automatik um eins erhöht und somit >0[/COLOR]
If Flag_automatik > 0 Then
[COLOR="Black"]'Und die Sensoren (Stabelektroden) vom Wasserstand überdeckt sind[/COLOR]
 If Geschw_sensor_hoch = 1 And Geschw_sensor_mittel = 1 And Geschw_sensor_niedrig = 1 Then
[COLOR="Black"]'ist die Automatikgeschwindigkeit gleich dem Wert Des Analogwertes (OCR2-Wert)[/COLOR]
 Geschwindigkeit = Analogwert
[COLOR="Black"]Alle 3 LED sollen leuchten und die LED_Automatik soll blinken[/COLOR]
 Led_auto_geschwindigkeit_hoch = 1
 Led_auto_geschwindigkeit_mittel = 1
 Led_auto_geschwindigkeit_niedrig = 1
 End If

[COLOR="Black"]Die erste Elektrode ragt aus dem Wasser heraus, die beiden anderen befinden sich noch im Wasser. Analogwert wird um 30 reduziert, [/COLOR]
 If Geschw_sensor_hoch = 0 And Geschw_sensor_mittel = 1 And Geschw_sensor_niedrig = 1 Then
 Geschwindigkeit = Analogwert - 30
[COLOR="Black"]2 LED sollen leuchten und die LED_Automatik soll blinken[/COLOR]
 Led_auto_geschwindigkeit_hoch = 0
 Led_auto_geschwindigkeit_mittel = 1
 Led_auto_geschwindigkeit_niedrig = 1
 End If

[COLOR="Black"]Die erste und die zweite Elektrode ragen aus dem Wasser heraus, die andere befindet sich noch im Wasser. Analogwert wird um 60 reduziert, [/COLOR]
 If Geschw_sensor_hoch = 0 And Geschw_sensor_mittel = 0 And Geschw_sensor_niedrig = 1 Then
 Geschwindigkeit = Analogwert - 60
[COLOR="Black"]1 LED soll leuchten und die LED_Automatik soll blinken[/COLOR]
 Led_auto_geschwindigkeit_hoch = 0
 Led_auto_geschwindigkeit_mittel = 0
 Led_auto_geschwindigkeit_niedrig = 1
 End If

End If


If Flag_automatik = 0 Then
 Gosub Automatik_aus

End If
[/COLOR]
Loop

End


500ms_interrupt:
    [COLOR="Blue"]Timer1 = 3036
    If Flag_trockenanzeige > 0 Then
      Incr Flag_trockenanzeige
      Toggle Led_trockenlauf
    End If

If Flag_trockenanzeige > 0 Then
If Flag_trockenanzeige <= 480 Then
    Ic4_ansteuerung = 0
   Flag_ic4_ansteuerung = 0

    Else
    Ic4_ansteuerung = 1
     Flag_trockenanzeige = 0
    Led_trockenlauf = 0
  End If
  End If

    If Flag_ic4_ansteuerung > 0 Then
      Incr Flag_ic4_ansteuerung
    End If
[/COLOR]




[COLOR="Black"]'Nach dem Betätigen des Tasters_Automatik erfolgt Sprung zur Sub Automatik, die Var. Flag_automatik wird von 0 auf 1 erhöht, wodurch hier nun die LED zu blinken beginnen soll[/COLOR]
 [COLOR="Red"]If Flag_automatik > 0 Then
  'Incr Flag_automatik
  Toggle Led_automatik

End If
[COLOR="Black"]Falls die Automatik ausgeschaltet wird (in Sub Automatik_aus wird dort Flag_automatik auf 0 gesetzt), soll die LED nicht mehr blinken[/COLOR]
If Flag_automatik = 0 Then
Led_automatik = 0
End If

Return[/COLOR]





[COLOR="Red"]'Sub Automatik
Automatik:
[COLOR="Black"]Bei Betätigung des Tasters ist die Variable Flag_automatik = 0. Sie soll nun um einen Wert auf eins erhöht werden. Dadurch soll in der Sub 500ms_interrupt die LED_automatik getoggelt werden.[/COLOR]
Flag_automatik = 0
Incr Flag_automatik

[COLOR="Black"]'Falls der Taster erneut gedrückt wird, soll die Sub Automatik_Aus abgesprungen und dort die automatik abgeschaltet werden. Bedingung ist, dass die Variable >0 sein muss, sonst würde die Automatik ja eingeschaltet.[/COLOR]
If Flag_automatik > 0 And Taster_automatik = 0 Then
Gosub Automatik_aus
End If


[COLOR="Black"]'Wenn Flag_automatik den Wert 100 erreicht hat - um Überlauf und damit verbunden die Null zu vermeiden, bleibt der Wert auf
'100 stehen[/COLOR]
  If Flag_automatik > 100 Then
  Flag_automatik = 100
  End If

Return



    
Automatik_aus:
[COLOR="Black"] 'Abschalten der Automatik. Nullsetzen der Variablen Flag_automatik, damit Bedingung für das erneute Einschalten der Automatik gegeben ist.[/COLOR]

If Taster_automatik = 0 And Flag_automatik > 0 Then
Led_automatik = 0
Led_auto_geschwindigkeit_hoch = 0
Led_auto_geschwindigkeit_mittel = 0
Led_auto_geschwindigkeit_niedrig = 0
Flag_automatik = 0
End If

'Pumpengeschwindigkeit soll dem Analogwert (OCR2-Wert) entsprechen
Geschwindigkeit = Analogwert


Return
[/COLOR]




[COLOR="Blue"]'Sub Tag
Tag:
If Flag_trockenanzeige > 0 Then
Ic4_ansteuerung = 0
Else
Ic4_ansteuerung = 1
End If

  Led_tag = 1
  Led_nacht = 0
Return



[COLOR="Red"][/COLOR]
'Sub Nacht
Nacht:
  Led_tag = 0
  Led_nacht = 1

Return[/COLOR]



Ich hoffe, die Erläuterungen sind so verständlich, dass Ihr nachvollziehen könnt, was ich dort mit dem "Automatikbetrieb anstellen" möchte.

Im Zusammenhang nochmals: In meiner Filterkammer hängen vier Stabelektroden, die bei gesäubertem Filtermaterial alle mit Wasser bedeckt sind. Mit dem Poti stelle ich eine Geschwindigkeit der Pumpe ein (Analogwert oder OCR2-Wert von 0 bis 255). Dann schalte ich die"Automatik" ein.

Da das Filtermaterial noch sauber ist, sinkt der Wasserspiegel in der Pumpenkammer auch nicht ab, die Elektroden sind mit Wasser überdeckt, die
gewählte Geschwindigkeit kann gehalten werden. Nun verschmutzt das Filtermaterial zunehmend, der Wasserstand sinkt. Sinkt er so tief, dass die erste, kürzeste Elektrode aus dem Wasser herausragt, wird die Pumpengeschwindigkeit um den Wert 30 reduziert. Schreitet die Verschmutzung weiter voran, ragt auch bald die zweite E. aus dem Wasser heraus, die Geschwindigkeit wird dann noch einmal um 30reduziert.

Es wäre nett von Euch, wenn Ihr nochmals einen Blick auf den Quelltext werfen könntet.

Schöne Grüße
robin
 
Hallo,

ich habe meine Programmprobleme inzwischen auf den rot gekennzeichneten Bereich reduziert. Der blau gekennzeichnete sowie die anderen Programmteile funktionieren einwandfrei.

Ich verstehe bei dem rot gekennzeichneten Codeteil nicht, weshalb ich von einem eingestellten (Poti-)Wert zwischen 0 und 255 , z. B. 125, sich so nicht 60 subtrahieren lassen.

Der Quelltext gibt vor, dass der 1024 Bit-Wert des ADC durch 4 dividiert, den 256 Bit-Wert "Analogwert" ergeben soll, der wiederum durch den Maximalwert 255 begrenzt wird. Theoretisch sollte sich doch der um 60 reduzierte OCR2- Wert in der verminderten Helligkeit einer LED sichtbar machen lassen; passiert aber nichts:confused: .

Verwendet man compare, wie Markus es anregte, und weist diesem Befehl einen Wert zu, z. B. compare = 60, stellt sich die Helligkeit auf diesen festen Wert ein und lässt sich mit dem Poti nicht mehr verändern.

Hat ev. jemand einen heißen Tipp? Ich habe den entsprechenden Codeteil geändert und unten nochmals eingestellt.



Code:
$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$framesize = 100
$swstack = 100



Config Pind.4 = Input
Portd.4 = 0
Taster_hoch Alias Pind.4

Config Pind.1 = Input
Portd.1 = 0
Taster_mittel Alias Pind.1


Config Pind.0 = Input
Portd.0 = 0
Taster_niedrig Alias Pind.0


Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Dim Analogwert As Word





Config Timer2 = Pwm , Prescale = 1 , Compare = Clear , Pwm = On
Enable Timer2
Timer2 = 0
Start Timer2





[COLOR="Blue"]Do

Analogwert = Getadc(1)

Analogwert = Analogwert / 4


If Analogwert > 255 Then
Analogwert = 255
Else

Ocr2 = Analogwert
End If
[/COLOR]



[COLOR="Red"]If Taster_niedrig = 1 Then
Ocr2 = Analogwert - 60
'Ocr2 = Geschwindigkeit_m

End If[/COLOR]



Loop
 
Hallo Robin!

Sorry, ich habe den Thread nicht verfolgt, aber hast du ggf. bei deinem oben eigestellten Beispiel den Code gekürzt? :hmmmm:

Wenn ich mir das sonst in der Form so ansehe, wirst du den Tasterdruck (Ocr2 = Analogwert - 60) gar nicht bemerken.


Hast du die Möglichkeit dir per RS232 Daten an ein Terminal ausgeben zu lassen?


Grüße,
Cassio
 
Hallo Cassio,

oh ja, den habe ich extrem verkürzt. Der ganze Quelltext schien wohl zu lang zu sein, als dass sich jemand damit auseinandergesetzt hätte. So habe ich lediglich noch das eingestellt, was noch Ärger macht.

Den "Tastendruck" kannst Du als lange 1 oder 0 ansehen, da er später mal von Elektroden, die über Transistoren eine eindeutige 1 oder 0 an den Mega8 geben, ansehen. Auf meinem Steckbrett habe ich den Taster als feste Masseverbindung für die"0" oder als eine feste Verbindung mit einem 10k als "1" realisiert. Das Schalbild hatte ich auf Seite 1 eingestellt.

Die Möglichkeit der Ausgabe über RS 232 habe ich nicht. Ich brenne über einen USB-AVR-ISP-Brenner.

Sind denn meine "Gedankengänge" in meiner Kommentierung des rot markierten Quelltextes richtig?

Schöne Grüße
robin
 
Hallo Robin!

Die Möglichkeit der Ausgabe über RS 232 habe ich nicht. Ich brenne über einen USB-AVR-ISP-Brenner.

Ich kann Dir nur wirklich ans Herz legen, bei einem Programm was wirklich nicht will und dessen Ablauflogik man auch nicht ganz versteht den Nutzen einer RS232 "zu nutzen" und mittels MAX232 eine Debug- und Trace-Ausgabemöglichkeit zu schaffen. SW kann vertrakt sein und für Entwickler welche nich tagtäglich programmieren ist es wirklich ein hilfreiches Werkzeug.

Ob Du mit USB proggst oder nicht ist dabei egal. Hänge an den Mega über TxD und Rxd einen MAX232 ran und besorge Dir einen RS232_2_USB Adapter, z.B. den Digitus und "schau in Dein Programm rein".
Ich kann es Dir wirklich nur ans Herz legen.

Hast Du Dir z.B. schon mal angeschaut, welchen Analogwert wirklich der ADC liefert?

Grüße,
Markus
 
Hallo,

Ob Du mit USB proggst oder nicht ist dabei egal. Hänge an den Mega über TxD und Rxd einen MAX232 ran und besorge Dir einen RS232_2_USB Adapter, z.B. den Digitus und "schau in Dein Programm rein".
Ich kann es Dir wirklich nur ans Herz legen.
das kann ich nur unterstreichen. Wenn ich an nem Controller ein LCD dran habe
dann benutze ich das für Debug-Infos. Sonst natürlich ne RS232. Vor allem
wenn viele Werte beobachtet werden müssen oder sie sich schnell ändern ist
die RS232 unverzichtbar.

Also ...

Atmel(TxD/RxD)-->--MAX232-->--RS232/USB-Dongle-->--PC(USB-Port)-->--Terminalprogramm

Es gibt viele Möglichkeiten um Infos aus dem Innenleben des Programms
"nach außen" zu liefern : LEDs, LCDs, RS232, ...
Wobei eine RS232 mit zB 115kBaud schnell Infos liefern kann und durch den
Einsatz bei der Baudrate am wenigsten CPU-Zeit verbraucht. Mit nem
USB-Dongle kann man die Baudrate auch noch höher schrauben (250kBaud).

Gruß
Dino
 
Hallo zusammen,

frohes neues Jahr!

Nach den Feiertagen und einem verdienten Urlaub melde ich mich mal wieder zurück, um mal an meinem "Vorhaben" weiterzustricken. Inzwischen habe ich mir auch eine PCI-Karte mit einer seriellen Schnittstelle besorgt und ein Nullmodemkabel. In R. Walters Buch steht nun auch was über das "Aushorchen" eines Mega8 beschrieben. Das werde ich mir erst einmal zu Gemüte führen und schauen, was der 28-Beiner so ausspucken wird. Ich melde mich dann wieder, wenn ich hängen bleiben sollte oder aber, wenn es gepasst hat.

Schöne Grüße

robin
 
Hallo Robin,

das hört sich ja gut an. Na dann mal viel Spass.

Aufpassen mit dem Nullmodemkabel .... TxD vom Kontroller muss zum RxD vom PC und umgekehrt. Nicht dass Du Dir in Deiner Bastelei mit Rx und Tx und Max usw. einen Doppeldreher einbaust denn in der Digitaltechnik wird aus NIX & NIX wieder was :D

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)