Forum: Mikrocontroller und Digitale Elektronik AVR: Einlesen eines codierten Signals


von Christian R. (cradi)


Lesenswert?

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

von Jean P. (fubu1000)


Lesenswert?

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.

von Christian A. (ferrice)


Lesenswert?

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

von Christian R. (cradi)


Lesenswert?

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

von Christian A. (ferrice)


Lesenswert?

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
Noch kein Account? Hier anmelden.