www.mikrocontroller.net

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


Autor: Christian Radermacher (cradi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian A. (ferrice)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian Radermacher (cradi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian A. (ferrice)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.