mikrocontroller.net

Forum: PC-Programmierung 50 us Highpegel alle 12 ms erzuegen


Autor: mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Freunde,

wie könnte ich einen Highpegel was 50us dauert alle 12ms erzeugen?

ungefähr so:

...__----______________________---______________________---__...
   ->50us<-
       ->      12ms            <-

Gruß
Mike

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Oder durch 241 , ich sehe grade, die 12 msec sind ohne die 50 usec 
gemeint.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Christoph Kessler

danke für die schnelle Antwort.

Ich will das ganze über ein Mikrocontroller programmieren.

Autor: mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Christian R.

kannst Du "Timer + PWM Block" genauer erklären?

Was macht PWM Block?

Thx

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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();
}

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
void timer1_interrupt(void)
{
  static uint8_t c = 0;
  
  c++;
  if(c == 240) {
    c = 0;
    set_pin_high();
  } else if(c == 1) {
    set_pin_low();
  }
}

void main(void)
{
  init();          // Ports initialisieren
  timer1_init();   // 50 us Interrupt
  sei();           // Interrupts freigeben
  do {
    sleep();       // bis zum nächsten Interrupt schlafen
  } while(1);
}
...

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... oder komplett in Hardware:
void main(void)
{
  init();          // Ports initialisieren
  timer1_init();   // PWM mit knapp 83Hz und 1/241 duty cycle
  sleep();         // für immer schlafen
}

CU

PS: Über welche µC reden wir hier eigentlich?

PPS: Bitte im ersten Bsp. die 240 dur 241 ersetzen!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.