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.
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?
>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.
>> 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.
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...