LED per Fernbedienung schalten (Modellbau)

Gast #264048
Lesenswert?

Hallo, ich bin erst seit kurzem mit einem Mega8 angefangen zu
programmieren. Habe nun folgendes Problem: Habe meinen Empfänger an den
Mega8 gehängt und will bei einer bestimmten Knüppelstellung eine LED zum
Leuchten bringen. Will das wenn man Spannung anlegt das Board die
Neutralposition lernt. Folgendes ist auszuwerten: es gibt einen Puls
der 1-2 ms lang ist. 1,5ms entsprechen Neutralstellung.
Hier mein Ansatz:

#include <avr/io.h>

void init(void);

int main(void)
{
  unsigned int count=0;
  unsigned int offset=0;

  init();    // Ports deklarieren

  loop_until_bit_is_set(PINC,0);   // Warten bis Signal Anfängt
  while (PINC & (1<<PIN0)) // Zählschleife für Neutralstellung
  {
    offset++;
  }

while(1)        // Endlosschleife
{
  while (PINC & (1<<PIN0))  // Zählschleife für Pulslänge
  {
    count++;
  }

  if (count>offset)// Wenn Knüppel nach oben bewegt wird LEDs an
  {
    PORTB = 0xff;
    count=0;
  }

  else
  {
    PORTB = 0x00;
    count=0;
  }
}
}

// Initialisierung
void init(void)
{
  DDRB = 0xff;  // PortB als Ausgang deklarieren
  PORTB = 0x00;  // Ports auf LOW schalten
  DDRC = 0x00;  // PortC als Eingang deklarieren
  PORTC = 0x00;  // ohne Pull-Up-Widerstände
}
#264050
Lesenswert?

... auch ne Möglichkeit.
Solche Sachen macht man aber eher mit dem integrierten Timer.
Der Mega8 hat sogar die Input-Capture-Funktion (ICP), damit lässt sich
sowas sehr einfach realisieren.
Beim ICP lässt man den entsprechenden Timer konstant durchlaufen.
ICP kann auf verschiedene Ereignisse reagieren.
Um Pulslängen (wie in diesem Fall) zu messen, stellt man die steigenden
Flanke ein.
Sobald das Interrupt auftritt bzw. das Ereignis-Flag gesetzt wird (ich
weiß jetzt nicht wie das heisst => Datenblatt [Complete] wirst du eh
brauchen...), liest man den Timerwert aus und setzt das ICP-Dings auf
die fallende Flanke. Sobald diese auftritt, wird erneut der Timer
ausgelesen. Beide Werte zieht man voneinander ab, und schon hat man die
Pulslänge in Taktzyklen. Damit kann man dann sämtliche Modellsteuerungen
dann realisieren.

Siehe auch:
http://www.mikrocontroller.net/forum/read-1-140143.html
#264051
Lesenswert?

Richtig, mit dem ICP-Ereignis kann man die Impulsbreite wunderbar
messen.

Meine ersten Fernsteuermodule realisierte ich aber mit AT90S1200,
ATtiny12 und ATtiny15. Die hatten nunmal kein ICP. Und da die dort
angewendete Lösung recht stabil arbeitet, habe ich sie auch für den
AT90S2313 (der hat ICP) beibehalten. Die 2313-Version ginge auch
garnicht mit ICP, da sie 4 Kanäle auswertet und nur ein ICP vorhanden
ist.
An das Tastsignal des Empfängers kommt man ja nicht immer heran. Damit
könnte man mit einem ICP alle Kanäle decodieren und Fahrtregler sowie
Schaltfunktionen realisieren.

Mit Mega8 und anderen neueren AVRs habe ich noch keine RC-Impulse
auswerten müssen. Da würde ich heute aber auch ICP nutzen.

...

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