Anzeige:

Digitale Lösung für Schaltungen / Problem?

Hier finden sie die archivierten Beiträge des alten PHPBB Forums von www.loetstelle.net

Von Tux77 am 03.06.2009 22:10

Hallo Gerold,

So das hab ich geändert, aber er reagiert trotzdem nicht.

Wie meintest Du das mit den 3 Variablen, schreib mal bitte ein Beispiel, ich stehe grade ein wenig auf dem Schlauch.

MfG
Nicola

Von gerold am 03.06.2009 22:39

Tux77 hat folgendes geschrieben:
Wie meintest Du das mit den 3 Variablen, schreib mal bitte ein Beispiel, ich stehe grade ein wenig auf dem Schlauch.

Hallo Nicola!

Ich meinte das mit dem Mittelwert in etwa so:
Code:
CONFIG ADC = SINGLE, PRESCALER = AUTO, REFERENCE = AVCC
START ADC

DIM messergebnis AS WORD
DIM mittelwert AS WORD
DIM i AS BYTE


mittelwert = 0
FOR i = 1 TO 3
    messergebnis = GETADC(0)
    mittelwert = mittelwert + messergebnis
    WAITMS 1
NEXT i
mittelwert = mittelwert / 3

mfg
Gerold
Smile

Von Tux77 am 03.06.2009 23:03

Hallo Gerold,

Danke für die Anregung, werde deinen Vorschlag mal umsetzen, aber nicht mehr heute.
Mein anderes Programm mit der 2fach Messung funktioniert jetzt auch.
Hier das funktionierende Programm (falls jemand Interesse an dem Projekt hat):

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

'Variablen
Dim Tuer_motor_counter As Integer
Dim Fenster_motor_counter As Integer
Dim Sonnen_sensor_counter As Integer
Dim Mess_counter As Integer
Dim Lichtwert As Word
Dim Rollo_status As Bit
Dim Mess_status As Byte

'Schalter
Taster_tuer_auf Alias Pind.1
Config Taster_tuer_auf = Input                              'Tür AUF

Taster_tuer_ab Alias Pind.0
Config Taster_tuer_ab = Input                               'Tür AB

Taster_gesamt_auf Alias Pinc.6
Config Taster_gesamt_auf = Input                            'Gesamt AUF

Taster_gesamt_ab Alias Pinc.5
Config Taster_gesamt_ab = Input                             'Gesamt AB

Taster_fenster_auf Alias Pinc.4
Config Taster_fenster_auf = Input                           'Fenster AUF

Taster_fenster_ab Alias Pinc.3
Config Taster_fenster_ab = Input                            'Fenster AB

Taster_fenster_stop Alias Pind.2
Config Taster_fenster_stop = Input                          'Fenster STOP

Taster_tuer_stop Alias Pind.3
Config Taster_tuer_stop = Input                             'Tuer STOP

'Motor
Motor_fenster_auf Alias Portd.7
Config Motor_fenster_auf = Output                           'Fenster AUF

Motor_fenster_ab Alias Portc.0
Config Motor_fenster_ab = Output                            'Fenster AB

Motor_tuer_auf Alias Portc.1
Config Motor_tuer_auf = Output                              'Tür AUF

Motor_tuer_ab Alias Portc.2
Config Motor_tuer_ab = Output                               'Tür AB

'Timer0 konfigurieren (15,2587890625 Überläufe/sec)
Config Timer0 = Timer , Prescale = 256
On Timer0 On_timer0
Enable Timer0

'ADC konfiguration
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc


'Interrupts global einschalten
Enable Interrupts


'Hauptschleife
Do
   Debounce Taster_fenster_auf , 1 , Motor_fenster_auf_einschalten , Sub
   Debounce Taster_fenster_ab , 1 , Motor_fenster_ab_einschalten , Sub
   Debounce Taster_tuer_auf , 1 , Motor_tuer_auf_einschalten , Sub
   Debounce Taster_tuer_ab , 1 , Motor_tuer_ab_einschalten , Sub
   Debounce Taster_gesamt_auf , 1 , Gesamt_auf_einschalten , Sub
   Debounce Taster_gesamt_ab , 1 , Gesamt_ab_einschalten , Sub
   Debounce Taster_fenster_stop , 1 , Motor_fenster_stop , Sub
   Debounce Taster_tuer_stop , 1 , Motor_tuer_stop , Sub

   If Fenster_motor_counter = 0 Then
      Motor_fenster_auf = 0
      Motor_fenster_ab = 0
   End If
   If Tuer_motor_counter = 0 Then
      Motor_tuer_auf = 0
      Motor_tuer_ab = 0
   End If
   If Sonnen_sensor_counter = 0 And Rollo_status = 0 Then
      Gosub Messung_1
   End If
   If Sonnen_sensor_counter = 0 And Rollo_status = 1 Then
      Gosub Messung_3
   End If
   If Mess_counter = 0 And Mess_status = 1 Then
      Gosub Messung_2
   End If
   If Mess_counter = 0 And Mess_status = 3 Then
      Gosub Messung_4
   End If
