PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Messung von Periodenlängen



Import-Script
03.03.2003, 21:32
hallo, <BR>ich stehe da vor einem kleinen problem. <img src="http://progshop.com/elektronik/diskussion/clipart/angry.gif" border=0> und zwar: <BR>Hardware: 4051, 24 MHz, Serielle &uuml;bertragung mit 9600 Baud. <BR>Jetzt möchte die länge von Impulsen in der größen ordnung von 0 - 500 Hz messen. habe aber nur noch Timer 0 zur verf&uuml;gung. <BR>hatte mir da was mit der zähler funktion &uuml;berlegt, ist es damit möglich? und das ich den wert, der gespeichert ist wenn ein impuls grade auf high ist, das in der zeit die daten an den pc &uuml;bertragen werden. und der zähler auf null gesetzt wird. <BR>wäre w&uuml;r eure ideeen dankbar. <BR>Pete

Import-Script
04.03.2003, 09:29
Was willst Du denn nun messen, Periodendauer oder Frequenz ? <BR>Wie oft soll das gesendet werden ? <BR>Soll die UART auch empfangen ? <BR> <BR>Du kannst z.B. eine Sende-UART in Software machen oder T0 in 2 Timer aufteilen &#40;mode 3&#41;. <BR> <BR>Bei einem Zähler weiß man nicht, ob gerade ein Impuls kommt, wenn man ihn zur&uuml;cksetzt. <BR>Daf&uuml;r gibt es 2 Lösungen: <BR>1. <BR>Man liest ihn nur und bildet die Differenz zum vorherigem Lesen. <BR> <BR>2. <BR>mit &#34;XCH A, TL0&#34; kann man exakt gleichzeitig lesen und löschen. <BR> <BR> <BR>Peter <BR>

Import-Script
05.03.2003, 14:18
Also, <BR>messen wollte ich die länge eines negativen impulses, und wärend eines positiven impulses sollte das gemessene ergäbnis an den pc geschickt werden. <BR>Die software sollte vom pc beeinflusbar sein, somit sollte der MC auch daten empfangen können &#40;abbruch, ... &#41; <BR>wie gesagt, also 500 hz d&uuml;rfe das maximum sein. <BR>mfg peter

Import-Script
25.03.2003, 00:20
hallo nochmal. <BR>ich habe probleme bei der messung der pulsweite. und zwar steht mir wie gesagt, nur noch timer 0 zur verf&uuml;hgung, den habe ich jetzt als einen 16 Bit zähler konfiguriert. ich betreibe den MC mit 24 MHz, und somit darf die längste periode 32767 ms dauern, oder? <BR>das w&uuml;rde einer fequenz von wieviel Hz entsprechen, wie errechene ich das? <BR>wie kann ich den timer am besten konfigurieren, damit ich einen &uuml;berlauf bei ca. 500 Hz bekomme? <BR> <BR>habe mir &uuml;berlegt den timer immer f&uuml;r eine genaue gleichbleibende zeit zu stoppen, und den wert somit mit dieser zeit zu dividieren, ist das so verständlich, wie ich das meine? <BR> <BR>habe im MC Kochbuch etwas von einem 5 Bit timer gelesen, aber heute nicht mehr so ganz verstanden, ist ja schon reichlich spät. <BR> <BR>danke schon mal an jeden, der sich diesen beitrag durchliest, und sich vielleicht ein paar gedanken macht, wie ich dieses problem löden könnte. <BR>mfg peter

Import-Script
25.03.2003, 21:50
Du kannst ja einen Timerinterrupt programmieren, beim &uuml;berlauf von Timer 0 und dort ein zusätzliches Byte mitzählen lassen. Dann hast du 24 Bit zum zählen. Das sollte dann wohl reichen. Ansonsten f&uuml;gst du in diesem Timerinterrupt soviele Bytes hinzu, bis es reicht. <BR> <BR>Dann nimmst du noch einen der beiden externen Interrupts &#40;INT0 oder INT1&#41; und schliesst dort den Ausgang eines XOR-Käfers &#40;74HCT08&#41; an. Den einen Eingang kommt dann von deiner Elektronik, wo du messen willst. Den anderen schliesst du an irgend einen Port vom 4051 an. Nun kannst du durch wechseln des einen Ports jeweils einen externen Interrupt auf die positive oder negative Flanke auslösen lassen, den Zähler auslesen,wieder auf 0 zur&uuml;cksetzen setzen und den Port kehren &#40;f&uuml;r die nächste Flanke&#41;. <BR> <BR>Alles klar ? <BR>

Import-Script
25.03.2003, 22:14
hallo, ich habe leider nur noch den PIN f&uuml;r die timer ansteuerung frei, da wollte ich das signal anlegen und die länge der negativen signale messen. <BR>ist das so auch möglich? <BR>

