Forum: Mikrocontroller und Digitale Elektronik Messung eines rechteckigen Signals


von John Konj (Gast)


Lesenswert?

Hallo Leute,

ich hoffe jemand kann mir bei der Lösung meines Problems helfen. Also 
worum es geht:
Ich muss mit einem Interrupt ein rechteckiges Signal messen. D.h. ich 
muss die Zeit von Rising bis Reising messen was ich auch geschaft habe, 
aber wie kann ich mit dem selben Innterrupt die Zeit von Rising bis 
Falling messen, dazu muss ich sagen das rechteckige Signal ändert 
anderauernd die Periodendauer, das Signal wird nicht negativ es wird nur 
1 und 0 und da wo es 1 wird, die Zeit muss ich auch mit dem selben 
Interrupt messen das heißt von Rising bis Falling, die Zeit soll man 
einfach bei der Flanke Falling ablessen und als Past in einem Hyper 
Terminal schreiben werden.

Ich hoffe ich habe mich deutlich ausgedruckt und jemand kann mir helfen, 
und es ist dringend.
Schöne größe an jeden.
Hier habe ich das was ich schon selber geschrieben habe:

$regfile = "m8515.dat"
$crystal = 8000000
$baud = 4800


'Iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii 
iiiiiiii


Config Timer1 = Timer , Prescale = 8

Config Pind.3 = Input

On Int1 Signal_1
Config Int1 = Rising
Enable Int1
Enable Interrupts
Start Timer1
Dim Timeus As Long

Do

Print "Signal_1" ; Timeus

Loop


'Iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii 
iiiiiiii

Signal_1:
Timeus = Timer1

Timer1 = 0
Return

'Iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii 
iiiiiiii

von crazy horse (Gast)


Lesenswert?

nach rising-Interrupt stellst du in der zug. ISR auf falling. Und, 
schwups, schon kommt der nächste bei falling - da stellt du wieder auf 
rising....
Mit Basic kann ich dir auch nicht weiterhelfen.

von Xpost (Gast)


Lesenswert?


von John Konj (Gast)


Lesenswert?

Danke crazy horse so etwas brauche ich, das Problem ist nicht das ich 
nicht verstehe wie ich es machen soll, sondern wie man diesen Befehl in 
Bascom ausschreiben soll. Aber deine vermutung ist richtig, jetzt währe 
es noch gut wenn du vielleicht einen Befehl kennen wÜrdest den man da 
einsetzen könnte.

von jojo (Gast)


Lesenswert?

benutze C dann gibt's solche Fragen nicht.:)

von STK500-Besitzer (Gast)


Lesenswert?

>benutze C dann gibt's solche Fragen nicht.:)

Doch, die Frage wird auch bei C gestellt. Aber es antworten mehr (und 
vermutlich auch besser...).

Vielleicht geht es so (ich habe auch keine Ahnung von Bascom):

Do

Print "Signal_1" ; Timeus1 - Timeus0

Loop



Signal_1:
if Int1 = Rising then
   Timeus0 = Timer1
   Config Int1 = Falling
elseif
   Timeus1 = Timer1
   Config Int1 = Rising
endif
Return


Kann aber auch sein, dass das gar nicht funktioniert...

von crazy horse (Gast)


Lesenswert?

so, als erstes solltest du die Finger komplett vom Timer1 lassen - lass 
ihn einfach laufen, bietet am Ende aber die grösste Genauigkeit (noch 
besser wäre der ICP-Eingang gewesen).

ICS11=1, ICS10=0 -> falling edge
ICS11=1, ICS10=1 -> rising edge
Beide Bits zu finden im Register MCUCR

Für dich ist alo eigentlich ICS10 interessant.
Bleibt aber dabei, das ich von Basic 0 Ahnung habe...

