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