Forum: Mikrocontroller und Digitale Elektronik Attiny13a RC Schaltung über PWM Signal


von Daniel K. (danielkuenzler)


Lesenswert?

Ich habe  einen Empfänger (3.7V) welcher auf einem Ausgang ein PWM 
Signal konfiguriert hat. Die Fernsteuerung sendet 0, grösser 90 und 
kleiner 90 Signale als Tastimpulse. Über dieses >90 Signal und <90 
Signal möchte ich auf dem Attiny13a zwei Ausgänge steuern (SMD LED's mit 
entsprechenden Wiederständen sind angeschlossen)

Das Ziel ist, dass ich am Sender (Fernbedienung) einen Signalwert >90 
auslösen kann (kurzzeitig, daher Taster) und dann der Attiny13a diesen 
auswertet und den einen Ausgang gegen Power Schaltet (LED leuchtet). Die 
LED soll so lange leuchten bis wieder ein "Tastsignal" >90 kommt.

Dasselbe beim Signal <90, jedoch soll der Attiny13a diesmal den andern 
Ausgang gegen Masse schalten und den Status halten, bis wieder <90 
kommt.

Da über den Attiny kein Debugging gemacht werden kann hoffe ich, dass 
mir ein erfahrener Programmierer hier weiter helfen kann, wie die 
Auswertung des PWM Signals und die anschliessende Ansteuerung der 
Ausgänge vorgenommen werden muss.
Programmieren möchte ich den Attiny13 über Arduino Uno - Blinkprogramme 
haben auf unterschiedlichen Ausgängen funktioniert.

Besten Dank voraus
Daniel

: Verschoben durch Moderator
von Michael B. (laberkopp)


Lesenswert?

Wenn deine Fernbedienung 'normal' ist sendet sie auf dem 'PWM' Ausgang 
einen Impuls von 1 ms bis 2ms Länge im Abstand von 25ms, und Zeiten 
unter 1.25ms sind dann wohl dein <90 und Zeiten über 1.75ms dein >90.

Da der Attiny nichts anderes zu tun hat, kann er auf die Flanken des PWM 
Signals aktiv warten.
1
void loop(void)
2
{ 
3
  while(!digitalRead(PWM)) ;
4
  unsigned long start=micros();
5
  while(digitalRead(PWM)) ;
6
  start=micros()-start;
7
  digitalWrite(LED1,start<1250);
8
  digitalWrite(LED2,start>1750);
9
}
setup left as an excercise to the reader.

Blöd ist halt, dass das Programm hängt, wenn an PWM kein Signal anliegt.

: Bearbeitet durch User
von Daniel K. (danielkuenzler)


Lesenswert?

Michael B. schrieb:
> Wenn deine Fernbedienung 'normal' ist sendet sie auf dem 'PWM' Ausgang
> einen Impuls von 1 ms bis 2ms Länge im Abstand von 25ms, und Zeiten
> unter 1.25ms sind dann wohl dein <90 und Zeiten über 1.75ms dein >90.
>
> Da der Attiny nichts anderes zu tun hat, kann er auf die Flanken des PWM
> Signals aktiv warten.
>
1
> void loop(void)
2
> {
3
>   while(!digitalRead(PWM)) ;
4
>   unsigned long start=micros();
5
>   while(digitalRead(PWM)) ;
6
>   start=micros()-start;
7
>   digitalWrite(LED1,start<1250);
8
>   digitalWrite(LED2,start>1750);
9
> }
10
>
> setup left as an excercise to the reader.
>
> Blöd ist halt, dass das Programm hängt, wenn an PWM kein Signal anliegt.

Besten Dank für die Rückmeldung
gehe ich richtig, dass das ermittelte Signal nun in ein 
Register(Speicher) schreiben muss und beim ändern vom Speicher dann die 
jeweiligen LED's on oder Off schalten kann?
Es soll ja immer ein >1750 Signal eine LED einschalten und wenn wieder 
ein >1750 wieder dasselbe LED abschalten. Dito für LED 2 nur gegen Masse 
schalten und bei <1250.

Merci
Daniel

von Michael B. (laberkopp)


Lesenswert?

Daniel K. schrieb:
> soll ja immer ein >1750 Signal eine LED einschalten und wenn wieder ein
>>1750 wieder dasselbe LED abschalten.

Achso, ein Toggle, nicht Momentary.

Ja, dann darf man die LED nicht direkt steuern, sondern muss entprellen 
und Speichern.
1
unsigned long last=1500;
2
bool led1=false,led2=false;
3
void loop(void)
4
{ 
5
  while(!digitalRead(PWM)) ;
6
  unsigned long start=micros();
7
  while(digitalRead(PWM)) ;
8
  start=micros()-start;
9
  if(start<1250&&last>=1250)  digitalWrite(LED1,led1=!led1);
10
  if(start>1750&&last<=1750) digitalWrite(LED2,led2=!led2);
11
  last=start;
12
}
Viel schwieriger ist das auch nicht.

von Daniel K. (danielkuenzler)


Lesenswert?

Besten Dank, gehe wieder basteln ;-)

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
Noch kein Account? Hier anmelden.