PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wert zeitversetzt in mehrere Variablen schreiben



TobiasBlome
21.12.2007, 20:21
Hallo,
ich möchte "mal eben" über Nacht einen Wert messen oder besser die Veränderung.
Der Wert kommt über den Analogeingang und soll in Variable1 geschrieben werden. Ca 30min später soll nochmal der Analogeingang gemessen werden und der Wert in Variable2 geschrieben werden.
Am nächsten Tag möchte ich alle Variablen über RS232 ausgeben.

Wie kann ich den Wert nach und nach in die verschiedenen Varablen schreiben?

Also:

If Minuten = 30 then
Variable1 = Analog_in0
End if


und wie sag ich das beim nächsten mal Variable2 drann ist?

Vielen Dank schon mal,
Tobias

Gento
21.12.2007, 20:39
z.B. so

Dim Temperatur(200) As Byte
Dim Zähler AS Byte

Zähler=0
Do
If Minuten = 30 then
Temperatur(Zähler) = Analog_in0
Incr(Zähler)
End if
Loop

lg Gento

for_ro
21.12.2007, 20:43
Nur aufpassen, dass du mit dem Index 1 anfängst, weil Temperatur(0) nicht definiert ist.
Also Incr Zähler einfach vor das Abspeichern setzen.

Gruß

Rolf

Gento
21.12.2007, 20:48
Sorry hatte übersehen das die Indexierung bei 1 beginnt.
Gento

TobiasBlome
21.12.2007, 21:04
Hallo,
vielen Dank für die superschnelle Antwort!
Habs noch nicht getestet - kommt gleich.

Kann ich das so senden:

'Werte über RS232 senden:
If Pinc.3 = 1 Then
Zähler = 1 'Zähler zurücksetzen
For Zähler = 1 To 200 Step + 1 'Zähler hochzählen
Print "Wert " ; Zähler ; ": " ; Wert(zähler) 'und Wert senden
Waitms 50
Next
End If

Muss die Wartezeit rein?

Tobias

Gento
21.12.2007, 21:16
50 mSek ist ein wenig viel aber ginge.

Entsprechend im eigenen PC-Programm Timeout setzen.

Gento

TobiasBlome
21.12.2007, 21:24
also irgendwie wird die Variable Zähler nicht hochgezählt: Am Anfang hab ich Zähler = 1 geschrieben und über rs232 wird immer Zähler2 gesendet....
Hat da einer eine Idee? Hier mal das Prog.:


'-------------------------------------------------------------------------------
'Konfiguration µC:

$regfile = "m8def.dat" 'AT-Mega8
$crystal = 3686400 'Quarz: 3.6864 MHz
$baud = 9600 'Baudrate der UART: 9600 Baud


'Analogmessung
Config Adc = Single , Prescaler = Auto , Reference = Avcc

'TIMER
On Timer1 Ontimer1overflow 'Timer1-Interruptroutine deklarieren
Config Timer1 = Timer , Prescale = 1024 '3686400Hz/1024=3600Hz
Enable Timer1
Timer1 = 61935 'Sofort Timer1-Überlauf (Bei 16 Bit: 65535+1=0)
Enable Interrupts


'-------------------------------------------------------------------------------
'Ein- Ausgänge:

DdrB = &B111111 '1 Ausgang, 0 Eingang = Pin PB5-0 als Ausgang
Ddrc = &B0000000 '1 Ausgang, 0 Eingang = Pin PC6-0 als Eingang
Ddrd = &B00000000 '1 Ausgang, 0 Eingang = Pin PD7-0 als Eingang





'-------------------------------------------------------------------------------
' Variablen
'-------------------------------------------------------------------------------
Dim Analog_in0 As Word '=0-1023 vom Analogeingang



'Timer
Dim Stunden As Byte
Dim Minuten As Byte
Dim Sekunden As Byte

'Speicherplätze
Dim Zähler As Word 'zum Werte hochzählen
Dim Wert(200) As Word 'speichern des eigendlichen Wertes








'-------------------------------------------------------------------------------
'Programm:
'-------------------------------------------------------------------------------


Do


Start Adc 'Starte analog Messung
Zähler = 1



'Analogeingänge Auslesen:
Analog_in0 = Getadc(0) 'Wert aus Analogeingang laden


