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
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.
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.
>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...
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 }
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.
>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?
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
>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...)
>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
>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.
Paul Baumann wrote: > Edith: > damit der das Gleiche denkt wie ich... > Paul Wer ist eigentlich Edith? Beitrag "Re: Kollektor E-Motor defekt"
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
> 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.
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. ;-)
>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?
Dino S. wrote:
> obwohl Erika so ähnlich klinkt. Merkwürdig?
Richtig, klinkt merkwürgig ;-)
So langsam gefällt mir der Fred hier... :D
>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
> 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.
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...
>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
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!!!
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"
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 ---------------------------------------
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.
@Paul >Mit eben dieser bunten PIKO-Bohrmaschine bohre ich >meine Platinen! Du kommst bestimmt aus Sachsen. Oder gab es die Marke auch im Westen?
>> 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.
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.
> und die reden wie Paul.
Hast Du ihn schon reden gehört???
(Ich schon...)
>Hast Du ihn schon reden gehört??? >(Ich schon...) also Thüringen, da hab ich mich doch verschätzt.
Der Kandidat erhält 100 Punkte und eine Freifahrt auf der Rolltreppe. :-) MfG Paul
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...
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.