Forum: Mikrocontroller und Digitale Elektronik LED per Fernbedienung schalten (Modellbau)


von toddy80 (Gast)


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
}

von Karl heinz B. (heinzi)


Lesenswert?

Guckst Du zb hier

http://www.hanneslux.de/avr/schaltmo/schaltmodul.html

Schau dich auch sonst bei HanneS um.
Da kriegst du eine Menge Anregungen.

von Rahul D. (rahul)


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

von Hannes L. (hannes)


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.

...

von Rahul D. (rahul)


Lesenswert?

Man kann sich natürlich auch ein ICP selber basteln:
Man fragt den Pin nach H-Pegel ab, sobald dieser eingetreten ist, merkt
man sich den Timer-Wert. Dann testet man auf L-Pegel...
Das kann man auch mit mehreren Pins gleichzeitig machen...

von Hannes L. (hannes)


Lesenswert?

Genau, Polling im Timer-Int. - ICP ist aber eleganter...

...

von Mathias (Gast)


Lesenswert?

wenn du etwas geld hast dann kannst du es auch mit einem enOcean
Funkmodul realisieren!

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.