unsigned int Periodendauer, H_Zeit;

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{static unsigned int timer1_bak;
unsigned int temp;
temp=TCNT1;     //aktueller Zählerstand
if (MCUCR & (1<<ICS10))      //Code für rising edge
 {Periodendauer=temp-timer1_bak;
  timer1_bak=temp;
  MCUCR=MCUCR & ~(1<<ICS10);      //set falling edge, ICS10=0
 }
 else      //Code für falling edge
   {H_Zeit=temp-Timer1_bak;
   MCUCR=MCUCR | (1<<ICS10);  //rising edge ICS10=1
   }
// Place your code here

}

von John Konj (Gast)


Lesenswert?

Gute Idee STK500-Besitzer, aber funktioniert noch nicht so richtig, ich 
habe es gerade getestet. Hat vielleicht noch einer eine Idee in der 
selben richtung wie STK500-Besitzer.

von STK500-Besitzer (Gast)


Lesenswert?

>aber funktioniert noch nicht so richtig, ich habe es gerade getestet.

War mir irgendwie klar.
Jetzt ist es an dir, dich mit der Hardware des Controllers 
auseinanderzusetzen, um die notwendigen Register von Hand einzustellen.
Soweit ich inzwischen mitbekommen habe, kann man auch mit Bascom die 
Register und Flags von Hand bearbeiten.
Oder du findest heraus, wie man mit einer der "blackboxes" von Bascom 
die Detektionsflanken des Interrupts während des Programmablaufs ändern 
kann.
Kann es sein, dass der Int1 gar nicht auf "Falling" reagiert?

von Paul Baumann (Gast)


Lesenswert?

Hier ist ein Ausschnitt aus der Bascom Hilfe:
LOW LEVEL to generate an interrupt while the pin is held low. Holding 
the pin low will generate an interrupt over and over again.
FALLING to generate an interrupt on the falling edge.
RISING to generate an interrupt on the rising edge.
CHANGE to generate an interrupt on the change of the edge. Not all 
microprocessors support CHANGE.

Auf Deutsch: LOW LEVEL wird benutzt, um einen Interrupt zu generieren, 
solange der Pin L-Pegel hat. Das Halten des Pins auf L erzeugt immer und
immer wiedér Interrupts.
Falling erzeugt einen Interrupt bei der fallenden Flanke´
Rising bei der steigenden.
Change erzeugt bei jeder Flankenänderung einen Interrupt.


Der Ansatz vom STK500-Besitzer ist doch ein prima Anhaltspunkt, 
natürlich
kann man das nicht 1:1 übernehmen, weil es Pseudocode ist, der nur die
Idee verdeutlichen soll.

Du mußt für Deinen Zweck die Option "Change" aussuchen.

MfG Paul

von STK500-Besitzer (Gast)


Lesenswert?

>weil es Pseudocode ist,

Ich geb dir gleich Pseudo! ;)
Ich habe "leider" keine Ahnung von Bascom. Deswegen ist da nur 
"Pseudocode" bei herausgekommen.
Ich würde sowas ja in C schreiben und per ICP lösen. (Naja, zumindest 
habe ich es so schon gemacht...)

von Paul Baumann (Gast)


Lesenswert?

>Ich geb dir gleich Pseudo! ;)

@STK500-Besitzer

Das war doch nicht böse gemeint! Pseudocode ist doch ein normaler 
Ausdruck,
wenn man erst mal den prinzipiellen Ablauf eines Programmes aufschreibt, 
um zu sehen, wie man es machen will. Das Problem ist dann oft: Wie sage 
ich es meinem Kompiler, damit der Gleiche denkt wie ich...
;-))
MfG Paul

von Paul Baumann (Gast)


Lesenswert?

Edith:
damit der das Gleiche denkt wie ich...
Paul

von STK500-Besitzer (Gast)


Lesenswert?

>Das war doch nicht böse gemeint!

Etwas Smilie-blind? ;)

>wenn man erst mal den prinzipiellen Ablauf eines Programmes aufschreibt,
>um zu sehen, wie man es machen will.
1. Problem: Wenn der "Programmierer" nicht weiß, was er will, dann wird 
das mit dem Aufschreiben schon schwer...

