PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Taster / Timer / Relais ???



Papsi
05.09.2007, 23:03
Hallo,

ich habe eine Platine, auf der 8 Relais drauf sind und 8 Taster

Die Relais sollen alle unterschiedliche Zeiten anziehen.
Also z.B.
Taster 1 lässt Relais 1 = 1 sec. anziehen
Taster 2 lässt Relais 2 = 2 sec. anziehen
...
Taster 7 lässt Relais 7 = 7 sec. anziehen
Taster 8 lässt Relais 8 = 8 sec. anziehen

Das habe ich mal testweise probiert:

$regfile = "m16def.dat"
$crystal = 8000000

Config Portc = Output
Config Portd = Input

Taster1 Alias Pind.1
Taster2 Alias Pind.0

Do
if Taster1 = 0 Then Gosub Relais1
If Taster2 = 0 Then Gosub Relais2
Loop

Relais1:
Portc.7 = 1
Waitms 1000
Portc.7 = 0
Return

Relais2:
Portc.0 = 1
Waitms 2000
Portc.0 = 0
Return

Das klappt auch schonmal alles mit den 8 Relais.

Nun zu meinem Problem:
Wenn ich Taster 8 drücke und Relais 8 für 8 Sekunden anzieht, dann bleibt das Programm ja unter Label Relais8 für 8 sekunden hängen und ich kann dann keine anderen Relais anziehen lassen.

Wie kann ich es anstellen, das ich alle Relais so wie ich will ansteuern kann, ohne das die sich gegenseitig blockieren.

chill-flo
06.09.2007, 00:33
wie wärs so du nimmst eine variable sagen wir mal zeit und einen timer der jede sekunde einen interrupt auslöst und so bald eine taste gedrückt wrde zieht ein relai an und der timer erhöht 1x pro sekunde die variable zeit und sobald diese die gewünschte "höhe" ereicht hat lässt du das relai weider abfallen(?? heist das so)

Papsi
06.09.2007, 08:09
Wenn ich wüsste, wie das geht, hätte ich es schon so gemacht... ;)

chill-flo
06.09.2007, 13:12
hey hab mal n kleinen code geschrieben müsste eig relativ selbst erklärend sein wen was unklar ist einfach frage bitte fersuch mal ob es so funktioniert
$regfile = "M16def.dat"
$crystal = 8000000

Config Timer1 = Timer , Prescale = 1024 'hier wird der timer configuriert
Timer1 = 57722

On Timer1 Ontimer1 'bei einem timerüberlauf springt der controller zu ontimer0


Config Portd = Input
Config Portc = Output
Dim Zeit As Byte

Taster1 Alias Pind.1
Taster2 Alias Pind.0

Hauptprogramm:
Do
If Taster1 = 0 Then Gosub Relais1
If Taster2 = 0 Then Gosub Relais2
Loop


Relais1:
Enable Timer1 'der timer wird eingeschaltet
Enable Interrupts 'die interrupts werden eingeschaltet (hier nur der timer interrupt ist nötig dass der avr interrupts zulässt)
Portc.0 = 1

Do
If Zeit < 1 Then ' wen die zeit Über 1 sekunde ist werden der timer und die interrupts wieder deaktiviert
Disable Timer0
Disable Interrupts
Portc.0 = 0 'das relai fällt ab
Goto Hauptprogramm 'der controller verlässt die do loop schleife und kommt weider zum hauptprogramm zurück
End If
Loop
Return


Relais2:
Enable Timer1
Enable Interrupts
Portc.1 = 1
Do
If Zeit < 2 Then
Portc.1 = 0
Goto Hauptprogramm
End If
Loop
Return


Ontimer1: ' hier der timer interrupt
Zeit = Zeit + 1 ' zeit wird um eins erhöht
Timer1 = 57722
Return ' der timer bekommt einen wert dass er nicht die vollen 65535 takte zählen muss das würde länger als eine sekunde dauern
' der controller kehrt zum programm zurückmüsste so eig funktionieren
einfach für die anderen relais erweitern
wen etwas unklar ist einfach fragen

Papsi
06.09.2007, 21:44
So - meine Platine läuft, so wie es sein soll, auch mit dem Timer...

Nun habe ich noch ne Frage.
Ich habe an meinem Mega 16 noch Pins frei und will meine Steuerung noch erweitern.

Ich löse meine Relais so aus:
Ich klemme die Masse an einen Taster und der Ausgang vom Taster geht an den AVR und verarbeitet die Masse dort.

Jetzt habe ich aber nur +5V zur Verfügung zum schalten.
Kann an der Platine leider nichts mehr ändern.

Wie kann ich es machen, das ich auch 5V an den AVR als Eingang legen kann?

Also Taster loslassen - nichts passiert
Taster drücken - 5V gehen auf den Pin vom AVR

Gruß
Papsi

chill-flo
08.09.2007, 00:01
einfach
if taster = 1 then goto
1 steht für 5volt am eingang und null für 0 volt am eingang(bei einer versorgungsspannung von 5 volt)

Windi
10.09.2007, 00:13
einfach
if taster = 1 then goto
1 steht für 5volt am eingang und null für 0 volt am eingang(bei einer versorgungsspannung von 5 volt)

Das würde aber voraussetzen dass die Eingänge ohne gedrückten Taster 0 Volt haben. Das schafft man aber nur mit zusätzlichen Pull-Down-Widerständen. So hängen die Eingänge quasi in der Luft und können im Extremfall bei offenem Taster keinen definierten Zustand einnehmen oder sogar "schalten".

Besser wäre es die Taster mit 0 Volt zu beschalten und die integrierten Pull-Up-Widerstände zu aktivieren.