Import-Script
25.03.2003, 23:05
Wenn der Prozessor noch nicht allzu belastet ist, kannst duja mit dem Timer einen Timerinterrupt auslösen lassen. Dies musst du aber einige 1000x machen pro Sekunde. Dann liest du explizit den Port ein und vergleiche ihn mit dem geicherten Zustand vom letzten mal. <BR>- Wenn von 1 auf 0 wechselt -&#62; ein Register auf 0 setzen z.B. MOV R7, #0 <BR>- Wenn unverändert -&#62; Register um eins erhöhen z.B. INC R7 <BR>- Wenn von 0 auf 1 Register auslesen z.B. MOV A, R7 / MOV R6, A <BR> <BR>So hast du in R6 immer die Länge der letzten negativen Periode. <BR> <BR>Die Routine m&uuml;sste aber sehr kurz sein. Nicht dass sie wieder aufgerufen werden sollte, bevor sie fertig ist ! <BR> <BR>Hilft das, oder brauchst du ein Beispiel ? <BR>

Import-Script
25.03.2003, 23:55
hi, die idee verstehe ich schon, ein beispiel wäre aber nciht schlecht. <BR>ich muss ich auch noch zu guter letzt in der high phase das ergebnis seriell an den pc &uuml;bertragen. ist das zeitlich zu schaffen, bei 24 mhz und 9600 baud. <BR>die perioden länge geht von 0 bis 500 hz. mfg peter

Import-Script
26.03.2003, 10:00
Das mit den 9600 Baud ist zumindest vom Prozi her kein Thema. Erstens macht er die Kommunikation eh im Hintergrund. Ausser jeweils dem nächsten Byte zum senden nachzuschieben, hast du ja nichts damit zu tun. <BR> <BR>Mit 9600 Bits pro Sekunde kommst du auf &#40;8Bit &#43; 1 Start 1 Stop = 10 Bit pro Byte&#41; auf max 960 Bytes pro Sekunde. Wenn du tatsächlich 500 Perioden &uuml;bermitteln willst und mindestens 2 Byte pro Paket brauchst, hast du ein Problem !!! <BR> <BR>Nimm doch einen 22 MHz Quarz. Dann kannst du problemlos etwas schneller kommunizieren. Mit diesem Quarz bekommst du praktisch jede Baudrate problemlos hin. <BR> <BR> <BR>Habe hier ein Beispiel, wie ich mir das etwa vorstelle. Es ist aber absolut ungetestet !!!!! <BR> <BR>Den Timer-Interrupt musst du selber noch initialisieren. Am Besten wohl mit dem 8-Bit Autoreload. Jetzt kommts drauf an, wie genau du die Periodenlänge wissen willst. Ich w&uuml;rde den Timer so stellen, dass er z.B. 4000x pro Sekunde aufgerufen wird. Dann ist das ganze doch schon recht genau und auch von der Proz-Belastung her, sollte das so gehen. <BR> <BR>Am Schluss hast du immer den letzten Wert im Dauer_High und Dauer_Low. Du könntest aber z.B. auch statt die Werte wegzuspeichern am Ende den Dauer_High direkt in den Sendepuffer schreiben und dann beim Serial_Interrupt das Dauer_Low noch nachschieben lassen. <BR> <BR> <BR> Input_Port EQU P3.4 <BR> Input_Port_Save EQU 20.0H <BR> <BR> Count_High EQU 21H <BR> Count_Low EQU 22H <BR> <BR> Dauer_High EQU 23H <BR> Dauer_Low EQU 24H <BR> <BR> <BR> <BR> <BR>T_Int0: <BR> PUSH ACC <BR> PUSH PSW <BR> JNB Input_Port, _T_Int0_A ; springe wenn low <BR> ; hier weiter, wenn Port auf High <BR> JB Input_Port_Save,_T_Int0_End ; letzte Periode war auch schon High <BR> ; hier weiter, bei Flanke Low auf High <BR> MOV Dauer_High, Count_High <BR> MOV Dauer_Low, Count_Low <BR> SETB Input_Port_Save <BR> SJMP _T_Int0_End <BR> <BR>_T_Int0_A: ; Hier weiter, wenn Port auf low <BR> JNB Input_Port_Save, _T_Int0_B ; hier weiter, bei Flanke High auf Low <BR> MOV Count_High, #0 <BR> MOV Count_Low, #0 <BR> CLR Input_Port_Save <BR> SJMP _T_Int0_End <BR> <BR>_T_Int0_B: ; Hier weiter, wenn vorher auch schon low <BR> INC Count_Low <BR> MOV A, Count_Low <BR> JNZ _T_Int0_End <BR> INC Count_High ; &uuml;bertrag wenn Low einmal ringelum ist <BR> <BR>_T_Int0_End: <BR> POP PSW <BR> POP ACC <BR> RETI <BR> <BR> <BR>Alles klar ? <BR> <BR>Viel Spass

Unregistriert
24.06.2004, 17:41
Wozu nicht den DPTR nehmen statt 2 register mit schleifen und Abfragen zu belasten.
mov dptr,#0000; erst mal auf 0 setzten
loop_schleife_ist_L: schleife bis h-pegel an 3.2
jb p3.2,fertig
inc dptr;
mov a,dpl
jnz loop_schleife_ist_l
mov a,dph
jnz loop_schleife_ist_l
;dptrwert verwursten
fertig:
mov dptr,#0000; dto
jnb p3.2,fertig_L

und wie oben usw usw

http://www.co2betrug.de