PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Countdown für Platinenbelichter =P~



Inkoknito
17.09.2008, 20:11
hallo,

ich habe vor einen Platinenbelichter zu bauen. Dazu will ich über ein Display die zeit einstellen können, entweder über ein Poti oder ein drehencoder (würde mir am besten gefallen) der pro takt eine sekunde macht) oder 2 taster.

hab auch schon mal im Forum und im inet nachgeschaut und gelesen aber so richtig komm ich nich drauf wie ich das angehen soll.

vieleicht kann mir einer, einen Gedankenanstoß gebn, so einen kleinen nur : ) man will ja auch selber was lernen^^

zu auswahls stehen quarze mit 4, 8, 12 Mhz.

besten dank schon mal : ) ](*,) ](*,) ](*,)

Che Guevara
17.09.2008, 20:40
hallo inkoknito ;-)

also mit einem drehencoder kenne ich mich persönlich leider nicht sehr gut aus :-(
ich kann dir die bedinung via 2 taster beschreiben:

es gibt dafür im prinzip zwei möglichkeiten:
1. du hängst beide taster an einen externen interrupt (gegen gnd). diese sollten aber entprellt sein, egal welche möglichkeit du wählst! wenn t1 eins gedrückt ist, springt das prog aus der hauptschleife in die interrupt-routine und darin kannst du dann einstellen, um wieviel secunden deine zeit verlängert/verkürtzt werden soll. hier mal ein kleines beispiel:




$regfile = "......."
$crystal = "......"

config pina.0 = output
config pina.1 = input
porta.1 = 1
porta.0 = 0

config lcd = x * y
config lcdpin = .......
config lcdbus = ....

initlcd
cls

locate 1 , 1
lcd "Belichtungscountdown"
wait 1
cls

enable int0
enable int1
enable interrupts
config int0 = falling
config int1 = falling
on int0 isr_von_int0
on int1 isr_von_int1

dim t as word

t = xy 'voreinstellen der 'normalen' laufzeit

do

if pina.1 = 0 then
porta.0 = 1 'beliechtungsgerät
wait t
porta.0 = 0
cls
locate 1 , 1
lcd "Belichtung beendet!"
wait 1
cls
else
locate 1 , 1
lcd "Bitte Starten Sie das Programm zum belichten!!"
endif

loop

end

isr_von_int0:
t = t + 1 'erhöhen des wertes um 1
return

isr_von_int1:
t = t - 1 'erniedriegen (!!) des wertes um 1
return




ich hoffe, das prog hilft dir ein wenig weiter.
welchen quarz du verwendest, spielt hier keine große rolle, allerdings würde ich den kleinsten verwenden, da dieser nicht so viel strom verbraucht als ein größerer.

2. die zweite möglichkeit ist, die taster einfach im hauptprogramm abzufragen und dann den zeitwert (t) zu erhöhen/ernidriegen.
anschließend kann das eig prog gestartet werden.
allerdings hat die 1. methode hier einen vorteil:
man kann den wert auch noch während der belichtung verändern, was bei der 2. möglichkeit nicht mehr geht.....

falls du noch eine frage hast (oder du ein codebeispiel der 2. methode möchtest), helfe ich dir gerne weiter.

ich hoffe, ich habe dir jetzt nicht die ganze arbeit abgenommen, da du ja auch etwas dabei lernen sollst/willst ;-)

gruß
chris

Inkoknito
17.09.2008, 20:44
cool danke das hilft mir schon sehr viel weiter : )

nur kruz ne frage zum Program, wo verbirgt sicht jetzt der eigentlich timer bzw Countdown, uhr?

das seh ich nich ganz. und ne start taste oder so?

mfg dangöö^^

Che Guevara
17.09.2008, 20:55
das hab ich woll nicht ganz erklärt :-)

der 'timer bzw. countdown, uhr' ist im mainloop, da steht



if pina.1 = 0 then
porta.0 = 1 'beliechtungsgerät
wait t
porta.0 = 0
cls
locate 1 , 1
lcd "Belichtung beendet!"
wait 1
cls
else
locate 1 , 1
lcd "Bitte Starten Sie das Programm zum belichten!!"
endif


das if pina.1 = 0 then schaltet (wenn pina.1 auf gnd gezogen wird) die beleuchtung ein (diese hängt an porta.0). dann wird t secunden lang gewartet, um dann die beleuchtung wieder auszuschalten. t wird in den zwei routinen der interrupts verändert.

