Hallo Leute! Ich hoff ihr könnte mir weiter helfen. Ich muss eine Frequenz messen, um eine Regelung zu realisieren. Ich verwende dabei den Timer 0 und den Timer 2. Mit dem Timer0 mach ich ein Zeitintervall. In dieser Zeit werden die Impulse mit dem Timer2 gezählt. Anbei hab ich mein Programm. Ich hoffe jemand kann mir helfen, bin Anfänger. Lg Wörnz
Wo ist denn dein Programm? Welche µC? Welche Sprache? und vorallem... welche Probleme? mfg Schoasch
#include <reg517.h> #include <stdio.h> #include "lcd.h" float speed; void messung (void); void takt (void); int t2low,t2high; int a; void INTTIM0 (void) interrupt 1 { t2low = TL2; t2high = TH2; TH2 = 0; TL2 = 0; TH0 = -39; TL0 = 0; } void messung (void) { TMOD = 0x01; /**** Timer 0 Mode 1 16 Bit ****/ TH0 = -39; /**** Vorgesetzter Wert, alle 100ms Int.****/ TL0 = 0; /**** Vorgesetzter Wert ****/ ET0 = 1; /**** Timer 0 Interrupt enabled ****/ T2CON = 0x02; /**** Timer 2 Counter Einstellung ****/ TH2 = 0; /**** Timer 2 Startwert High Byte ****/ TL2 = 0; /**** Timer 2 Startwert Low Byte ****/ IT1 = 1; /**** Externer Interrupt 1 negative Flanke */ EX1 = 1; /**** Externer Interrupt 1 enabled ****/ EAL = 1; /**** Interrupt allgemein erlaubt ****/ TR0 = 1; /**** Einschalten der Zeitschleife ****/ while (1) { speed = (41.66 *( (float)t2low + 256.0 * (float)t2high )); ptintf("F=%f",speed); } } void takt (void) { a=300; CTREL = 65535-a; /*Reloadwert*/ CTCON = 0; /*fz=6Mhz*/ CMSEL = 0x80; /*Auswahl Port4.7*/ CMEN = 0x80; /*Freigabe Port4.7*/ while(1) { CM7 = 65535-a/2; } } main() { messung(); takt(); } Arbeite mit dem µ-controller 80C51 Entwicklungsboard und werde dann das Programm auf den Atmell 89S52 umschreiben. hab folgendes Problem: Es zeigt einfach das gewünschte Ergebnis an, obwohl ich mir sicher bin dass das Programm funktionieren muss. es ist sicher nur ein kleiner Fehler aber ich komm nicht drauf. Lg Wörnz PS.: sorry dass es am anfang nicht funktioniert hat mit dem Programm, und dass ich nicht genauere Daten angegeben hab.
Hallo, Ich denke wenn die erste Funktion nach Power-up main() ist, dann sind vielleicht die zahlreichen while(1) loops dein Problem, denn wie soll der Controller in die Funktion takt() kommen wenn Du ihn mit while(1) in messung() "gefangen" hälst. Genauso würde while(1) in takt() den Controller für ewig an der Stelle "gefangen" halten und der Rest von deinem Programm würde nie wieder ausgeführt werden. Hoffe ich konnte helfen.
Hab mein Programm geändert: #include <reg517.h> #include <stdio.h> #include "lcd.h" float speed; void messung (void); void takt (void); int t2low,t2high; int a; void INTTIM0 (void) interrupt 1 { t2low = TL2; t2high = TH2; TH2 = 0; TL2 = 0; TH0 = -39; TL0 = 0; } void messung (void) { TMOD = 0x01; /**** Timer 0 Mode 1 16 Bit ****/ TH0 = -39; /**** Vorgesetzter Wert, alle 100ms Int.****/ TL0 = 0; /**** Vorgesetzter Wert ****/ ET0 = 1; /**** Timer 0 Interrupt enabled ****/ T2CON = 0x02; /**** Timer 2 Counter Einstellung ****/ TH2 = 0; /**** Timer 2 Startwert High Byte ****/ TL2 = 0; /**** Timer 2 Startwert Low Byte ****/ IT1 = 1; /**** Externer Interrupt 1 negative Flanke */ EX1 = 1; /**** Externer Interrupt 1 enabled ****/ EAL = 1; /**** Interrupt allgemein erlaubt ****/ TR0 = 1; /**** Einschalten der Zeitschleife ****/ } void takt (void) { a=300; CTREL = 65535-a; /*Reloadwert*/ CTCON = 0; /*fz=6Mhz*/ CMSEL = 0x80; /*Auswahl Port4.7*/ CMEN = 0x80; /*Freigabe Port4.7*/ while(1) { CM7 = 65535-a/2; speed = (( (float)t2low + 256.0 * (float)t2high )); printf("F=%f \n",speed); } } main() { messung(); takt(); } Um das Programm zu testen erzeug ich gleichzeitig auf Port 4_7 ein TTl -Signal vo 19kHz. Dieses Signal leg ich auf den Eingang von timer2. Port1_7. Aber es funktioniert noch immer nicht. Bitte um Tipps. LG
Welchen Typ von Controller verwendest Du denn genau? Das könnte doch sehr hilfreich sein.
Hi Benutzt du das Humerboard bzw kennst du es? Hier könnten vl für weitere PRojekte hilfreiche Informationen sein: http://www.humerboard.at/ Nun zum eigentliche Problem. Wo benutzt du denn den externen Interrupt jemals? Mir ist sie nicht aufgefallen ;-) Und was soll folgende Zeile bewirken: CM7 = 65535-a/2;
Hi. So. ich hab mir nochmal deinen Code angesehen und hab noch folgende Vorschläge zur Änderung. 1.) a=300; CTREL = 65535-a; /*Reloadwert*/ Diese sind ja statische Werte, also warum rechnenst du das nicht gleich selbst aus und tragst den wert ein? Dadurch ersparst du dir ein paar Arbeitstakte ;-) Also: CTREL= 65235 //Reloadwert = 65535-300 Die Wahl deiner Variablen und Funktionen sind auch nicht gerade Vorteilhaft. So würde ich statt "messung" den Namen "init" oder so nehmen, denn hier Initialisierst du den Timer und die Interrupts ja nur. Und als "speed" würde ich "freq" oder so was nehmen. Also Versuch immer selbsterklärende Namen zu nehmen. Warum benutzt du als Taktquelle eigentlich nicht einen Funktionsgenerator oder einen Quarzoszillator zb? Fang lieber mal so an, dadurch ist es etwas übersichtlicher und die Fehlerwahrscheinlichkeit ist geringer und sie ist auch überschaubarer. mfg Schoasch PS.: Poste deinen Quelltext bitte das nächste mal als Anhang.
danke für deine Tipps. Ja ich verwende derzeit das Humerboard, und werde deine Vorschläge ausführen. mfg Wörnz
Hi, sag mal was gibt die der µC denn auf der seriellen Schnittstelle aus? Wilde Werte oder überhaupt nichts? Wenn ich beim C167 printf() benutze ohne vorher die serielle zu Initialisieren, dann hängt sich der Controller in printf() auf und macht im Programm nicht mehr weiter. Könnte das auch noch ein Problem bei Dir sein, so das Du nichts auf der seriellen sehen kannst und dein Progamm hängt? mfg
Beim Humerboard muss man das normal nicht initialisieren, da das mit beim Bootloader schon geschieht. Also sollte das kein Problem darstellen. Ich muss mal schauen ob ich meine alten Beispiele noch irgendwo habe, dort sollte die Frequenzmessung noch irgendwo sein:-). Hast du leicht bald mal Laborprüfung? Gehst du rein zufällig HTL Kapfenberg? Wenn ja, welchen Lehrer hast du denn im Labor?
Ja ich geh htl.kapfenberg! Hab keine Laborprüfung sonder brauch das für
mein Porjekt!
Hab lehrer wie:
Mussmann
Frank
Schager
Prinz
Scher
Pölzl
.
.
.
warst du auch in kapfenberg??
>Ich muss mal schauen ob ich meine alten Beispiele noch irgendwo habe,
dort sollte die Frequenzmessung noch irgendwo sein:-).
wär echt super wenn du das Beispiel finden würdest. wär dir sehr
verbunden.
lg wörnz
loool Da hast du aber echt einen tollen Haufen zusammen ;-) :-) Ja, ich ging auch mal dort zur Schule und durft auch ein bisschen mit dem Board spielen. Naja, ich hab nachgesehen und muss dir leider sagen, dass ich dieses Beispiel nicht mehr habe. Was für ein Projekt machst du? Was soll es können? Welche Kriterien soll es erfüllen? Du kannst es mal bei Herr Prof. Paul probieren. Der hat ne gelbe Mappe mit der er immer beim Humerboard unterrichtet, dort sollte eigentlich ein Freuqenzmessungsbeispiel drinn sein.
Habs geschafft!!! Die Frequenzmessung funktioniert! (nur auf dem 80c51 Board) Hab ein Messintervall von 1 sec. Die Messung ist sehr genau. Nur muss ich mein Programm auf den AT89s52 umschreiben. Hat wer Tipps wie ich meine Timer konfiguriere?? LG Wörnz
Habs geschafft!!! Die Frequenzmessung funktioniert! (nur auf dem 80c51 Board) Hab ein Messintervall von 1 sec. Die Messung ist sehr genau. Nur muss ich mein Programm auf den AT89s52 umschreiben. Hat wer Tipps wie ich meine Timer konfiguriere?? LG Wörnz
WOW Doppelposting mit 2 Tagen Abstand... Hat deine Maus zu viel Gras geraucht? ggg
Nein im Prinzip nicht aber, als ich erstmals den Eintrag gelinkt hab ist er nicht in die akuellsten Einträge gekommen.
@Wörnz: Sollte auch nur ein kleiner Scherz sein ;) Ausserdem ist in den beiden Postings auch unterschiedlicher Code im Anhang...
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.