>Das Problem ist dann oft: Wie sage ich es meinem Kompiler, damit der
>das Gleiche denkt wie ich...
2. Problem: Egal welche (Programmier-) Sprache, jede erfordert ein 
gewisses Maß an Vokabellernen und Verstehen der Grammatik.
Das ist übrigens ein Vorteil an C: Die Menge der Vokabeln ist sehr 
übersichtlich, die Grammatik ist etwas umständlich aber nicht 
unerlernbar.
BASCOM hat dagegen eine Menge Vokabeln mit einer relativ einfachen 
Grammatik.

Für das obige Problem ist es meiner Meinung nach nötig, sich etwas 
tiefgehender mit dem Bascom-Handbuch zu beschäftigen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Paul Baumann wrote:
> Edith:
> damit der das Gleiche denkt wie ich...
> Paul
Wer ist eigentlich Edith?
Beitrag "Re: Kollektor E-Motor defekt"

von Paul Baumann (Gast)


Lesenswert?

Edit heißt bei mir eben manchmal Edith, weil "Elfriede" dann doch etwas 
mißverständlich erschienen wäre. Ich hoffe, das beantwortet Deine Frage.
:-))

...es kann aber auch sein, daß ich mir nur mal ein Späßchen erlauben 
wollte, das aber nicht jeder versteht.

MfG Paul

von Sinusgeek (Gast)


Lesenswert?

> Für das obige Problem ist es meiner Meinung nach nötig, sich etwas
> tiefgehender mit dem Bascom-Handbuch zu beschäftigen.

Dazu kommt aber noch die Notwendigkeit, mal das Datenblatt des AVRs zu 
lesen und zu verstehen. Vielleicht kommt dann ja die Erkenntnis, dass 
ICP doch die bessere Wahl ist.

> Wer ist eigentlich Edith?

OMG, das ist Pauls humorige Verballhornung des englischen Begriffs 
"edit" für "überarbeitet", "bearbeitet" bzw. "ergänzt".

Zum Thema: Hier geht es um rechteckige Signale, wie macht man das bei 
quadratischen Signalen, dreieckigen Signalen oder gar Sinus?

Für Dreieck und Sinus fällt mir wieder ICP ein, denn der ICP-Interrupt 
kann auch vom Analog-Komparator ausgelöst werden.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Paul Baumann wrote:
> das aber nicht jeder versteht.
Ok, verstanden.

...es kann aber auch sein, daß ich mir nur mal ein Späßchen erlauben
wollte, das aber nicht jeder versteht.  ;-)

von Dino S. (Gast)


Lesenswert?

>Zum Thema: Hier geht es um rechteckige Signale, wie macht man das bei
>quadratischen Signalen, dreieckigen Signalen oder gar Sinus?

Man muß BASCOM lernen! Damit kann man auch noch sechseckige Signale 
dekodieren.

Da John Konj soviele Anfragen gestartet hat, weiß man ja garnicht mehr, 
wo man antworten soll. Aber er wollte ja viele Antworten erhalten.

Ich kenne eine Edith, die ist aber nicht die Schwester von Angelika, 
obwohl Erika so ähnlich klinkt. Merkwürdig?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dino S. wrote:
> obwohl Erika so ähnlich klinkt. Merkwürdig?
Richtig, klinkt merkwürgig   ;-)

So langsam gefällt mir der Fred hier...  :D

von Das Tier (Gast)


Lesenswert?

klinkt so richtig nach BASCOM
:)

von Das Tier (Gast)


Lesenswert?

Warum mag hier Bascom keiner so wirklich?

von Paul Baumann (Gast)


Lesenswert?

>Warum mag hier Bascom keiner so wirklich?

Paul ganz böse, schonungslos und gemein: ;-)

Weil:
1. Bascom in der Vollversion Geld kostet
2. manch Einer den Umgang mit C im Studium beigebracht bekommt
3. bedingt durch diesen Umstand hier viele Leute gibt, die es 
beherrschen
4. man in Bascom "Einzelkämpfer" ist
5. Weil es "in" ist, auf eine Sprache zu schimpfen, die man selbst nicht
   beherrscht.

