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