'-------------------------------------------------------------------------------
'Werte Speichern:
If Sekunden = 0 Then
Toggle Portb.2 'Led umschalten zur kontrolle
Wert(zähler) = Analog_in0
Incr Zähler
Print "Zähler: " ; Zähler
End If

'-------------------------------------------------------------------------------
'Werte über RS232 senden:
' If Pinc.3 = 1 Then
' Toggle Portb.3 'Led umschalten zur kontrolle
' Zähler = 1 'Zähler zurücksetzen
' For Zähler = 1 To 200 Step + 1 'Zähler hochzählen
' Print "Wert " ; Zähler ; ": " ; Wert(zähler) 'und Wert senden
' Waitms 50
' Next
' End If

'-------------------------------------------------------------------------------

'-------------------------------------------------------------------------------
'UHR einstellen:

'Minuten +
'If Pind.3 = 1 And Minuten <= 59 Then
'Minuten = Minuten + 1
'Waitms 300
'End If

'Stunden+
'If Pinc.2 = 1 And Stunden <= 23 Then
'Stunden = Stunden + 1
'Waitms 300
'End If


Loop



'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------
Ontimer1overflow: 'Timer1-Interruptroutine
'Nächster Überlauf soll in einer Sekunde sein:
Timer1 = 61936 'Überlauf nach 65535, also: 65535+1-3600=61936

Incr Sekunden

If Sekunden >= 5 Then
Sekunden = 0
Incr Minuten
End If

If Minuten >= 60 Then
Minuten = 0
Incr Stunden
End If

If Stunden >= 24 Then
Stunden = 0
End If


Print "Zeit: " ; Stunden ; " : " ; Minuten ; " : " ; Sekunden ; " Uhr"
Print "Analog_in0: " ; Analog_in0 'Analog Eingangswert senden
Toggle Portb.0 'blink LED zum testen
Return



'Anzeige:
'Home Upper 'in die obere zeile gehen
' Cls : Lcd "Anzahl: " + Str(tuer_1_zaehler) 'Anzahl Türöffnungen
'Home Lower 'in die untere zeile gehen
'Lcd "Uhrzeit: " + Str(stunden) ; ":" + Str(minuten) ; ":" + Str(sekunden)


Return

for_ro
21.12.2007, 21:37
Setz mal Zähler=1 vor die Do...Loop

Gruß

Rolf

Gento
21.12.2007, 21:40
Do
Start Adc 'Starte analog Messung
Zähler = 1
usw

Zähler=1 muß vor Do stehen als Inizialisierung ist das gedacht.

Gento

Edit: 8-[ da war einer schneller

TobiasBlome
21.12.2007, 21:46
das war aber ein überflüssiger Fehler ;-)

vielen Dank nun geht es

Tobias

TobiasBlome
21.12.2007, 22:27
Tja da bin ich wieder...
also beim senden (sobald ich den Taster anPC3 drücke) wird immer nur Wert1 gesendet und die Kontroll LED die mit dem Taster an geht, geht nach dem loslassen nicht mehr aus und es wir fleißig weider gesendet...
als wenn der irgendwo festhängt.



'Konfiguration µC:

$regfile = "m8def.dat" 'AT-Mega8
$crystal = 3686400 'Quarz: 3.6864 MHz
$baud = 9600 'Baudrate der UART: 9600 Baud


'Analogmessung
Config Adc = Single , Prescaler = Auto , Reference = Avcc

'TIMER
On Timer1 Ontimer1overflow 'Timer1-Interruptroutine deklarieren
Config Timer1 = Timer , Prescale = 1024 '3686400Hz/1024=3600Hz
Enable Timer1
Timer1 = 61935 'Sofort Timer1-Überlauf (Bei 16 Bit: 65535+1=0)
Enable Interrupts


'-------------------------------------------------------------------------------
'Ein- Ausgänge:

DdrB = &B111111 '1 Ausgang, 0 Eingang = Pin PB5-0 als Ausgang
Ddrc = &B0000000 '1 Ausgang, 0 Eingang = Pin PC6-0 als Eingang
Ddrd = &B00000000 '1 Ausgang, 0 Eingang = Pin PD7-0 als Eingang





'-------------------------------------------------------------------------------
' Variablen
'-------------------------------------------------------------------------------
Dim Analog_in0 As Word '=0-1023 vom Analogeingang



'Timer
Dim Stunden As Byte
Dim Minuten As Byte
Dim Sekunden As Byte