Das ist nicht ganz so ernst gemeint, wie es scheint.
MfG Paul

von Norgan (Gast)


Lesenswert?

> Warum mag hier Bascom keiner so wirklich?

Dann sieh dir einfach mal die Frage vom OP an. Etwas, was auf einem AVR 
in C ganz easy ist, wird zur Haupt- und Staatsaktion.

Bascom gehört für mich zu den Sprachen, die in ihrem Bemühen dem 
Benutzer ein kuscheliges Heim zu geben und jeglichen Unbill von ihm 
fernzuhalten weit über das Ziel hinausschießen. Sowas wie buntes Fisher 
Price "Meine erste Programmiersprache" oder der "Sprechende 
Werkzeuggürtel" von Bob dem Baumeister. Ok bis zu einem gewissen Alter, 
aber irgendwann sollte man mal die Angst vor der realen Welt ablegen, 
denn mit einer bunten Plastikbohrmaschine die so schön RRR-RRR-RRR 
macht, kann man keinen Stahlbeton bohren.

Dieses ganze Arudino-Zeug gehört für mich auch in die Klasse. Abgesehen 
von dem Hype nur ein Satz Macros, damit der User nicht mit der bösen 
realen Welt in Berührung kommt.

Bevor jemand fragt, ja, C hat auch ein paar böse Ecken und Kannten.

von STK500-Besitzer (Gast)


Lesenswert?

Irgendwie habe ich den Eindruck, dass einige hier lieber rumtrollen 
anstatt konstruktive Beiträge zu liefern.
Wenn Paul und ich hier "rumtrollen", dann dürfen wir das, weil wir schon 
konstruktive Beiträge geliefert haben.
Alle anderen dürfen das nicht!
Ich finde diese "Bascom ist Mist!"-Thread inzwischen sehr ermüdent und 
völlig überflüssig.
Es spricht für mich nichts dagegen, wenn jemand in Basic programmiert 
(habe ich auch, obwohl ich älter als 12 Jahre bin...). Nur heisst 
Programmieren ja nicht, irgendwelche Sachen in irgendeiner 
Programmiersprache hinzutippen und zu hoffen, dass es funktioniert, 
sondern sich einen Ablauf auszudenken, mit dem man ein Problem lösen 
kann.

PS: Ich durfte meine ersten Schritte in C an der Berufsschule machen...

von Paul Baumann (Gast)


Lesenswert?

>mit einer bunten Plastikbohrmaschine die so schön RRR-RRR-RRR
>macht, kann man keinen Stahlbeton bohren.

@Norgan
Du bist richtig! Ich habe nach Lesen Deines Artikels Tränen gelacht und
10 Minuten gebraucht, um mich wieder einzukriegen. :-))

Du hast mich ertappt: Mit eben dieser bunten PIKO-Bohrmaschine bohre ich 
meine Platinen!

Aber mal im Ernst: Man kann die vorgefertigten Config-Anweisungen von
Bascom nehmen, muß aber nicht. Speziell bei der Anwendung von Timern 
kommt man damit gar nicht an alle Betriebsarten heran und verbaut sich
Möglichkeiten. Aber: Wenn man will , kann man sich aus dem jeweiligen
Datenblatt die Registerbezeichnungen und die einzelnen Bits in diesen 
Registern herauslesen und diese direkt "angreifen". Es werden auch 
sämtliche Assembler-Befehle unterstützt und selbst das "Mischen" von
Bascom-Syntax und Assembler ist möglich. Andererseits erspart Config
bei Komponenten, die sich nicht im Kontroller selbst befinden eine Menge
Arbeit. Beispiel:
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , 
Db7 = Porta.7 , E = Portc.7 , Rs = Portc.6

