50 us Highpegel alle 12 ms erzuegen

Gast #702021
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?
#702191
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.
Gast #702382
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();
}
Gast #702896
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:
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
}
...
Gast #702912
Lesenswert?

... 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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren