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 }
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.
... 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
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. ...
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...
Genau, Polling im Timer-Int. - ICP ist aber eleganter... ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.