PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kann das mal jemand überprüfen?



Michael 123
22.03.2006, 16:15
Hallo,

ich habe mir gestern meine ersten Mikrocontroller mit der passenden Harware zusammen gelötet und es scheint als würde alles funktionieren :-) bin stolz drauf

so nun meine Frage:
Kann das mal jemand überprüfen und mir gegebenen fals sagen ob es funktioniert oder nicht und wenn nicht was ist flasch und noch was wie lange baut er für die while schleife?
hier der code:


$regfile = "m8def.dat"
$crystal = 4000000
Dim Temperatur(288) As Integer
Dim Meswiederkehr As Long
Dim Meunds As Long
Dim Ausgang As Long


On Urxc Onrxd 'Interrupt-Routine setzen
Enable Urxc 'Interrupt URXC einschalten
Enable Interrupts 'Interrupts global zulassen

Ddrd = &B00000101 'PD0 und PD2 als augang und der rest als eingang
Kondensaorlader Alias Portd.0 'PD0 wird mit Kondensaorlader angsprochen
Widerstand Alias Portd.1 'PD1 wird mit widerstand angesprochen
Lader Alias Portd.2 'PD2 wird mit lader angesrochen

Kondensaorlader = 1 'PD0 wird auf high gezogen

For Meunds = 1 To 288 Step 1 'kleine for schleife
Lader = 1 'PD2 wird auf high gezogen
While Widerstand = 1 And Meswiederkehr > 5000000 'wenn port an ist dann ende sonst weiter in der schleife bis meswiederkehr > 5000000
Meswiederkehr = Meswiederkehr + 1 'Meswiederkehr um eine erhöhen
Wend
Lader = 0 'PD2 auf low setzen
Temperatur(meunds) = Meswiederkehr 'Meswiederkehr in das temperatur array schreiben
Wait 300 'hier soll 5 minuten gewartet werden
Next 'hier wird wieder zum anfang der for schleife gesprungen





Onrxd: 'anfang des interupts
'
For Ausgang = 1 To 288 Step 1 'hier wird der interupt bearbeitet
Printbin Temperatur(ausgang) 'hier auch noch
Next 'und hier auch
Return

so das ist der code und die hardware:


http://coelmoba.co.funpic.de/Messungwirderstand.bmp

Ich hoffe ihr könnt damit was anfangen

mfg
Michael

Vitis
22.03.2006, 16:46
Hi Michael,

also der Anschluss des Elko direkt an die Ports kann
ziemliich ins Auge gehen ... die treiben nur 20mA,
darüber kann der µC schaden nehmen.
Einen Vorwiderstand zur Strombegrenzung sollts schonmal geben.

Die while-wend-Schleife wird nicht ganz nach Wunsch laufen
denke ich. das AND ist beim Bascom mit der binären Operation
UND-Verknüpfung verwendet.

der 500000er Zähler will mir nicht so recht gefallen ...
schon mal an den Timer gedacht?
Wenn ichs richtig verstanden hab ist der nur dazu da
den Programmablauf bis zur nächsten Messung zu unterbrechen.
Das lässt sich mit nem Timer und einer
Interrupt-routine schöner lösen.
Der Vorteil dabei, der µC kann der weil bis der Timer abgelaufen
ist was Anderes machen, hängt also nicht in der Schleife fest,
oder du kannst ihn in nen Sleepmode setzen, der dann mit
dem Timerinterrupt aufgehoben wird, das spart z.B. Bateriestrom.

EDIT: selbiges gilt auch für den Wait-Befehl
Die Festlegung von dem Array auf 288 ist auch etwas
unschön ... ich würde da das array auf 255 kürzen,
dann könntest du

Dim Ausgang As Byte ... das spart RAM

Byte (1 byte).
Bytes are stores as unsigned 8-bit binary numbers

vs.

Long (four bytes)
Longs are stored as signed 32-bit binary numbers

oder wenns größer sein muss als Word deklarieren:
Word (two bytes).
Words are stored as unsigned sixteen-bit binary numbers

Michael 123
23.03.2006, 13:46
Hallo,