Mit dieser Zeile ist alles gesagt, der Bediener muß sich nicht um die 
Initialisierung des Displays kümmern. Er könnte aber auch die 
Pinzuweisung und die Initialisierung "von Hand" machen, was ich auch 
schon tun mußte, weil ein Display nicht mit den Zeiten zurechtkam, die 
mit Config vorgegeben
waren.

MfG Paul

von John Konj (Gast)


Lesenswert?

Leute macht es euch spaßk, hehe ich sitze hier und überlege wie man das 
Problem lößen kann und ihr macht nur blödsinn. Gute Witze aber leider 
keine Antwort auf meine Frage!!!

von Sinusgeek (Gast)


Lesenswert?

Nimm dAs Datenblatt Deines AVRs und schau Dir die Hardware des 
16-Bit-Timers an, besondfers die Register und die damit verbundenen 
Möglichkeiten. Schau Dir dabei die Input-Capture-Funktionalität des 
Timers an. Dann löse Dich von den unsinnigen Config-Anweisungen von 
BASCOM und setze die Bits in den Timer-Registern von Hand, so wie es 
C-Programmierer oder ASM-Programmierer auch tun. Denn das funktioniert.

Du möchtest neben der Periode auch die Impulsdauer und die Impulspause 
messen. Dazu kann man den Interrupt bei einigen AVRs auf beide Flanken 
triggern lassen, man muss dann durch Prüfen des Portpinzustandes 
ermitteln, um welche Flanke es sich handelt.
Einige AVRs erlauben es nicht, auf beide Flanken zu triggern, dann muss 
man die Triggerflanke (rising/falling) eben in der ISR 
(Interrupt-Service-Routine) umschalten. Die Dauer ermittelst Du dann 
durch Subtraktion des alten (gemerkten) Zeitstempels vom aktuellen 
Zeitstempel. Der Timer kann dabei frei durchlaufen, wodurch die Nutzung 
der beiden Compare-Interrupts für andere Zwecke ermöglicht wird.

Hier noch ein paar Links, die Dir helfen könnten:

Beitrag "Input Capture Pin"
Beitrag "Input Capture"
Beitrag "PWM einlesen beim mega32"

von John Konj (Gast)


Lesenswert?

Hai Sinusgeek
Danke für die Info, hab mal reingeschaut, es ist zwar einigermaßen fast 
das Selbe was ich möchte aber jedesmal nur für die Periode, aber ich 
brauche auch die Zeit der positiven Flanke "1". Denn die kann ich nicht 
messen ich hab zwar heute etwas probiet aber nicht weiter gekommen.
Hier ist das Beispiel: (Was könnte man änder damit es richtig 
funktioniert??)
Also siehe Program oben...
-------------------------------------
Signal_1:

If  Pind.3 = 1 then goto Periode
Timeus = Timer1
Timer1 = 0
Config Int1 = Rising

Return
´************************************
Periode:

Config Int1 = Rising
Timeus1 = Timer1
Return
---------------------------------------

von Sinusgeek (Gast)


Lesenswert?

Verschone mich mit Deinem BASCOM, BASIC nutze ich nur auf dem PC und 
C16. AVRs programmiere ich in Assembler, das ist wenigstens eindeutig, 
da pfuscht mir kein Compiler dazwischen. BASCOM ist für Interrupts 
sowiso schlecht geeignet, da es beim ISR-Aufruf alle 32 Register (auch 
wenn sie von der ISR nicht benutzt werden) auf Stack rettet und 
anschließend wiederherstellt, was schon alleine 128 Takte dauert und 
somit unnötig wertvolle Rechenzeit verplempert, also den Messbereich arg 
einschränkt.

Zum Thema:

Du setzt den Timer auf 0 und liest den Timer aus. Diesen Weg würde ich 
(ohne Not) nicht (mehr) gehen. Denn es gibt die Register ICR1H/L, die 
beim Auftreten der selektierten Flanke den Zeitstempel kopieren, ehe der 
Interrupt ausgelöst wird. Das ist also bedeutend genauer. Ich würde 
daher auch den Input-Capture-Interrupt bevorzugen.

