PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit Taster einen Timer starten ?



Enterprise
01.11.2005, 00:20
Hallo Forum,

Hier habe ich ein kleines Listing.
Ich möchte die Taste PD2 drücken die LED an Port PD3 soll eine Minute leuchten dann aus gehen.



$Regfile = "m8def.dat"
$Crystal = 3686000 'Quarz: 3.6860 MHz
DDRD = &B0001000 'Pin PD3 Ausgang, Rest Eingang
'PORTD = &B0000100 'PullUp von Pin PD2 aktivieren

Do
If PIND.2 = 0 Then 'Wenn Taster (Pin PD2) gedrückt
PORTD.3 = 1 'Rote LED (Pin PD3) an
Else 'Wenn Taster nicht gedrückt
PORTD.3 = 0 'Rote LED aus
End If
Loop
End


Kann mir da jemand helfen ?

mfg

Enterprise

Torsten_G
01.11.2005, 00:41
Hi,

wenn´s nur um den Taster und die Led geht, kannst Du dir mit dem Wait-Befehl helfen. Funzt aber nur, wenn der Prozessor während der Minute ausser Warten nichts anderes tun muß...

Außerdem solltest Du beachten, dass die LED´s und Eingänge üblicherweise mit einem Pullup-Widerstand betrieben werden, d.h., die LEd leuchtet, wenn der Ausgang auf logisch "0" gesetzt wird. Von daher hätte Dein Programm nicht funktioniert.

Der Grund liegt darin, dass ein Prozessor-Pin die 20mA nur gegen GND schalten kann, Der High-Pegel liefert nur ein paar mA.


$Regfile = "m8def.dat"
$Crystal = 3686000 'Quarz: 3.6860 MHz
DDRD = &B0001000 'Pin PD3 Ausgang, Rest Eingang
'PORTD = &B0000100 'PullUp von Pin PD2 aktivieren
'Damit aktivierst Du keine Pullups sondern schreibst nur ein Bitmuster in das Byte von PortD...

Portd.3=1 'Portd.3 auf 5V-> LED aus...

Do
If PIND.2 = 0 Then 'Wenn Taster (Pin PD2) gedrückt
PORTD.3 = 0 'Rote LED (Pin PD3) an
end if
if Pind.2=1 and Pind.3=0 then 'Wenn Taster frei und Portd.3 =0 (LED an)
wait 60
PORTD.3 = 1 'Rote LED aus
End If
Loop
End


Ist nicht getestet, nur runtergetippt - die Feinheiten überlasse ich Dir...

Viele Grüße

Torsten

SprinterSB
01.11.2005, 09:36
Außerdem solltest Du beachten, dass die LED´s und Eingänge üblicherweise mit einem Pullup-Widerstand betrieben werden, d.h., die LEd leuchtet, wenn der Ausgang auf logisch "0" gesetzt wird. Von daher hätte Dein Programm nicht funktioniert.

Der Grund liegt darin, dass ein Prozessor-Pin die 20mA nur gegen GND schalten kann, Der High-Pegel liefert nur ein paar mA.

Für viele µC ist das der Fall. Die Ausgangstreiber der AVRs sind hingegen symmetrisch, so daß ein Port als Ausgang nicht nur 20mA versenken, sondern auch liefern kann.

Unter 'Absolute Maximum Ratings' steht sogar

DC Current per I/O Pin: 40.0 mA
Ein Pin kann also 40mA aushalten, ohne abzufackeln.
Allerdings ist nicht garantiert, daß ein Pin auch wirklich 40mA liefert/versenkt. Das ist wie gesagt weniger und hängt von Vcc ab und der Temperatur ab.

Test conditions (20mA at Vcc = 5V, 10mA at Vcc = 3V)

Zusätzlich gibt es aber noch Einschränkungen an den Gesamtstrom pro PortX und Gesamtstrom über Vcc- und GND-Pin(s), die sich auch für die Verschiedenen AVRs und Gehäusetypen unterscheiden.

Das findet sich alles unter 'Electrical Characteristics' bzw 'I/O Pin Source/Sink Current vs. Output Voltage'.