Loop

End

'Timer0-Interrupt-Handler
On_timer0:
   If Tuer_motor_counter > 0 Then
      Decr Tuer_motor_counter
   End If
   If Fenster_motor_counter > 0 Then
      Decr Fenster_motor_counter
   End If
   If Sonnen_sensor_counter > 0 Then
      Decr Sonnen_sensor_counter
   End If
   If Mess_counter > 0 Then
      Decr Mess_counter
   End If
Return


'Motor einschalten
Motor_fenster_auf_einschalten:
   Motor_fenster_ab = 0
   Waitms 200
   Motor_fenster_auf = 1
   Fenster_motor_counter = 610                              ' ca. 40 sec.
Return

Motor_fenster_ab_einschalten:
   Motor_fenster_auf = 0
   Waitms 200
   Motor_fenster_ab = 1
   Fenster_motor_counter = 610                              ' ca. 40 sec.
Return

Motor_tuer_auf_einschalten:
   Motor_tuer_ab = 0
   Waitms 200
   Motor_tuer_auf = 1
   Tuer_motor_counter = 687                                 ' ca. 45 sec.
Return

Motor_tuer_ab_einschalten:
   Motor_tuer_auf = 0
   Waitms 200
   Motor_tuer_ab = 1
   Tuer_motor_counter = 610                                 ' ca. 40 sec.
Return

Gesamt_auf_einschalten:
   Motor_fenster_ab = 0
   Motor_tuer_ab = 0
   Waitms 200
   Motor_fenster_auf = 1
   Motor_tuer_auf = 1
   Tuer_motor_counter = 610
   Fenster_motor_counter = 610
   Sonnen_sensor_counter = 27468                            ' ca. 1800 sec.
   Rollo_status = 0
Return

Gesamt_ab_einschalten:
   Motor_fenster_auf = 0
   Motor_tuer_auf = 0
   Waitms 200
   Motor_fenster_ab = 1
   Motor_tuer_ab = 1
   Tuer_motor_counter = 687
   Fenster_motor_counter = 610                              ' ca. 40 sec.
Return

Motor_fenster_stop:                                         'Fenster STOP
   Motor_fenster_auf = 0
   Motor_fenster_ab = 0
Return

Motor_tuer_stop:                                            'Tür STOP
   Motor_tuer_auf = 0
   Motor_tuer_ab = 0
Return

'Lichtwert überprüfen
Messung_1:
   Lichtwert = Getadc(0)
   If Lichtwert > 495 And Mess_status = 0 Then
   Mess_status = 1
   Mess_counter = 30
   End If
   Reset Lichtwert
Return

Messung_3:
   Lichtwert = Getadc(0)
   If Lichtwert < 470 And Mess_status = 2 Then
   Mess_status = 3
   Mess_counter = 30
   End If
   Reset Lichtwert
Return

'Sonnenautomatik ein
Messung_2:
   Lichtwert = Getadc(0)
   If Lichtwert > 495 Then
   Motor_fenster_auf = 0
   Motor_tuer_auf = 0
   Waitms 200
   Motor_fenster_ab = 1
   Motor_tuer_ab = 1
   Tuer_motor_counter = 427                                 'ca. 28 sec.
   Fenster_motor_counter = 336                              'ca. 22 sec.
   Sonnen_sensor_counter = 27468
   Rollo_status = 1
   Mess_status = 2
   Else
   Mess_status = 0
   End If
   Reset Lichtwert
Return

Messung_4:
   Lichtwert = Getadc(0)
   If Lichtwert < 470 Then
   Motor_fenster_ab = 0
   Motor_tuer_ab = 0
   Waitms 200
   Motor_fenster_auf = 1
   Motor_tuer_auf = 1
   Tuer_motor_counter = 687
   Fenster_motor_counter = 610
   Sonnen_sensor_counter = 27468
   Rollo_status = 0
   Mess_status = 0
   Else
   Mess_status = 2
   End If
   Reset Lichtwert
Return


MfG
Nicola

Von Tux77 am 17.06.2009 23:44

Hallo Gerold,

heute hab ich es gechaft deinen Vorschlag mal umzusetzen und das ist mein Ergebnis:

Code:

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

'Variablen
Dim Tuer_motor_counter As Integer
Dim Fenster_motor_counter As Integer
Dim Sonnen_sensor_counter As Integer
Dim Rollo_status As Bit
Dim Lichtwert As Word
DIM Lichtmittelwert AS WORD
DIM m AS BYTE

'Schalter
Taster_tuer_auf Alias Pind.1
Config Taster_tuer_auf = Input                              'Tür AUF

Taster_tuer_ab Alias Pind.0
Config Taster_tuer_ab = Input                               'Tür AB

Taster_gesamt_auf Alias Pinc.6
Config Taster_gesamt_auf = Input                            'Gesamt AUF

Taster_gesamt_ab Alias Pinc.5
Config Taster_gesamt_ab = Input                             'Gesamt AB

Taster_fenster_auf Alias Pinc.4
Config Taster_fenster_auf = Input                           'Fenster AUF

Taster_fenster_ab Alias Pinc.3
Config Taster_fenster_ab = Input                            'Fenster AB

Taster_fenster_stop Alias Pind.2
Config Taster_fenster_stop = Input                          'Fenster STOP

Taster_tuer_stop Alias Pind.3
Config Taster_tuer_stop = Input                             'Tuer STOP

'Motor
Motor_fenster_auf Alias Portd.7
Config Motor_fenster_auf = Output                           'Fenster AUF

Motor_fenster_ab Alias Portc.0
Config Motor_fenster_ab = Output                            'Fenster AB

Motor_tuer_auf Alias Portc.1
Config Motor_tuer_auf = Output                              'Tür AUF

Motor_tuer_ab Alias Portc.2
Config Motor_tuer_ab = Output                               'Tür AB

'Timer0 konfigurieren (15,2587890625 Überläufe/sec)
Config Timer0 = Timer , Prescale = 256
On Timer0 On_timer0
Enable Timer0

'ADC konfiguration
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc


'Interrupts global einschalten
Enable Interrupts


'Hauptschleife
Do
   Debounce Taster_fenster_auf , 1 , Motor_fenster_auf_einschalten , Sub
   Debounce Taster_fenster_ab , 1 , Motor_fenster_ab_einschalten , Sub
   Debounce Taster_tuer_auf , 1 , Motor_tuer_auf_einschalten , Sub
   Debounce Taster_tuer_ab , 1 , Motor_tuer_ab_einschalten , Sub
   Debounce Taster_gesamt_auf , 1 , Gesamt_auf_einschalten , Sub
   Debounce Taster_gesamt_ab , 1 , Gesamt_ab_einschalten , Sub
   Debounce Taster_fenster_stop , 1 , Motor_fenster_stop , Sub
   Debounce Taster_tuer_stop , 1 , Motor_tuer_stop , Sub

   If Fenster_motor_counter = 0 Then
      Motor_fenster_auf = 0
      Motor_fenster_ab = 0
   End If
   If Tuer_motor_counter = 0 Then
      Motor_tuer_auf = 0
      Motor_tuer_ab = 0
   End If
   If Sonnen_sensor_counter = 0 And Rollo_status = 0 Then
      Gosub Messung_1
   End If
   If Sonnen_sensor_counter = 0 And Rollo_status = 1 Then
      Gosub Messung_2
   End If
Loop

End

'Timer0-Interrupt-Handler
On_timer0:
   If Tuer_motor_counter > 0 Then
      Decr Tuer_motor_counter
   End If
   If Fenster_motor_counter > 0 Then
      Decr Fenster_motor_counter
   End If
   If Sonnen_sensor_counter > 0 Then
      Decr Sonnen_sensor_counter
   End If
Return


'Motor einschalten
Motor_fenster_auf_einschalten:
   Motor_fenster_ab = 0
   Waitms 200
   Motor_fenster_auf = 1
   Fenster_motor_counter = 610                              ' ca. 40 sec.
Return

Motor_fenster_ab_einschalten:
   Motor_fenster_auf = 0
   Waitms 200
   Motor_fenster_ab = 1
   Fenster_motor_counter = 610                              ' ca. 40 sec.
Return

Motor_tuer_auf_einschalten:
   Motor_tuer_ab = 0
   Waitms 200
   Motor_tuer_auf = 1
   Tuer_motor_counter = 687                                 ' ca. 45 sec.