ok ich sehe ein das es ein versuch ist und höchtwarscheinlich bleiben wird. Wie man schon in dem Bilde der Hardware sieht möchte ich die temeratur aufzeichenen und dann mit einem Interupt befehl vom terminal programm abhole. So den Kondensator kann ich auch dirket auf VCC und nocht an PD0 setzten. Dann wäre glaube ich das Problem mit dem Kondensator geklärt.
Das Array möchte ich bei 288 lassen weil ich dann alle 5 Minuten eine Messung bekomme 24 h zeit habe die messungen abzuholen.
Noch mal zur hardware und zum Programm:
Es soll genaugenommen ein Widerstand zwischen ca 100 Ohm und (haltet euch fest) 10MOhm bestimmt werden.
Wer Ideen hat wie ich es besser lösen kann ist mir recht. Ich habe auch schon an den ADC gedacht aber wie muss dann die Hardware aussehen?
Und noch was: Die Daten werden dann alle am PC ausgewerdet und müssen dadurch nicht mit dem µC ausgewertet werden. Es soll auch die Zeit zwischen zwei Messungen von 10s bis zu 5h einfach einstellbar sein. Was ich ja mit dem wait befehl versucht habe.

Ich hoffe ihr könnt damit was anfangen
mfg
Michael

Michael 123
24.03.2006, 15:55
So habe noch mal geprogselt und was anderes:


$regfile = "m8def.dat" ' atmega8

$crystal = 4000000

$baud = 19200

$hwstack = 32 ' default use 32 for the hardware stack

$swstack = 10 'default use 10 for the SW stack

$framesize = 40 'default use 40 for the frame space

On Urxc Onrxd 'Interrupt-Routine setzen
Enable Urxc 'Interrupt URXC einschalten
Enable Interrupts

Dim Widerstand As Long
Dim Saver As Integer
Dim Ausgang As Integer
Dim Sender As Integer
Dim W As Word
Dim I As Integer
Dim Wi As Integer


Config Adc = Single , Prescaler = Auto
Ddrd = &B00000001 'PD0 als augang und der rest als eingang
Kondensaorlader Alias Portd.0


Start Adc



' _ ___ _ _ ___
''''''''''''''''''''''''''''''''''I_ I I_I I_I I '''''''''''''''''''''''''''''''''''''''
' _I I I I I\ I


Start:
Kondensaorlader = 1 'PD0 anschalten


For Widerstand = 0 To 500000 Step 1 'for schleife in der der Widerstand gemssen werden soll
W = Getadc(0)
If W > 646 Then Goto Save 'wenn der adc wanderler rößer als 646 ist nach save weiter

Next 'Ende der For schleife

Save: 'unterrutine save

Kondensaorlader = 0 'PD0 ausschalten um Kondensator um diode zu entladen

If Saver > 8184 Then Goto Ended 'wenn der eeprom voll ist das ende
Saver = Saver + 6 'eeprom stelle zum schreiben um 6 erhöhen

Writeeeprom Widerstand , Saver 'in eeprom schreiben



Wait 300 '5 min warte

Goto Start 'wider zum anfang


' ___ _ _ _ _ ___
'''''''''''''''''''''I I\ I I I_ I_I I_I I I I_I I ''''''''''''''''''''''''''''''''''''''''''
' I I \I I I_ I\ I\ I_I I I

Onrxd: 'anfang des interupts
'
For Ausgang = 0 To 4184 Step 6 'For schleife in der der Intrrupt bearbeitet wird
Readeeprom Sender , Ausgang
Print Sender 'hier auch noch
Next 'und hier auch
Return




' _ _
'''''''''''''''''''''''''''''''''''''''I_ I\ I I\ I_ ''''''''''''''''''''''''''''''''''''''''''
' I_ I \I I/ I_

Ended: 'ende des ganzens da eeprom voll ist
Goto Ended

und hier die Hardware:

http://coelmoba.co.funpic.de/Messungwirderstand1.bmp

sorry für die schlechte Zeichnung ging auf die schnelle nicht anderes

So dazu nun meine Fragen:

Ist der eeprom danach voll oder ist er grad so am limit oder hat er noch platz?
Wie lange braucht der µC um EIN mal die For schleife von anfang bis zum ende durch zulaufen? Also der der teil:


For Widerstand = 0 To 500000 Step 1 'for schleife in der der Widerstand gemssen werden soll
W = Getadc(0)
If W > 646 Then Goto Save 'wenn der adc wanderler rößer als 646 ist nach save weiter

Next 'Ende der For schleife

so das waren schon die Fragen.

mfg
Michael


PS: Wenn ihr bessere Idee habt wie ich einen Wiederstand messen kann die werte dann abspeichern und späterüber eine Interrupt abrufen kann dann sagt es mir. DANKE