Forum: Compiler & IDEs Dekodierung mti Interrupt


von Michael F. (Firma: HTL Rankweil) (mik2412)


Lesenswert?

Hallo zusammen!

Für ein Projekt soll ich ein Signal mit einem Atmega16 dekodieren. Die 
dekodierung soll mittels interrupt und counter erfolgen. Liegt am 
Eingang ein High-Signal mit der länge 180us bis 300us an, so entspricht 
das einer 0. Liegen zwei kurze High-Signale mit einer länge von 50us bis 
150us an entspricht das einer 1. Ist das Siganl dekoiert sollte es 32 
Bit lang sein. Da ich mich mit dem Programmieren von Mikrocontroller 
noch nicht wirklich auskenne hoffe ich das ihr mir helfen könnt!

mfg

Michael

von Oliver (Gast)


Lesenswert?

Ein paar Fragen, die du (oder der Aufgabensteller) beantworten müsstest:

Woran erkennst du den Anfang eines 32-Bit-Telegramms?
Wie häufig folgen die Telegramme aufeinander?
Wie kommt das Signal in den Microcontroller?
Ist das Signal ungestört, oder ist mit Störungen zu rechnen?
Könne zu lange oder zu kurze Pulse vorkommen?
Sind die Signalflanken sauber, oder kann da prellen auftreten?
Können unvollständige oder zu lange Telegramme vorkommen?

Oliver

von Michael F. (Firma: HTL Rankweil) (mik2412)


Lesenswert?

Am beginn erhalten wir 3 Startbits, die ebenfalls so kodiert sind.
Wenn man ein Telegramm erhalten hat dann kommt nach 50 ms das nächste. 
Das Signal enthält keine Störungen und die Pulse liegen immer in dem 
Vorgegebenen Zeitbereich. Weiters sind auch die erhaltenen Telegramme 
immer vollständig und es treten keine Probleme bei den Flanken auf.

Das Signal liegt schon sauber am Mikrocontroller an, es stellt sich nur 
noch die Frage wie der Code auszusehen damit ich das Signal richtig 
dekodiere.

Michael

von Oliver (Gast)


Lesenswert?

Paradiesische Zustände :-)

Es gibt mindestens drei Varianten, solch ein Impulstelegramm einzulesen.

- über den externen Interrupt, dazu ein Timer, um die Dauer 
festzustellen
- per Input Capture Unit, die macht eigentlich alles automatisch alleine
- Eingangssignal an einem normalen Eingang, dazu eine Timer-ISR, die mit 
ausreichend hoher Frequenz diesen Eingang abtastet und Änderungen 
auswertet.

Die dritte Variante ist die flexibelste und robusteste, auch bei 
Störungen im Signal. Da du darauf aber keine Rücksicht nehmen musst, tut 
es auch die Version über Input Capture.

Eine Info fehlt doch noch, wie lang sind die Pausen zwischen den 
Impulsen? Davon hängt ab, ob du die Dekodierung direkt während des 
Empfangs durchführen kannst, oder zunächst alle Flanken einliest, und 
dann auswertest. Letzeres dürfte erforderlich werden, wenn die Pausen 
auch bis 50us kurz sein können. Dann wird es zeitlich eng.

Oliver

von Michael F. (Firma: HTL Rankweil) (mik2412)


Angehängte Dateien:

Lesenswert?

Ich verwende nun den externen Interrupt1 und den Timer/Counter0. Das 
Signal das dekodiert werden soll, ist im Anhang zu sehen. Leider weiß 
ich einfach nicht wie ich den Code zu schreiben haben. Das Signal hat 
eine Grundfrequenz von 2kHz.

Nun hatte ich die Idee den Interrup zuerst bei einer fallenden Flanke 
auszulösen damit der Counter beginnt zu zählen. Anschließend soll ein 
Interrupt bei steigender Flanke ausgelöst damit der Counter stopt.
Im Bild sollen die rot markierten stellen ermittelt werden. Werden nun 
zwei kurze Impulse empfangen soll in ein Array der Wert 1 gespeichert 
werden und bei einem langen Impuls der Wert 0.

Wie kann das nun programmiert werden. Das Problem was ich habe ist, dass 
ich theoretisch verstehen würde aber es nicht in einen Code umsetzten 
kann.

Michael

von STK500-Besitzer (Gast)


Lesenswert?

Die rot markierten Stellen sind doch gar nicht (alle) für die Erkennung 
des Signalwertes (0 oder 1) relevant.
Du mußt den Pegel nach einer der Flanken des DATA RATE - Signals 
auswerten.
Dazu müsste es sogar reichen, den INT-Eingang auf eine fallende Flanke 
reagieren zu lassen und dann in der ISR den Pegel des AC-Signals 
einlesen.

Wenn DATARATE eine steigende Flanke zeigt, und der darauffolgende Pegel 
0 ist, dann ergibt das eine logische 1 für DATA.
Wenn DATARATE eine steigende Flanke zeigt, und der darauffolgende Pegel 
1 ist, dann ergibt das eine logische 0 für DATA.

von Oliver (Gast)


Lesenswert?

>Wenn DATARATE eine steigende Flanke zeigt, und der darauffolgende Pegel
>0 ist, dann ergibt das eine logische 1 für DATA.
>Wenn DATARATE eine steigende Flanke zeigt, und der darauffolgende Pegel
>1 ist, dann ergibt das eine logische 0 für DATA.

Nach der steigenden Flanke von Datarate ist AC immer Null. Das 
funktioniert also so nicht. Da die Impulslängen anscheinend nicht 
konstant sind, und nach wie vor unklar ist, ob das auch für die Pausen 
gilt, ist eine Auswertung von AC zu festen Zeitpunkten schwierig.

Wenn wirklich sichergestellt ist, daß die Signale nicht prellen, reicht 
es aus, die Anzahl der steigenden Flanken von AC zwischen zwei 
steigenden Flanken von Datarate zu zählen. Eine Flanke: Null, zwei 
Flanken: eins. Das lässt sich über den zweiten externen Interrupt 
erledigen.

Oliver

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.