hardstyleroxx
01.11.2005, 11:17
Wäre jetzt nochmal jemand so nett das ganze mit einem Timer zu realisieren? Ich verstehe die ganze Timer-Geschichte nämlich auch nicht.

01.11.2005, 18:31
Danke für die Tipps mit Wait.
Jetzt möchte ich noch in dieser Zeit einen Port abfragen ,ob er gedrückt ist oder nicht.
Wie müßte ich das jetzt einpflegen ?
So wie hardstyleroxx gefragt hat , mit einem Timer?

mfg

Enterprise

hardstyleroxx
01.11.2005, 20:10
Da kommst du nämlich schon zu dem Problem von Wait. In der Zeit wo ein Wait gesetzt ist, macht der ganze Controller nichts anderes ausser warten.
Deswegen würde mich auch mal interessieren wie man eine LED mit einem Timer blinken lässt.

Torsten_G
01.11.2005, 21:40
...
Die Ausgangstreiber der AVRs sind hingegen symmetrisch, so daß ein Port als Ausgang nicht nur 20mA versenken, sondern auch liefern kann.
...


Danke für den Tipp, offenbar waren meine Kenntnisse darüber veraltet!

Grüße

Torsten

04.11.2005, 20:36
Hallo Forum,

Kann zu diesem Thema niemand etwas dazu schreiben.
Weil hardstyleroxx und ich brennend auf die Antwort warten.
Da wir defizit im Timer Programmieren haben.

mfg

Enterprise

hrei
04.11.2005, 20:49
Hallo,


Hallo Forum,
Kann zu diesem Thema niemand etwas dazu schreiben.
Weil hardstyleroxx und ich brennend auf die Antwort warten.
Da wir defizit im Timer Programmieren haben.


es gibt ein nettes Tool, mit dem man nicht nur realisierbare Zeiten von Timern ausrechnen kann, sondern das auch gleich noch einen Sourcecode auspuckt, der auch das blinken einer LED enthält. Das Teil heßt RN-avr und steht unter:

https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=169

zum Downlod bereit. Die Anpassung an eigene Bedürfnisse sollte ein leichtes sein.

Grüße
Henrik

Enterprise
13.11.2005, 17:18
Hallo Forum,

Nun habe ich ein bischen Zeit gehabt zum downloaden und testen.
Habe mit dem Programm eine Sourcecode erstellt.



'wenn mega 32, dann ändern in $regfile = "m32def.dat"
' $regfile = "m16def.dat"
$regfile = "m8def.dat"
$crystal = 3686000

'nur notwendig wenn rs232 benutzt werden soll
$baud = 9600

'Hier wird der Timer und der Teiler festgelegt
Config Timer0 = Timer, Prescale = 64

'Der Port mit der dritten LED auf RN-Control wird als Ausgang programmiert
Config Pinc.2 = Output
'Hier geben wir der Definition einen schöneren Namen
Led3 Alias Portc.2

'Hier wird das Unterprogramm festgelegt, das
'in dem von ihnen eingestellten Intervall aufgerufen wird
On Timer0 Timer_irq

'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
Const Timervorgabe = 198


'Hier werden die Timer aktiviert
Enable Timer0
Enable Interrupts

'Hier ist die Programmhauptschleife
Do
'Hier könnte Ihr Hauptprogramm stehen
Loop



'Dies ist der Programmteil, der in dem von ihnen gewählten
'Intervall aufgerufen wird
Timer_irq:
Timer0 = Timervorgabe

'Hier könnte nun ihre beliebige IRQ-Routine stehen
'Dabei sollte man darauf achten das diese nicht mehr Zeit
'benötigt, als das Intervall zuläßt

'Der Zustand der LED wir umgekehrt, wodurch sich blinken in der halben Frequenz ergibt
'Hohe Frequenzen sind natürlich nicht mehr sichtbar
Toggle Led3

Return





zum Downlod bereit. Die Anpassung an eigene Bedürfnisse sollte ein leichtes sein.

Grüße
Henrik

Aber für ein Anfänger ist es nicht leicht.
Kann mir jemand dabei helfen ?

mfg

Enterprise

Marco78
13.11.2005, 21:54
Du kannst mit dem Programm ja Sekunden zählen und in der Routine die Sekunden bis 60 hochzählen lassen. Bis 60 Erreicht ist dann die LED leuchten lassen.
Nach 60 Sekunden halt ausschalten.
Du kannst ja durch erneutes drücken des Tasters die Sekunden wieder auf 0 setzen.
Jetzt einen Code zu geben (der auch für alle anderen passt, die sowas in der Art machen wollen) ist schwer, ohne zu wissen, was das Programm evtl sonst noch können soll.


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

Config Timer1 = Timer, Prescale = 64

Config Pinc.2 = Output
Led3 Alias Portc.2

On Timer1 Timer_irq

Const Timervorgabe = 7936

Dim Sekunden as Byte

Enable Timer1
Enable Interrupts

Do
If Sekunden <60 then Set LED3
Reset LED3
Loop


Timer_irq:
Timer1 = Timervorgabe
Incr Sekunden
Return

Das Programm sollte bei 3,86MHz wie du sie auch hattest nach dem Start eine Minute die LED leuchten lassen.

If PIND.2 = 0 Then Enable Timer1

würde den Timer erst starten wenn der Taster gedrückt wurde. Allerdings musst du die Zeile vorher im Code wo er schon gestartet wird entfernen.

Soviel muss als Hilfestellung reichen. Mehr geht nur wenn man genau weiss, was das Programm machen soll. Der Taster wird ja auchnicht dauerhaft abgefragt wenn das Programm größer ist. Evtl ist ein Interrupt notwendig. Aber ohne es genau zu wissen muss dir das zum üben erstmal reichen.

Enterprise
14.11.2005, 12:27
Danke

Für dein Script.
Werde es heute Abend testen und weiters schreiben.

mfg

Enterprise

Enterprise
14.11.2005, 22:52
Der Timer ist spitze.
Habe nun das Script etwas verändert.
Ich möchte mit dem drücken des Taster auf Pind.5 die Minute Starten
um die LED zum leuten bringen.
Nach der Minute kann ich die Taste drücken so oft ich will das Programm wird nicht mehr gestartet.
Was muss ich im Script ändern.
Dass ich wieder die Minute starten kann.



'################################################# ##########################

$regfile = "m8def.dat"
$crystal = 3686000
Declare Sub Tastendruck

Config Timer1 = Timer , Prescale = 64

Ddrd = &B01000000
Portd.5 = 1


Config Pinc.2 = Output
Led3 Alias Portc.2


Config Pinc.3 = Output
Led4 Alias Portc.3

On Timer1 Timer_irq

Const Timervorgabe = 7936

Enable Timer1
Enable Interrupts
Dim Sekunden As Byte

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

Do

Debounce Pind.5 , 0 , Tastendruck , Sub


Loop


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

Timer_irq:

Timer1 = Timervorgabe

Toggle Led3

Incr Sekunden

Return

'--------------------------------------------------------------------------
Sub Tastendruck

' Portd.6 = Not Portd.6

Do
If Sekunden < 60 Then Set Led4
Reset Led4
Loop

End Sub

End


mfg

Enterprise

recycle
15.11.2005, 01:36
Der Timer bringt deine LED3 ans blinken und zählt den Wert für Sekunden hoch.

Deine Routinen für die Tasten schaltet LED4, allerdings nicht sehr sinnvoll.

Wenn Sekunden < 60 wird LED4 gesetzt und sofort wieder zurückgesetzt.
Da Sekunden eine Byte-Variable ist, und in deinem Programm immer nur hochgezählt wird, läuft sie bei 256 über.

Dein Taster wird zwar in einer Endlosschleife abgefragt, sobald du ihn drückst, springt die Routine aber in eine andere Endlosschleife die deine LED4 einige tausend mal pro Sekunde ein- und wieder ausschaltet. So schnell kann kein Mensch gucken.
Dein Taster wird danach gar nicht mehr abgefragt, ist also egal wie oft du da drauf rumdrückst.

Insgesamt ergibt das Ganze für mich recht wenig Sinn.



Was muss ich im Script ändern.

Ich befürchte fast alles. Erst mal ein bischen Basic lernen wäre dafür bestimmt recht hilfreich. Guck dir z.B. mal in der Bascom-Hilfe die Befehle Do, Loop, Sub, Return usw. an.

Wenn du in deinem Programm in eine Unterroutine verzweigst, sollte es in der Regel irgendwann aus dieser wieder zurückkommen.
Das "End SUB" in deiner Routine Tastendruck wird aber gar nicht erreicht, weil davor ein "Loop" steht und die Routine daher zum "Do" darüber zurückspringt.

Ist nicht böse gemeint, aber ich glaube, wenn dir jemand das fertige Programm postet nutzt dir daas wenig. Versuch lieber erst mal zu verstehen, was in deinem Programm passiert und probier selber ein bischen rum.

Marco78
15.11.2005, 20:56
Nach der Minute kann ich die Taste drücken so oft ich will das Programm wird nicht mehr gestartet.
Was muss ich im Script ändern.
Dass ich wieder die Minute starten kann.
Wunderbar, es hat geklappt. Ich meine damit nicht das das Programm läuft, sondern die Einsicht, das das alles nicht mal ebend so ist.

Wie recycle schon schrieb. Da hängt noch so einiges mehr dran.
Selbst wenn man soweit ist, das im Gedanken der Programmablauf steht und man weiss, was man will, wird man zu Anfang noch feststellen, das es dann doch nicht immer so klappt wie man es sich denkt.
Es müssen ggf. einige Taster Vorrang gegenüber anderen tastern haben.
Z.B. ein Not-Aus-Taster muss immer funktionieren. Egal an welcher Stelle das Progamm grade steht. Und wenn man Not-Aus drückt, gedrückt hält und noch einen zweiten Taster dazu drückt, darf das Programm nicht wieder anlaufen.

Wie es im Leben so ist, muss man alles erst erlernen.
http://www.rowalt.de/mc/index.htm
Arbeite am besten man den Kurs da durch. Ach wenn es auf dem ersten Blick nicht so aussieht, aber es geht da um AVR's und Bascom.
Wenndu die Möglichkeit hast, drucke dir die Seiten aus. Ich glaube es sind do um die 20 Seiten.
Da kannst du schnell die Zusammenhänge und Grundeigenschaften lernen. Und es ist kostenlos im Gegensatz zu Büchern.

Wie ich schon weiter oben geschrieben habe, musst du dir erstmal genau überlegen, was dein Programm können soll.
1. Soll in den 60 Sekunden ggf. noch was anderes passieren?
2. Wenn 1. Ja: Braucht man dafür auch einen Timer? Wenn Ja, welche Zeiten muss der haben. Wie kann ich beide auf einen Nenner bringen.
3. Was soll passieren, wenn der Taster 62 Sekunden lang gedrückt wird? Sollen die 60 Sekunden dann nochmal anfangen abzulaufen oder erst wenn der Taster mind. einmal losgelassen wurde.
4. Was soll passieren, wenn der Taster vor Ablauf der Zeit nochmal gedrückt wird? Soll dann die Zeit verlängert werden? Soll das Zeit abgebrochen werden. Also quasi ausschalten.
5. Soll dreimal drücken bewirken, das die Zeit 3 Minuten läuft? Wenn ja, in welcher Zeit soll das drücken akzeptiert werden.

Das klingt alles sehr hart, ist es auch ;)

Beim Programmieren (egal ob Mikrocontroller oder PC) Sollte ein Großteil der Zeit für die Planung beansprucht werden. Somit hat man es später einfacher.

Fang erstmal klein an. Arbeite den Kurs durch. Dann überlege dir selbst Aufgabenstellungen die du lösen willst. Wenn du Hilfe brauchst, such hier im Forum ob schonmal jemand das Problem hatte und die Lösung dir hilft.
Wenn nicht, kannst du immer noch fragen. Wie du hier auch schon gesehen hast, bekommst du ja Hilfe. Aber es bringt wirklich nichts, wenn du jetzt einen fertigen Code bekommst, ihn aber nicht verstehst.