Hallo Freunde, wie könnte ich einen Highpegel was 50us dauert alle 12ms erzeugen? ungefähr so: ...__----______________________---______________________---__... ->50us<- -> 12ms <- Gruß Mike
einen Quarztakt von 20 kHz mit einem 74HC40103 durch 240 teilen lassen, der Ausgang "TC" ist allerdings noch invers zum gesuchten, 50usec lang low, den Rest high, also noch einen Inverter nachschalten.
mit einem Timer wird alle 12 ms ein Interrupt ausgelöst. in der Funktion legen ich den Pin auf High und kann dann viele NOPs einfügen bis 50us erreicht wird, danach Pin wirder auf Low. aber das ist nicht Sinn der Sache Wie kann ich so machen, dass der Pin 50us auf High geht und dann auf Low?
Oder durch 241 , ich sehe grade, die 12 msec sind ohne die 50 usec gemeint.
Geht es jetzt um einen Microcontroller oder um einen PC? Mit dem PC bekommt man das ja kaum so genau hin. Mit einem µC und Timer + PWM Block kein Thema. Sogar ohne CPU-Beteiligung dann.
Das ließe sich mit etwas Hardware erledigen. Erzeuge ein Rechtecksignal mit 12 msec Periodendauer (also etwa 83 Hz) und steuere mit dessen steigender (oder fallender) Flanke ein Monoflop wie 74xx221 an, das so konfiguriert ist, daß es 50µs-Impulse erzeugt.
@ Christoph Kessler danke für die schnelle Antwort. Ich will das ganze über ein Mikrocontroller programmieren.
@ Christian R. kannst Du "Timer + PWM Block" genauer erklären? Was macht PWM Block? Thx
mike wrote: > @ Christian R. > > kannst Du "Timer + PWM Block" genauer erklären? > Da ich nicht mal weiß, welchen µC du verwendest: Nein. Schau ins Manual deines Microcontrollers. Prinzipiell musst du einen Timer laufen lassen, und bei bestimmten Zählerständen einen Port-Pin setzen/rücksetzen lassen. Zumindest beim MSP430 ist das mit 3 Register schreiben erledigt, den Rest macht die Timer-Hardware selbstständig.
ok meine Lösung: 2 Timer benutzt - 1. Timer 12ms - 2. Timer 50 us extern bool i; void main(void) { init(); //Ein- Ausgänge Ports initialisieren for(;;) { i=0; Timer1_Aktivieren(); //12ms Pin_auf_HIGH_Setzen(); Timer2_Aktivieren(); //50 us while(i==0) { //12 ms nichts tun, danach i=1 } } //alle 12 ms void Timer1(void) { Timer1_Aktivieren(); i=1; } //alle 50 us void Timer2(void) { Timer2_Deaktivieren(); Pin_auf_LOW_Setzen(); }
Also so wird das nichts! Btw. wozu gibts hier im Forum eigentlich entsprechende Tags zum Formatieren von Quellcode?! Um aber auch was Konstuktives beizusteuern, so wird eher ein Schuh draus:
1 | void timer1_interrupt(void) |
2 | {
|
3 | static uint8_t c = 0; |
4 | |
5 | c++; |
6 | if(c == 240) { |
7 | c = 0; |
8 | set_pin_high(); |
9 | } else if(c == 1) { |
10 | set_pin_low(); |
11 | }
|
12 | }
|
13 | |
14 | void main(void) |
15 | {
|
16 | init(); // Ports initialisieren |
17 | timer1_init(); // 50 us Interrupt |
18 | sei(); // Interrupts freigeben |
19 | do { |
20 | sleep(); // bis zum nächsten Interrupt schlafen |
21 | } while(1); |
22 | }
|
...
... oder komplett in Hardware:
1 | void main(void) |
2 | {
|
3 | init(); // Ports initialisieren |
4 | timer1_init(); // PWM mit knapp 83Hz und 1/241 duty cycle |
5 | sleep(); // für immer schlafen |
6 | }
|
CU PS: Über welche µC reden wir hier eigentlich? PPS: Bitte im ersten Bsp. die 240 dur 241 ersetzen!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.