mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tiny2313: 4 Kanal PWM + IR Decoder; wie noch Zeit messen?


Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen.
Ich stehe vor folgendem Problem.
Ich habe einen Attiny2313. Dieser hat ja 4 PWM Kanäle die auch alle 
gleichzeitig im 8-Bit Modus benutzt werden, da separat mehrere 
LED-Leuchtmittel gedimmt werden sollen.
Die Helligkeit dieser Kanäle soll über eine IR Fernbedienung eingestellt 
werden können. Soweit so gut.
Nun habe ich jedoch das Problem, dass ich für die Decodierung der 
IR-Signale die High- und Low-Zeiten messen muss. Nun habe ich gedacht, 
dass ich zusätzlich noch den Timer Overflow Interrupt verwenden könnte, 
jedoch kann ich nicht feststellen ob der Counter gerade rückwärts oder 
vorwärts läuft und ich damit nicht die richtige Zeitdifferenz errechnen 
kann.
Der PWM läuft als Phase Correct PWM, damit ich auch ein echtes 
"Nullsignal" erzeugen kann. Sprich der Counter geht von BOTTOM nach TOP 
und dann wieder nach BOTTOM.

Der IR-Empfänger (TSOP) hängt an INT1 und löst sowohl bei steigender als 
auch bei fallender Flanke einen Interrupt aus. In der ISR will ich nun 
die Zeiten der IR-Signale messen.

Wie kann ich jetzt bestimmen wie lange die Low- bzw. Highphase eines 
IR-Signals genauer hat.
Mit einem Konstrukt in der Main-Funktion wie
while(1){

   _delay_us(10);
   timer++;
}
und einer Auswertung in der INT1 ISR:
ISR(INT1_vect){
  if(first == 0){
    first = 1;
    timer= 0;
  }
  else{
    if(timer > 40 && timer < 60){
      code <<= 1;
    }
    else if(timer > 100 && timer < 150){
      code |= 1;
      code <<= 1;
    }
    count++;
    first = 0;    
  }
  if(count == 25){
    done = 1;
    count = 0;
  }
}
scheint es sehr ungenau zu sein, sodass ich die Zeitfenster recht 
großzügig auslegen muss, damit es auch nur ansatzweise funktioniert.

Hat jemand eine Idee wie ich das am geschicktesten realisieren kann?

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du lässt den Hardwaretimer immer rumlaufen, für nichts bestimmtes, nie 
rücksetzen.

Um die Zeit zu messen, nimmst du am Anfang seinen Wert und ziehst ihn 
vom Wert am Ende ab. Das klappt sogar bei Überlauf des Timers.

So macht es de PC auch, ein Timer reicht für alle Aktionen.

Willst du längere Zeiten messen, addierst du die Überläufe so einer 
Subtraktion in einen Überlaufwert hinein.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das ist schon klar, aber dann müsste ich komplett Software PWM 
betreiben. Nun laufen die Timer ja beide im 8 Bit Phase Correct PWM. 
Sprich der Counter läuft nicht "im Kreis" sondern er geht von 0x00 bis 
0xFF und läuft dann wieder rückwärts bis 0x00 und löst dann erst den 
Overflow Interrupt aus. Und da ich die aktuelle Zählrichtung nicht 
auslesen kann kann ich die Zeitdifferenz nicht bestimmen.
Ich habe ja nur diese zwei Counter/Timer und muss diese also zusätzlich 
zu PWM noch irgendwie als Zähler missbrauchen.

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du dimmst LEDs, was willst du da mit Hardware-PWM ?


Das istvdoch wie 255er Goodyear auf der Seifenkiste...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Timmo H. (masterfx)

>Ja das ist schon klar, aber dann müsste ich komplett Software PWM
>betreiben.

Kann man, mit Soft-PWM, muss man aber nicht.

> Nun laufen die Timer ja beide im 8 Bit Phase Correct PWM.

Vollkommen unsinnig. Mach Fast PWM und gut.

>Ich habe ja nur diese zwei Counter/Timer

Was mehr als ausreichend ist.

MfG
Falk

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Vollkommen unsinnig. Mach Fast PWM und gut.
Das hatte ich probiert, aber irgendwie war bei Fast PWM bei OCR0A und 
OCR0B = 0 immernoch ein "Spike"

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Timmo H. (masterfx)

>> Vollkommen unsinnig. Mach Fast PWM und gut.
>Das hatte ich probiert, aber irgendwie war bei Fast PWM bei OCR0A und
>OCR0B = 0 immernoch ein "Spike"

Ja, das ist bekannt, steht auch so im Datenblatt. Das Problem ist aber 
leicht lösbar. Bei PWM==0 schaltet man den PWM-Ausgang als normalen 
Ausgang auf LOW ;-)

MFG
Falk

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Ja, das ist bekannt, steht auch so im Datenblatt. Das Problem ist aber
>leicht lösbar. Bei PWM==0 schaltet man den PWM-Ausgang als normalen
>Ausgang auf LOW ;-)

Oder negierte PWM.

MfG Spess

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mmh, also bei Fast PWM bekomme ich aber einen Interrupt bei MAX bzw. TOP 
und habe quasi keine Möglichkeit im richtigen Moment den Port auf 0 zu 
setzen...bzw. ich müsste die Ports wieder auf Normal Operation stellen 
und dann auf 0. Bissl umständlich irgendwie
Komischerweise verhalten sich Timer0 und Timer1 auch unterschiedlich.
Wenn ich beide in 8 Bit Fast PWM schalte, also
TCCR0A=(1<<WGM01)|(1<<WGM00)|(1<<COM0A1)|(1<<COM0B1);
TCCR0B=(1<<CS01)|(1<<CS00);

TCCR1A =(1<<WGM10)|(1<<COM1A1)|(1<<COM1B1);
TCCR1B=(1<<WGM12)<(1<<CS11)|(1<<CS10);
scheinen die OCR's vom Timer1 auf 0 zu gehen (LEDs ganz aus) die von 
Timer0 jedoch nicht.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube das hast du falsch verstanden. Du sollst, falls der OCR Wert 
0 ist, einfach den Pin auf 0 stellen. Wenn der nicht 0 ist, einfach den 
Pin wieder auf die PWM setzen und den OCR Wert setzen.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, das mit der unterschiedlichen Funktionsweise war mein Fehler 
(Syntax). Aber so wirklich gefallen tut mir das nicht mit dem Port auf 0 
setzen bzw. wieder auf PWM. Der Code wird durch die zusätzlichen 
if-Bedingungen mal eben um gut 100 Bytes aufgebläht. So langsam wirds 
eng mit der IR-Funktionalität...

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.