Return

Motor_tuer_ab_einschalten:
   Motor_tuer_auf = 0
   Waitms 200
   Motor_tuer_ab = 1
   Tuer_motor_counter = 610                                 ' ca. 40 sec.
Return

Gesamt_auf_einschalten:
   Motor_fenster_ab = 0
   Motor_tuer_ab = 0
   Waitms 200
   Motor_fenster_auf = 1
   Motor_tuer_auf = 1
   Tuer_motor_counter = 610
   Fenster_motor_counter = 610
   Sonnen_sensor_counter = 27468                            ' ca. 1800 sec.
   Rollo_status = 0
Return

Gesamt_ab_einschalten:
   Motor_fenster_auf = 0
   Motor_tuer_auf = 0
   Waitms 200
   Motor_fenster_ab = 1
   Motor_tuer_ab = 1
   Tuer_motor_counter = 687
   Fenster_motor_counter = 610                              ' ca. 40 sec.
Return

Motor_fenster_stop:                                         'Fenster STOP
   Motor_fenster_auf = 0
   Motor_fenster_ab = 0
Return

Motor_tuer_stop:                                            'Tür STOP
   Motor_tuer_auf = 0
   Motor_tuer_ab = 0
Return

'Sonnenautomatik ein
Messung_1:
   Lichtmittelwert = 0
   FOR m = 1 TO 3
   Lichtwert = Getadc(0)
   Lichtmittelwert = Lichtmittelwert + Lichtwert
   WAITMS 5
   NEXT m
   Lichtmittelwert = Lichtmittelwert / 3
   If Lichtmittelwert > 495 Then   
   Motor_fenster_auf = 0
   Motor_tuer_auf = 0
   Waitms 200
   Motor_fenster_ab = 1
   Motor_tuer_ab = 1
   Tuer_motor_counter = 427                                 'ca. 28 sec.
   Fenster_motor_counter = 336                              'ca. 22 sec.
   Sonnen_sensor_counter = 27468
   Rollo_status = 1
   End If
Return

Messung_2:
   Lichtmittelwert = 0
   FOR m = 1 TO 3
   Lichtwert = Getadc(0)
   Lichtmittelwert = Lichtmittelwert + Lichtwert
   WAITMS 5
   NEXT m
   Lichtmittelwert = Lichtmittelwert / 3
   If Lichtmittelwert < 470 Then
   Motor_fenster_ab = 0
   Motor_tuer_ab = 0
   Waitms 200
   Motor_fenster_auf = 1
   Motor_tuer_auf = 1
   Tuer_motor_counter = 687
   Fenster_motor_counter = 610
   Sonnen_sensor_counter = 27468
   Rollo_status = 0
   End If
Return


MfG
Nicola

Von Juli94 am 15.07.2009 17:35

Hallo Gerold,

Bin neu hier im forum, und hab mir schon deine tutorial zu Bascom durchgelsen! Und erstmal ein großes Lob, ist alles sehr leicht verständlich!!

aber eine Frage hab ich dennoch,
wenn man einen Eingang macht also:

led1 alias Pind.1
led1 = Input

Wieso muss man da oben denn dann Pinx.x hinschreiben, und nicht Portx.x??

Danke im Vorraus

Mfg Julian

Von gerold am 16.07.2009 06:58

Juli94 hat folgendes geschrieben:
led1 alias Pind.1
led1 = Input

Hallo Julian!

Habe ich den von dir gezeigten Code irgendwo geschrieben? Dieser ist jetzt zwar aus dem Zusammenhang gerissen, aber wahrscheinlich falsch.

Wenn du eine LED "schalten" möchtest, dann muss der Pin als Ausgang konfiguriert werden. Einen Ausgang sprichst du mit PORTx.x an und nicht mit PINx.x. Mit PINx.x kannst du nur herausfinden, ob am Pin eine Spannung anliegt, oder nicht.

Korrekt müsste der Code so aussehen:
Code:
LED1 ALIAS PORTD.1
CONFIG LED1 = OUTPUT

mfg
Gerold
Smile

Von Juli94 am 16.07.2009 10:55

Ouh sorry ich meinte statt led1 zum beispiel Taster1...also auf jeden fall einen Input! Okay also muss man einen Eingang immer mit Pinx.x konfigurieren? Weil Der Bascom Compiler macht halt kein error draus, is ein wenig verwirrend^^

Mfg Julian

Von Tux77 am 25.07.2009 18:00

Hallo,