'Speicherplätze
Dim Zähler As Word 'zum Werte hochzählen
Dim Merker As Bit 'Werte speichern: damit nur um 1 hochgezählt wird
Dim Wert(200) As Word 'speichern des eigendlichen Wertes








'-------------------------------------------------------------------------------
'Programm:
'-------------------------------------------------------------------------------

Zähler = 1
Merker = 0 'Werte speichern: damit nur um 1 hochgezählt wird

Do


Start Adc 'Starte analog Messung




'Analogeingänge Auslesen:
Analog_in0 = Getadc(0) 'Wert aus Analogeingang laden

'-------------------------------------------------------------------------------
'Merker zurücksetzen
If Sekunden = 1 Then
Merker = 0
End If

'-------------------------------------------------------------------------------
'Werte Speichern:
If Sekunden = 0 And Merker = 0 Then
Toggle Portb.2 'Led umschalten zur kontrolle
Wert(zähler) = Analog_in0
Incr Zähler
Merker = 1
Print "Zähler: " ; Zähler
End If

'-------------------------------------------------------------------------------
'Werte über Rs232 Senden:
If Pinc.3 = 0 Then
Portb.3 = 1 'Led umschalten zur kontrolle
Zähler = 1 'Zähler zurücksetzen
For Zähler = 1 To 200 Step + 1 'Zähler hochzählen
Print "Wert " ; Zähler ; ": " ; Wert(zähler) 'und Wert senden
Waitms 10
Next
Else
Portb.3 = 0 'Led umschalten zur kontrolle
End If

'-------------------------------------------------------------------------------

'-------------------------------------------------------------------------------
'UHR einstellen:

'Minuten +
'If Pind.3 = 1 And Minuten <= 59 Then
'Minuten = Minuten + 1
'Waitms 300
'End If

'Stunden+
'If Pinc.2 = 1 And Stunden <= 23 Then
'Stunden = Stunden + 1
'Waitms 300
'End If


Loop



'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------
Ontimer1overflow: 'Timer1-Interruptroutine
'Nächster Überlauf soll in einer Sekunde sein:
Timer1 = 61936 'Überlauf nach 65535, also: 65535+1-3600=61936

Incr Sekunden

If Sekunden >= 5 Then
Sekunden = 0
Incr Minuten
End If

If Minuten >= 60 Then
Minuten = 0
Incr Stunden
End If

If Stunden >= 24 Then
Stunden = 0
End If


Print "Zeit: " ; Stunden ; " : " ; Minuten ; " : " ; Sekunden ; " Uhr"
Print "Analog_in0: " ; Analog_in0 'Analog Eingangswert senden
Toggle Portb.0 'blink LED zum testen
Return


vielleicht hat ja jemand eine Idee.

Tobias

Gento
21.12.2007, 22:46
'Werte über Rs232 Senden:
If Pinc.3 = 0 Then
Portb.3 = 1 'Led umschalten zur kontrolle
For Zähler = 1 To 200 Step + 1 'Zähler hochzählen
Print "Wert " ; Zähler ; ": " ; Wert(zähler) 'und Wert senden
Waitms 10
Next
End if
Else
Portb.3 = 0 'Led umschalten zur kontrolle


Jede weite Antwort kostet eine flasche 'plöp'

Den Rest Code habe ich nicht anbesehen.

Gento

for_ro
21.12.2007, 22:49
Also ich kann die Zeile

For Zähler = 1 To 200 Step + 1

wegen dem + überhaupt nicht kompilieren lassen. Dein Code muss irgendwie anders aussehen.

Weiter unten steht

If Sekunden >= 5 Then
Sekunden = 0
Incr Minuten
End If

D.h., alle 5 Sekunden ist eine Minute um und der Wert wird abgespeichert. Ist das so gewollt (damit du schneller ein paar Werte hast)?

Gruß

Rolf

TobiasBlome
22.12.2007, 08:10
@Gento:
das lässt sich nicht kompilieren, weil er das End If nicht findet.

@for_ro:
- das +1 ist bei mir kein Problem - wie hättest du es geschrieben?
- die 5 Sekundenzeit ist so gewollt - zum testen - wird später wieder auf 60 geändert :-)

Tobias




'Konfiguration µC:

$regfile = "m8def.dat" 'AT-Mega8
$crystal = 3686400 'Quarz: 3.6864 MHz
$baud = 9600 'Baudrate der UART: 9600 Baud


'Analogmessung
Config Adc = Single , Prescaler = Auto , Reference = Avcc

'TIMER
On Timer1 Ontimer1overflow 'Timer1-Interruptroutine deklarieren
Config Timer1 = Timer , Prescale = 1024 '3686400Hz/1024=3600Hz
Enable Timer1
Timer1 = 61935 'Sofort Timer1-Überlauf (Bei 16 Bit: 65535+1=0)
Enable Interrupts


'-------------------------------------------------------------------------------
'Ein- Ausgänge:

Ddrb = &B111111 '1 Ausgang, 0 Eingang = Pin PB5-0 als Ausgang
Ddrc = &B0000000 '1 Ausgang, 0 Eingang = Pin PC6-0 als Eingang
Ddrd = &B00000000 '1 Ausgang, 0 Eingang = Pin PD7-0 als Eingang





'-------------------------------------------------------------------------------
' Variablen
'-------------------------------------------------------------------------------
Dim Analog_in0 As Word '=0-1023 vom Analogeingang



'Timer
Dim Stunden As Byte
Dim Minuten As Byte
Dim Sekunden As Byte

'Speicherplätze
Dim Zähler As Word 'zum Werte hochzählen
Dim Merker As Bit 'Werte speichern: damit nur um 1 hochgezählt wird
Dim Wert(200) As Word 'speichern des eigendlichen Wertes (470Werte?)



'-------------------------------------------------------------------------------
'Programm:
'-------------------------------------------------------------------------------

Zähler = 1
Merker = 0 'Werte speichern: damit nur um 1 hochgezählt wird

Do

Start Adc 'Starte analog Messung

'Analogeingänge Auslesen:
Analog_in0 = Getadc(0) 'Wert aus Analogeingang laden

'-------------------------------------------------------------------------------
'Merker zurücksetzen
If Sekunden = 1 Then
Merker = 0
End If

'-------------------------------------------------------------------------------
'Werte Speichern:
If Sekunden = 0 And Merker = 0 Then
Toggle Portb.2 'Led umschalten zur kontrolle
Wert(zähler) = Analog_in0
Incr Zähler
Merker = 1
Print "Zähler: " ; Zähler
End If

'-------------------------------------------------------------------------------
'Werte über Rs232 Senden:
If Pinc.3 = 0 Then
Portb.3 = 1 'Led umschalten zur kontrolle
'Zähler = 1 'Zähler zurücksetzen
For Zähler = 1 To 10 Step + 1 'Zähler hochzählen
Print "Wert " ; Zähler ; ": " ; Wert(zähler) 'und Wert senden
Waitms 10
Next
Else
Portb.3 = 0 'Led umschalten zur kontrolle
End If


'-------------------------------------------------------------------------------

'-------------------------------------------------------------------------------
'UHR einstellen:

'Minuten +
'If Pind.3 = 1 And Minuten <= 59 Then
'Minuten = Minuten + 1
'Waitms 300
'End If

'Stunden+
'If Pinc.2 = 1 And Stunden <= 23 Then
'Stunden = Stunden + 1
'Waitms 300
'End If


Loop


'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------
Ontimer1overflow: 'Timer1-Interruptroutine
'Nächster Überlauf soll in einer Sekunde sein:
Timer1 = 61936 'Überlauf nach 65535, also: 65535+1-3600=61936

Incr Sekunden

If Sekunden >= 5 Then
Sekunden = 0
Incr Minuten
End If

If Minuten >= 60 Then
Minuten = 0
Incr Stunden
End If

If Stunden >= 24 Then
Stunden = 0
End If


Print "Zeit: " ; Stunden ; " : " ; Minuten ; " : " ; Sekunden ; " Uhr"
Print "Analog_in0: " ; Analog_in0 'Analog Eingangswert senden
Toggle Portb.0 'blink LED zum testen
Return

TobiasBlome
22.12.2007, 08:35
oh ha...
also jetzt geht´s und der Fehler war: ..... das +1
ich weiß nicht warum er nicht meckert und ich hab das mein ich auch schon ein paar mal so benutzt aber irgendwie hat er damit ein Problem....

ABER nun geht´s

Danke an alle! Dann kann ich ja nun messen :-)

Tobias