Hallo, ich bin noch recht neu hier und im Umfeld der AVR Programmierung. Ich beschreibe mal mein Projekt und würde mich freuen, wenn ich ein paar Tips bekomme, wie man so etwas angeht. Projekt: Einlesen eines PWM codierten Signals mit einem Atmega8. Das Signal hat eine Spannung von ca. 15 V.Die Datenpakete haben einen Abstand von 7,5ms und sind in einem Manchester Code verpackt. Die Baudrate des Codes beträgt 10kBaud, d.h. alle 100us wechseln die Bits. Die Datenpakete beginnen mit einem Startbit (1) und haben 7,9 und 12 Bit Länge. Darüber hinaus wird über einen zweiten Eingang ein Signal eines Infrarot-Empfängers eingelesen. Dort kommen Frequenzen mit den Werten 15,xx KHz, 7,xxKHz, 5,xxKHz unsw. an. Aus diesen eingelesenen Paketen muss ich jeweils ein bestimmtes Bit auslesen. Wenn es auf 0 geht und am Frequenzeingang eine "passende" Frequenz ansteht soll ein Magnetantrieb geschaltet werden. Jetzt mal zu meinen Fragen: Der Programmablauf im Atmega8 müsste sehr grob wie folgt aussehen: Hautprogramm: Ständiges einlesen des PWM Signals Separieren/Auswerten des betreffenden Bits Vergleich des Ergebisses der ISR mit dem betreffenden Bit ISR: Messen der Frequenz am IR Transistor Ist das so richtig, oder würdet Ihr das schon anders lösen? Wie bewerkstellige ich das Einlesen des Signals? Ihr sollt mir nicht das Programm schreiben, sondern nur etwas Hilfestellung geben, wie man so etwas umsetzt. Ich denke ich muss zwei verschachtelte Timer verwenden. Der erste für die Abstände zwischen den Datenpaketen, und der zweite für das auswerten der Datenpakete. Gibt es andere Lösungsansätze? Ich würde mich über Unterstützung freuen. Wenn es funktioniert stelle ich den Code gerne als Beispiel zur Verfügung, und berichte natürlich hier über Zwischenstände. Danke und Gruß Christian
Moin, mach doch beides einfach ISR gesteuert. Wenn am Pin von deinem Signal High anliegt, stellste den INT1 z.B. auf MCUCR |= (1<<ISC10); dann generierst du mit jedem Pegelwechsel nen Interrupt und liest das Zeug ein. Ein Timer wird zusätzlich getartet und wenn länger als deine 100µs kein Pegelwechsel kommt, wird INT1 deaktiviert und du entschlüssest deinen Manu-Code. Frequenz würde ich genauso messen mit INT0. Dann haste in deiner main noch Zeit was zu machen und musst nit ständig pollen. Gruß und viel Erfolg.
Servus, ja das kannst du eigentlich realisieren wie du willst :) Du könntest ja beide Signale mit einer ISR einlesen indem du einfach 2 Externe Interrupt Pins so konfigurierst dass sie auf die entsprechende Flanke ansprechen und dir dann mit einem timer z.b. die Zeit zwischen fallender und steigender flanke ausrechnen. Oder.... Die Timer des AVRs haben "Hardwaremäßig" eine Funktion eingebaut um Frequenzen zu messen... Schau mal im Datenblatt unter "Input Capture" Aber da weiß ich nicht ob das für deinen Zweck das Richtige ist... Was für eine Infrarot Signal hast du denn da? Ist das Signal von einer Fernbedienung? schöne Grüße
Hallo, danke schon mal für die Hinweise. Klingt schonmal gut. @Christian: Das Infrarot-Signal ist ein einfaches Rechtecksignal mit Puls/Pausenverhältnis von 50/50. Könnte also sehr gut über Input Capture gehen. @Fabian: Kannst Du das einlesen des Codes noch etwas genauer erklären, da komme ich noch nicht ganz mit. das Setzen von MCUCR löst einen Interrupt bei jedem Flankenwechsel aus, oder? Und was müsste dann folgen? Gruß Christian
Also ich habe letztens eine Remote Control Protokoll einer Fernbedienung ausprogrammiert und da habe ich es so gemacht wie Fabian es beschrieben hat. Ich habe bei der fallenden Flanke einen Timer gestartet und bis zur nächsten Fallenden Flanke "gezählt". funktioniert ganz gut so... greets
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.