das ganze ist allerdings nicht sooo genau (bei insgesamt 10 minuten beleuchtungsdauer gibt es etwa eine abweichung von einer halben minute). wenn du es genauer haben willst, dann schreib ich dir morgen noch mal was anderes, aber jetzt muss ich jetzt dann pennen, morgen hab ich schule :-(

nochwas:
in den routinen von int0 und int1 steht
t = t + 1
bzw.
t = t - 1
da muss stehen:
t = t + 30
bwz.
t = t - 30

damit kann man die zeit im halbe minuten schritt verändern. ich hoffe, das reicht dir, kann man aber ganz leicht ändern.

gruß
chris

goara
02.10.2008, 20:25
hab sowas auch gebaut siehe hier:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=39716&highlight=
der wird mit 4 tasten gestuert, sekunden / minuten +/- beie + tasten drücken start.
wenn du willst kann ich dir den code geben...

Rone
09.12.2008, 15:15
Hallo!

@goara!

Setz mich seit kürzerem mit µC's auseinander. Da ich leider keine
Vorkenntnisse im Programmieren habe, wäre es nett, wenn Du mir Deinen
Code zukommen lassen könntest. Versuche so gut es eben geht, aus
diversen Codeteilen zu lernen wie man es richtig angeht.

Vielen Dank
Rone

goara
09.12.2008, 16:30
bin nciht sicher ob das so alles stimmt, weil ich die letzte version nciht finde, aber so grob sollte es stimmen...


$regfile = "m8def.dat"

$crystal = 8000000





'-----LCD-----

Config Lcd = 16 * 2

Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4





'----Ports----

Config Pinb.1 = Output

Uv Alias Portb.1

Config Pinb.0 = Input

Config Pind.7 = Input

Config Pind.6 = Input

Config Pind.5 = Input

Minplus Alias Portb.0

Secplus Alias Portd.7

Minminus Alias Portd.6

Secminus Alias Portd.5





'-----VAR-----

Dim Bel_min As Integer

Dim Bel_sec As Integer

Dim Rest_min As Byte

Dim Rest_sec As Byte

Dim Start_uv As Bit





'-----Subs-----

Declare Sub Zeile1

Declare Sub Zeile2



Cls

Locate 1 , 1

Lcd "Hallo :)"



Wait 1



Bel_min = 0

Bel_sec = 0

Rest_min = 0

Rest_sec = 0

Start_uv = 0



Do



If Start_uv = 0 Then ' Einstellmodus



If Pinb.0 = 0 Then

Incr Bel_min

End If





If Pind.7 = 0 And Pind.5 = 1 Then

Incr Bel_sec

End If





If Pind.6 = 0 Then

Decr Bel_min

End If





If Pind.5 = 0 And Pind.6 = 1 Then

Decr Bel_sec

End If



If Bel_min < 0 Then 'überlauf

Bel_min = 0

End If

If Bel_sec < 0 Then

Bel_sec = 0

End If

If Bel_min >= 60 Then 'überlauf

Bel_min = 0

End If

If Bel_sec >= 60 Then

Bel_sec = 0

End If







Waitms 200

Zeile1



End If





If Pind.7 = 0 And Pind.5 = 0 Then ' Starten Stoppen



If Start_uv = 0 Then

Start_uv = 1

Rest_sec = Bel_sec

Rest_min = Bel_min

Else

Start_uv = 0



End If



End If



If Start_uv = 1 Then

Uv = 1









If Rest_sec = 0 Then
If Rest_min > 0 Then

Decr Rest_min

Rest_sec = 60
end if
if Rest_min = 0 Then
Uv = 0

Start_uv = 0

Locate 2 , 1

Lcd "*Fertig*"
end if

End If

Wait 1

Decr Rest_sec

Zeile2




End If



Loop





Sub Zeile1

Locate 1 , 1

If Bel_min < 10 Then

If Bel_sec < 10 Then

Lcd "Tg=0" ; Bel_min ; ":0" ; Bel_sec

Else

Lcd "Tg=0" ; Bel_min ; ":" ; Bel_sec

End If

Else

If Bel_sec < 10 Then

Lcd "Tg=" ; Bel_min ; ":0" ; Bel_sec

Else

Lcd "Tg=" ; Bel_min ; ":" ; Bel_sec

End If

End If

End Sub





Sub Zeile2

Locate 2 , 1

If Rest_min < 10 Then

If Rest_sec < 10 Then

Lcd "Tr=0" ; Rest_min ; ":0" ; Rest_sec

Else

Lcd "Tr=0" ; Rest_min ; ":" ; Rest_sec

End If

Else

If Rest_sec < 10 Then

Lcd "Tr=" ; Rest_min ; ":0" ; Rest_sec

Else

Lcd "Tr=" ; Rest_min ; ":" ; Rest_sec

End If

End If

End Sub

Rone
10.12.2008, 08:02
@goara!

Vielen Dank für den Code.

Wenn denn Fehler drin sind machts auch nichts. Beim Fehler ausbügeln
kann man ja auch eine Menge lernen. Aber wie schon gesagt, mir geht's
eher um das Konzept.
Danke nochmal

MfG
Rone