da bin ich mal wieder und hab ein neues Problem. Embarassed
Ich habe einen Impulsgeber der mir pro gefahrenen Kilometer 2500 Impulse gibt, nun würde ich gerne einen kleinen Bordcomputer bauen der mir die Geschwindigkeit anzeigt und die Durchschnittsgeschwindikeit in einem bestimmten Zeitraum erechnet und auf Knopfdruck anzeigt.
Wie würdet Ihr sowas pragrammieren und wie bringe ich die Zeit mit ins Spiel? Question

MfG
Nicola

Von gerold am 26.07.2009 13:03

Tux77 hat folgendes geschrieben:
pro gefahrenen Kilometer 2500 Impulse [...]
Geschwindigkeit [...] Durchschnittsgeschwindikeit

Hallo Nicola!

Du kannst mit dem Timer2, jede Sekunde einen Interrupt auslösen lassen. Der Timer1 kann die Impulse zählen, die in der Zwischenzeit rein gekommen sind.

Beim Timer2-Interrupt schreibst du die Impulsanzahl in eine Variable, die von der Hauptschleife ausgewertet werden kann. Gleich nach dem Übergeben der Variable, setzt du den Wert des Timer1 wieder auf 0 zurück.

In der Hauptschleife wertest du die Impulsanzahl/sec. aus. Idealerweise nimmst du den Mittelwert der letzten drei Messungen und gibst diesen dann auf dem LCD aus.

-----------------

Eine andere (vielleicht genauere) Möglichkeit wäre, die Dauer der Impulsabstände zu messen. Das scheint mir aber komplizierter.

-----------------

In diesem Beispiel, wird jede Sekunde die angeschlossene LED umgeschaltet:
Code:
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100

Dim Oc2_counter As Word

Led1 Alias Portb.0
Config Led1 = Output

'TIMER2 so eingestellt dass nach exakt 10.000 Compare2-Interrupts (OC2) eine Sekunde vorbei ist
'16.000.000 / 8 / 200 = 10.000
Config Timer2 = Timer , Prescale = 8 , Clear Timer = 1
Compare2 = 200
On Oc2 On_oc2

Enable Oc2
Enable Interrupts


Do
   !nop
Loop

End


On_oc2:
   Incr Oc2_counter
   If Oc2_counter = 10000 Then
      Oc2_counter = 0
      Toggle Led1
   End If
Return

Ach ja, noch etwas: Du brauchst unbedingt einen Quarz für so etwas. Der interne RC-Oscillator ist viel zu ungenau für diese Aufgabe.

mfg
Gerold
Smile

Von Gunter am 20.08.2009 20:10

Hallo Gerold,

durch eine Internetsuche zur Lösung meines Problems bin ich auf dieses Forum gestoßen.

Ich muß schon sagen: Alle Achtung!

Da ich völliger Neuling in Sachen µC und deren Programmierung bin, frage ich, ob Du mir bei der Lösung meines Problems helfen kannst?

Im Auszug hier eine Projektbeschreibung:

...in diesem Projekt soll ein Gerät entworfen werden, mit dem es möglich ist, das Ätzbad der Ätzanlage unserer Schule auf die Kupferkonzentration zu überprüfen und dies dem Benutzer auszugeben. Die Aufgabe ist, ein geeignetes Messverfahren zu suchen, dieses zu testen und die Auswertung soweit zu automatisieren, dass es durch einen einfachen Knopfdruck möglich ist, eine Messung durchzuführen. Die Messung erfolgt über eine einfache Lichtmessung. Bei der Messdurchführung, gibt der µC ein PWM – Signal aus, welches die Helligkeit der roten LED, der Sendeschaltung steuert. Die LED leuchtet durch eine Küvette, in der sich die zu testende Ätzflüssigkeit befindet. Genau gegenüber liegt eine Empfängerschaltung mit Photodiode, die das verbleibende Licht, auffängt und über einen Operationsverstärker einen Spannungswert dem µC zurückgibt. Dieser führt anschließend mit diesem Wert Berechnungen durch und gibt das Ergebnis entweder am Display aus oder speichert diesen Wert für weitere Dokumentationen. Zudem befindet sich noch eine RS 232 Schnittstelle am extra angefertigten Gehäuse die es erlaubt Daten auf den PC zu übertragen...

Hättest Du evtl. eine Lösung in Form eines Schaltplans und vielleicht auch ein Programm für mich? Die Fotometerschaltung ist vorhanden.

Vielen Dank für Deine Hilfe.

Gruß

Gunter

Anzeige: