0,05sec? sind 50ms
mach doch einfach eine Do..Loop schleife..
Do
Print Pind.5
waitms 50
loop
müsste gehn
MfG
Ringo
Hallo Forum,
Ich möchte den Portd.5 alle 0,05 Sekunden abragen.
Wenn der Port auf 1 ist dann soll über den UART eine 1 gesendet werden und wenn der Port auf 0 ist dann soll eine 0 gesendet werden.
Ich habe dafür keinen Ansatz wie ich anfangen soll.
Ob ich einen Interupt brauche oder welchen Timer ??
Hat jemand für mich einen Ansatz.
mfg
Enterprise
0,05sec? sind 50ms
mach doch einfach eine Do..Loop schleife..
Do
Print Pind.5
waitms 50
loop
müsste gehn
MfG
Ringo
Nobody is Perfect
Visit www.ringo.roboterbastler.de last update: 23.05.2009
Ja,oder den Timer bemühen
Gruß
Ratber
Danke für die kleine Hilfe,
Habe dann mal los programmiert.
Dieses Programm kam dann raus.
Es funktioniert noch nicht so wie ich es will.Code:$regfile = "m8def.dat" 'ATmega8-Deklarationen $crystal = 3686000 'Quarz: 3,6864 MHz $baud = 9600 'Baudrate der UART: 9600 Baud On Timer1 Ontimer1 Config Timer1 = Timer , Prescale = 64 'Timertakt = Crystal / 64 Enable Timer1 'Timer1 einschalten Enable Interrupts 'Interrupts Global einschalten Const Timervorgabe = 36736 Ddrd = &B10011111 'Pin PD6 Ausgang, Rest Eingang Portd = &B01100000 'PullUp von Pin PD 0,1,2,3,4 aktivieren Dim Zler As Byte Dim P5 As Byte Dim I As Byte Declare Sub Port5 Declare Sub Summer I = 1 '---------------------------------------------------------- '###Hauptschleife### '---------------------------------------------------------- Main: '---------------------------------------------------------- Do Debounce Pind.6 , 0 , Port5 'Entprellt Loop '---------------------------------------------------------- '---------------------------------------------------------- ' ###### Port 5 ########### '---------------------------------------------------------- Port5: Zler = 1 For I = 1 To 10 ' Durchgang 10 mal ' Sollte dann Timer auf 10 Print Pind.5 ; " " ; Zler P5 = Pind.5 If P5 = 0 Then Portd.7 = 0 ' Summer an Port7 aus Else Portd.7 = 1 End If ' Summer an Port7 ein Waitms 100 Next I Goto Ende '----------------------------------------------------------- '####### Summer ############## '----------------------------------------------------------- Summer: If P5 = 0 Then Portd.7 = 0 Else Portd.7 = 1 End If Return '------------------------------------------------------------ '------------------------------------------------------------ '#### Ende ##### '------------------------------------------------------------ Ende: Print " " Print " " Print " Ende " Print "<--->"; Print " " Print " " Goto Main Return '----------------------------------------------------------------------- '####### Timer ############ '---------------------------------------------------------------------- '###OnTimer1### Ontimer1: Timer1 = Timervorgabe Incr Zler Return End
Mit der Funktion Print Pind.5 erscheint immer eine 1 ich hätte gerne eine 0.
Die For Next Schleife ist nur drin dass ich es besser kontrolieren kann.
Der Timer ist auch nicht richtig eingestellt.
Sollte jede Sekunde überlaufen.
Nach dem drücken des Pind.6 soll das Programm 10 Sekunden laufen.
Also den Pind.5 alle 50 ms abfragen.
Hat jemand noch eine Idee wie ich das Programm verändern könnte ?
mfg
Enterprise
Das liegt daran, das der Taster gegen Masse schaltet und der interne Pullup immer eine 1 erzeugt.Mit der Funktion Print Pind.5 erscheint immer eine 1 ich hätte gerne eine 0.
Das könntest du mit IF THEN ändern. IF blablabla = 1 Then Print "0"
Das könntest du auch mit IF und den INT einschalten lösen.Nach dem drücken des Pind.6 soll das Programm 10 Sekunden laufen.
Also den Pind.5 alle 50 ms abfragen.
IF d.6 = 0 then Enable Timer1
Der Timer kann ja auch eine Sekunde eingestellt werden und 10 mal eine Variable erhöhen.
Aber das abfragen alle 50ms solltest du nochmal überdenken.
So schnell kann kein Mensch drücken
Und das ist ja auch schon fast die Zeit, die zum entprellen benötigt wird.
Was genau soll in dieser Zeit passieren? Willst du den Taster lange drücken und so lange er gedrückt ist soll alle 50mS was passieren?
Dann müsste die Abfrage ja 50mS dauern. Bzw. in 50mS muss der Taster mehrmals abgefragt werden.
Und was soll nach dieser Zeit passieren? Nochmal abfrgaen? Wieviel Zeit darf bis zur nächsten Abfrage vergangen sein?
Mag ja sein, das ich dein Problem nicht richtig verstanden habe, aber es kann auch sein, das du das was falsch siehst?!?
Es wäre hilfreich zu wissen, was genau passieren soll.
Das mit den 10 Sek ist nicht das Problem. Aber die Abfrage.
Also an Port 5 soll kein Taster sondern ein LDR.
Der wird von einem Laser getroffen.
Deshalb soll alle 0,05 Skunden abgetastet werden.
Ist der Port auf 1 oder 0 .
Die Abtastrate soll dann 10 Skunden dauern.
mfg
Enterprise
Habe das Programm etwas geändert.
Wo müßte ich dasCode:$regfile = "m8def.dat" $crystal = 3686400 $baud = 9600 'Baudrate der UART: 9600 Baud Config Timer1 = Timer , Prescale = 64 On Timer1 Timer_irq Const Timervorgabe = 7936 Ddrd = &B10011111 Ddrc = &B11111111 Portd = &B01100000 Config Pinc.2 = Output Led3 Alias Portc.2 Dim Sekunden As Byte Dim P5 As Byte Declare Sub Port5 Declare Sub Ledon Declare Sub Main Declare Sub Ende Enable Timer1 Enable Interrupts Main: '---------------------------------------------------------- Do Debounce Pind.6 , 0 , Ledon: 'Entprellt Loop '---------------------------------------------------------- Ledon: Print "S" Do If Sekunden < 10 Then Set Led3 ' Print " " ; Sekunden Else Reset Led3 Sekunden = 0 Goto Ende End If Print Pind.5 ; " " P5 = Pind.5 If P5 = 0 Then Portd.7 = 0 ' Summer an Port7 aus Else Portd.7 = 1 End If ' Summer an Port7 ein Waitms 50 Loop '------------------------------------------------------------ '####### Ende ############### '------------------------------------------------------------ Ende: Print "E" Print " " Print " " Goto Main Timer_irq: Timer1 = Timervorgabe Incr Sekunden Returneingefügt werden ?IF blablabla = 1 Then Print "0"
mfg
Enterprise
Ich glaube ich habe es gefunden.
mfgCode:Ledon: Print "S" Do If Sekunden < 10 Then Set Led3 'Led zeigt 10 Sek.an ' Print " " ; Sekunden Else Reset Led3 Sekunden = 0 Goto Ende End If 'Print Pind.5 ; " " P5 = Pind.5 If P5 = 1 Then Print "0" Portd.7 = 0 ' Summer an Port7 aus Else Print "1" Portd.7 = 1 End If ' Summer an Port7 ein Waitms 50 Loop
Enterprise
Laser --> LDR = 0,05 Sekunden???
Mhh, ich kaufe immer die günstigen LDR's. Die schalten nicht so schnell denke ich.
Wie auch immer...
Das If hast du da an der richtigen Stelle eingefügt.
Hast du das ganze schonmal aufgebaut und getestet? Ich kann nur schwer nachvollziehen, das es geht und was es letztendlich bringen soll.
Also irgendwie höhrt sich das nach Rundenzähler oder Geschwindigkeitsmessung an.
Da wären LDR's allerdings denkbar ungeeignet.
Wenn die Trägheit LDR's dagegen als Entstörung genutzt werden soll dann ist das ne praktische Lösung.
Allerdings passen dann die 0.05s nicht mehr denn LDR's sind in der Regel um einiges Träger.
@Enterprise
Täte mich mit diesem Hintergrunde auch interessieren was es denn mal werden soll.
Gruß
Ratber
Lesezeichen