Statt Timer löschen bietet sich an, den Timer durchlaufen zu lassen und 
die Differenz der Zeitstempel zu bilden. Die ISR bekommt dann zwei 
Zweige, einen für steigend, einen für fallend. in jedem Zweig wird die 
entgegengesetzte Flanke selektiert und die Differenz zum vorhergehenden 
Zeitstempel gebildet. Im einen Zweig misst Du die Impulsdauer, im 
anderen die Impulspause, Du kannst die Ergebnisse also separat 
verwalten. Durch Addition beider Werte bekommst Du die Periodendauer. 
Somit kannst Du in einer ISR alle drei Werte (tH, tL, tP) ermitteln. Du 
brauchst also globale statische Variablen (16-Bit-unsigned) für 
Impulsdauer, Impulspause, Periodendauer, ZeitstempelL und ZeitstempelH.

Pseudocode...:
ICP_ISR:
wenn steigende Flanke:
 ICP-Interrupt auf fallende Flanke umschalten
 zsh = ICR1
 imppause = zsh - zsl
wenn fallende Flanke:
 ICP-Interrupt auf steigende Flanke umschalten
 zsl = ICR1
 impdauer = zsl - zsh
 periode = impdauer + imppause

Wenn Du dann noch Messfehler durch Timer-Überlauf erkennen willst, dann 
kannst Du OCR1A auf den aktuellen Zeitstempel setzen und beim Auftreten 
eines Compare-A-Interrupts ein Flag setzen, das den Messwert für 
ungültig erklärt.

von faraday (Gast)


Lesenswert?

@Paul
>Mit eben dieser bunten PIKO-Bohrmaschine bohre ich
>meine Platinen!
Du kommst bestimmt aus Sachsen. Oder gab es die Marke auch im Westen?

von Sinusgeek (Gast)


Lesenswert?

>> Mit eben dieser bunten PIKO-Bohrmaschine bohre ich
>> meine Platinen!
> Du kommst bestimmt aus Sachsen. Oder gab es die Marke auch im Westen?

Aha, alles was nicht Westen ist, ist also Sachsen. Das ist natürlich 
auch eine Logik. So nach dem Motto: "Gott schuf die Menschheit und ließ 
sie wachsen, dann kam der Deibel und schuf die Sachsen..." - oder?

Und dabei wurde diese Maschine (die besser ist als ihr Ruf) nichtmal in 
Sachsen hergestellt, sondern nur einen Steinwurf von Bayern entfernt.

von faraday (Gast)


Lesenswert?

er könnte natürlich auch aus Thüringen kommen...
aber ich kenne einige Leute aus S. und die reden wie Paul.
vielleicht klärt er ja die Sache noch auf.

von Sinusgeek (Gast)


Lesenswert?

> und die reden wie Paul.

Hast Du ihn schon reden gehört???
(Ich schon...)

von faraday (Gast)


Lesenswert?

>Hast Du ihn schon reden gehört???
>(Ich schon...)

also Thüringen, da hab ich mich doch verschätzt.

von Paul Baumann (Gast)


Lesenswert?

Der Kandidat erhält 100 Punkte und eine Freifahrt auf der Rolltreppe. 
:-)

MfG Paul

von D. S. (jasmin)


Lesenswert?

Ogefang hot der ganze Trabbel su im die Zeit als de Sachsen emole sugar 
den deitschen Könich stellten also um die erschte Johrtausendwede....jo 
jo liebe Leit do stellten de Sachsen erschtmalisch inne deitsche 
Geschichte,su wos ähnliches wie nen Gaiser von Deutschland... auch 
bekannt unter den Namen "Otto der Große" und über sein Geschlecht die 
Ottos ...nee nicht "den Otto", der war kee Gomiker,...-dynastie Otto der 
II, und III, mer misse nämlich weitermoche, wos heite is intresiert 
suwiesu keene Sau mer...

von Man (Gast)


Lesenswert?

::..::

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.