Geändert von PICture (18.12.2014 um 07:59 Uhr)
MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!
Sorry, aber für mich ist heutzutage ein kleinster 8-pinner in SMD, wie ein "pull up". Ausserdem könnten sie gleich die Signale manipulieren und ausgeben.![]()
MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!
Das stimmt so nicht ganz.Beide Flanken sind in diesem Fall gar nicht nötig. Die fallende Flanke des einen Kanals entspricht zeitlich der Steigenden des nächsten.
Nach dem letzten Kanal und am Anfang des ersten Kanal ist eine Pause von mindestens 4ms.
Aus dieser Pause heraus wird im Empfänger der Start eines neuen Pulspaketes ermittelt.
Du kannst alle InterruptQuellen eines AVR Controllers nutzen die von einem externen Pin aus angesteuert werden können.
Also INT0, INT1, ICP, Comperator. Wenn Du einen Controller findest der 8 solcher Interruptquellen hat, kannst Du die verwenden.
Wenn nicht bleibt Dir noch die Möglichkeit mit den Pin Change Interrupts wie oben beschrieben.
Ein möglicher Kandidat wäre hier der ATMEGA88. Guck mal ins Datenblatt ab Seite 69.
Um überschneidungen bei den Interrupt Flags zu vermeiden würde ich für die geraden Kanäle den PCINT1 und für die ungeraden Kanäle den PCINT2 verwenden.
Somit wird der gleiche Interrupt maximal 1mal pro Millisekunde aufgerufen.
Das sind 20000 Taktzyklen. Da in dieser Zeit ja 2mal der Pinchange aufgerufen wird hat jeder dieser Interrupts 10000 mögliche Taktzyklen. Das sollte auch für umfangreichere Auswertungen ausreichen.
Der TCNT Wert, sowie die Zustände der Ports sollten ganz am Anfang der Interruptroutine eingelesen werden.
Das sollte den Jitter verringern.
Die Impulsausgabe selber könnte man mit Comparematch Interrupts machen.
Man zählt in den Comparematch Interrupts eine Variable hoch und lädt in das Comparematch Register den Wert für den nächsten Potentialwechsel ( TCNT + gewünschter Änderungspunkt ).
Dann brauchst Du nur noch per Swich Case Anweisung abhängig von der Zähl Variable das Ausgangssignal nach 1 oder 0 zu setzen.
Um die Reaktionszeiten möglichst kurz zu halten müsste man einen 20MHz Quarz verwenden und eventuell auch die Interruptroutinen in Assembler schreiben und die Register Sicherung im Interrupt optimieren.
Das wäre meine Lösung des Problems, wie das Timing hinhaut kannst Du mit dem Simulator vom AVR Studio 6.xx austesten.
Geändert von wkrug (18.12.2014 um 10:23 Uhr)
Wenn ich mir die 6 Eingänge über 2 Diodenmatrixen auf nur noch 2 Kanäle reduziere, wird es doch gar nicht nötig so viele Interrupts zu nutzen. Dann reichen mir ja 2. Dann muss nur in der Software mitgezählt werden bei welchem Kanal wir sind, und bei der langen Pause alles zurückgesetzt werden.
Außerdem reicht es bis auf den letzten Impuls, die positive Flanke zu triggern. Und durch den Zähler weis ich ja, wann ich bei der letzten angelangt bin, und kann den INT ganz einfach auf fallen umstellend.
Das ist natürlich auch ne gute Lösung und vermutlich sogar noch platzsparender.Wenn ich mir die 6 Eingänge über 2 Diodenmatrixen auf nur noch 2 Kanäle reduziere, wird es doch gar nicht nötig so viele Interrupts zu nutzen. Dann reichen mir ja 2. Dann muss nur in der Software mitgezählt werden bei welchem Kanal wir sind, und bei der langen Pause alles zurückgesetzt werden.
Allgemein muss man natürlich dann aufpassen, das sich die Ausgangssignale nicht überschneiden.
Sprich egal wie man es macht wird es nicht mit allen Empfängern funktionieren.
Vieleicht wär es auch sinnvoll dem ersten Kanal einen eigenen Interrupt zu geben, damit man sicher eine Synchronisation bekommt.
Korrekt, war aber auch nie mein Anspruch mit jedem Empfänger zu funktionieren, sondern mit meinem
Hier kommen die Servopulse direkt nacheinander ohne Pause, deshalb auch 2 Diodenmatrixen (Ch1,3,5 und Ch2,4,6)
Werde ich heute Abend auf jeden Fall mal ausprobieren, wie das dann mit 2 INTs funktioniert.
Die Sync-Pause wird rechnerisch im Worst-Case "nur" 8ms lang sein (6*2sek.), das sollte sich SICHER detektieren lassen denke ich.
Also ist ein separater INT für Ch1 eher nicht notwendig.
Gruß Basti
Hallo Bombi,
Mit 2 ICs bekommst du das Ganze auf einen Eingang:
Du bekommst für jede Flanke einen Nadelimpuls am Ausgang (Je nach Logikfamilie 4-10ns).Code:- 74x27 -- --------- 1 - __ 74x02 74x02 - ----\ \ __ ---- ------- 3 ------| |o-.-------------\ \ - ----/__/ | .-\ \ | |o---. ------- ---- 5 - '--' | |o---/__/ | -/__/ | 74x27 | __ '-\ \ 74x27 .--| |o- 2 - __ 74x02 74x02 |-/__/ ----\ \ __ | 4 ------| |o---------------\ \ | ----/__/ | .-\ \ | |o---' 6 - --- | |o- -/__/ -/__/ (created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)
Um die Impulse zu verlängern muss am Ausgang der beiden Inverter noch ein C gegen Masse, bzw. ein RC-Glied dazwischen.
Etwas Aufwändiger wäre es ein Monoflop am Ausgang nachzuschalten.
MfG Peter(TOO)
Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?
Geändert von Bomberpilot (18.12.2014 um 11:31 Uhr)
Lesezeichen