PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einfaches Timing-Programm - brauche Hilfe



Powell
20.08.2006, 15:22
Hi

Ich möchte ein Programm schreiben, bei dem ein ATmega 8 drei Relais schaltet, und zwar für eine genau definierte Zeit (nennen wir sie im folgenden t1). Die Relais sollen angesteuert werden, wenn taster 1 oder 2 gedrückt werden. Und zwar soll nur relais 1 anziehen, wenn taster 1 gedrückt wird, und relais 2 und 3 soll anziehen wenn taster 2 gedrückt wird. Relais 3 soll aber verzögert (Verzögerungszeit: t2)nach relais 2 anziehen. Des weiteren soll eine weitere zeit t3 integriert werden, die=0 ist, wenn einer der taster zum zweiten mal hintereinander betätigt wird. Wird erst Taster 1 und dann taster 2 betätigt, soll t3=20 ms sein.
Die Zeit t1 wird vorgegeben von einem Drehschalter S1, er sagt dem MC wie lange Relais 1 und 2 schalten sollen. Je nachdem in welcher Stellung der Drehschalter (nicht Poti!) ist wird eben Eingangspin 0....7 auf low gezogen, und das Programm bekommt die dementsprechende Zeit mitgeteilt (z.b. 10ms bei stellung 1, 20 bei stellung 2 usw.).
Die Zeit t2 soll genauso über einen zweiten Drehschalter eingestellt werden können.
Ich brauche jetzt keinen ganzen Quelltext, sondern hänge nur an einem Problem: wenn ich mit dem Befehl "dim Time as Byte" arbeite, und dann sage If ... then time = 20 ... waitms time , dann funktioniert das ganze, allerdings nur mit genau einer zeit Time. jetzt habe ich aber 3 Zeiten und nur einmal die Variable Time. Ich habe es versucht mit dem Befehl "dim t2 as byte" und "dim t3 as byte", allerdings funktioniert es da nicht. Kann mir jemand Helfen?

Gruß Paul

repi64
20.08.2006, 16:35
Wieso sollte dies mit "Dim t2 as Byte" nicht gehen?
Mich wundert eher, dass es mit "Dim Time....." gehen soll, denn Time ist ja ein Reserved Word also für einen Variablen Namen nicht geeignet.
Deine Drehschalterabfrage würde ich mit Select Case machen, da du mehrere möglichkeiten hast.

Powell
21.08.2006, 08:25
Hi

Also es will einfach nicht funktionieren. Habe mal das Listing gepostet, vielleicht kann jemand einen fehler erkennen. Habe jetzt einfachheitshalber mal nur mit t1 geschrieben, denn nicht mal so funktioniert es.

$regfile = "m8def.dat"
$crystal = 1000000 'ATmega8-Deklarationen 'Quarz: 16,000 MHz

Declare Sub Runter
Declare Sub Hoch
'
Ddrb = &B00111000 'Pin Pb5,4,3 Ausgang, rest Eingang
Portb = &B11000111 'Pullups der Eingänge aktiviert
Ddrd = &B00000000 'Pins von Portd=Eingänge (Drehschalter)
Portd = &B11111111 'PullUp von Pin PD0+1+rest aktivieren
'----------------------------------------------------------

Dim T1 As Byte

'----------------------------------------------------------
Do

If Portb.0 = 0 Then
T1 = 10
End If

If Portd.7 = 0 Then
T1 = 20
End If

If Portd.6 = 0 Then
T1 = 30
End If

If Portd.5 = 0 Then
T1 = 40
End If

If Portd.4 = 0 Then
T1 = 50
End If

If Portd.3 = 0 Then
T1 = 60
End If

If Portd.2 = 0 Then
T1 = 70
End If

Debounce Pinb.1 , 0 , Runter , Sub
Debounce Pinb.2 , 0 , Hoch , Sub 'Entprellter Eingabetaster

Loop
'----------------------------------------------------------
Sub Runter



Portb.3 = 1

Waitms T1 'Eingestellte Schaltzeit
Portb.3 = 0
End Sub

Sub Hoch



Portb.5 = 1
Waitms 100 'Vorschaltzeit
Portb.4 = 1
Waitms T1 'Eingestellte Schaltzeit
Portb.4 = 0
Portb.5 = 0 'Ausgänge in Leerlaufzustand schalten
End Sub


End

Powell
23.08.2006, 17:57
Hi Leute

Kann mir niemand weiterhelfen? Ich bin am verzweifeln :(
Vielleicht ist es ein einfacher Programmierfehler, ich bin noch nicht sehr lang im Geschäft und beherrsche Bascom nicht wirklich gut.
Der Syntax Check meldet jedenfalls keine Fehler... kann jemand vielleicht ein Beispiellisting posten (von dem Teil wo´s drauf ankommt)? Wäre echt super.

Gruß Paul

repi64
23.08.2006, 18:14
Da sehe ich schon mal eine Sache zum Thema Debounce.
Die Hilfe sagt doch wie es geht.
Nicht "Sub Hoch" sondern "Hoch:"
Nicht "End Sub" sondern "Return".
Was sagt der Simulator zu deinem Prog?
Der ist für so etwas auch sehr brauchbar.

Powell
23.08.2006, 20:34
Hi

Also ich hab jetzt herausgefunden, dass das Programm an sich eigentlich funktioniert. Wenn ich die Portpins nacheinander softwareseitig setze, dann arbeitet mir der µC das Programm auch genau wie gewünscht ab, je nachdem welcher Portpin simultan für den Drehschalter gesetzt wurde. Hardwareseitig werden die Pins auch vom Drehschalter auf low gezogen, ich messe 0 V am jeweiligen Pin. Aber das Programm ignoriert diese Tatsache vollkommen. Es ist wie wenn die Pins im Programm nicht als Eingänge definiert wären... sind sie doch aber. Wodran kann denn das bitte noch liegen? Ich hab schon active high und active low programmiert - nichts. Ich hab auch mal ausprobiert ob das ddregister vielleicht andersherum funktioniert (1= Eingan) - auch nichts. Mir ist das echt ein Rätsel...

Powell
23.08.2006, 20:58
Hallo nochmal...
Ich glaube ich hab den Fehler gefunden. Wie oben zu sehen hab ich bei den Drehschalterpins "If PORTD.x=..."
Ich habs mal umgeschrieben in "If PIND.x=..." und oh wunder.... der geht!!!
Allerdings auch nur, wenn man den Befehl in das Sub schreibt, wenn er in der Hauptschleife steht wird er irgendwie auch ignoriert...
Jetzt hab ich zwar mein Problem gelöst, würde mich aber trotzdem über eine kurze Nachhilfe freuen, damit ich auch weiß warum das denn so nicht gefunzt hat.

Gruß Paul =P~