PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Maximum Taktung?



KurtM
12.12.2004, 00:29
Hallo,
ich möchte mit meinem Mikroprozessor (Infineon SAB80C537 mit 12 MHz Oszillator) die Impulse von einer Gabellichtschranke messen. Das Problem ist: Nach meiner Messungen (Ohne Interrupt und in C geschriebenes Programm!) habe ich festgestellt daß ich maximum in jede 35 bis 50 Millisekunden eine 0 oder 1 Impulse aufzeichnen kann. In einer Scheibe mit 120 Taktung entspricht das, höchstens eine Drehzahl von 10 U/min. Das nutzt mir aber gar nicht! Was kann ich jetzt tun um die Abtastrate zu erhöhen? Selbstverständlich wird es mit einem Assemblerprogram deutlich schneller als C, aber zur Zeit ist das ist zu schwer für mich!
Wenn ich es mit einem Interrupt-Routine schreiben würde (das kann ich noch nicht), wie viel mal schneller würde die Abtastung sein?
Oder mache ich in meinem Programm irgendetwas falsch? Ist es wirklich etwa die Grenze von einem 8-Bit Mikrocontroller mit 12 MHz Oszillator?

PicNick
12.12.2004, 08:27
Interrupt is zwar für sowas immer gut, trotzdem müßtest du locker um einiges schneller zählen können. Ich nehm schon an, daß du in deinem Prog irgendeinen Hund begraben hast.
In einer millisekunde kann der Fuzzy bei 12 Megaschweinen wenigestens 4000 Instruktionen ausführen. da muß mehr drin sein.
--> Zählschleife posten mfg robert

stegr
12.12.2004, 11:08
der Inf SAB80C537 ist ein 8051-Derivat, der noch die alte Taktteilung besitzt, d.h. wenn der mit 12MHz läuft, ist die interne Frequenz 1MHz, also nicht wirklich viel. Aber trotzdem wären das dann rund 700 Instruktionen pro Millisekunde (viele Instr. sind 2-3 MZ lang).

Also hast du wirklich in deinem C-Programm irgendwo Bockmist gebaut, denn eine einfache Zählschleife sollte ja nicht 21000 Instruktionen lang sein; auch nicht mir deinem C-Compiler...

Poste mal bitte dein Programm und dann sehen wir weiter...

MfG
Stefan

KurtM
12.12.2004, 12:09
Hallo,
wie ihr sieht, ich bin noch am Anfang. Das gesamte Programm sieht so aus:

#include "sinnvoll_tfh.h"
#include "vt52_term.h"
#include <reg52.h>
#include <stdio.h>

sfr P4 = 0xe8;
sbit P4_0 = P4^0;
sbit P4_1 = P4^1;

/********************************************/
void DELAY_HARDWARE_1ms(void)
{
// Configure Timer 0 as a 16-bit timer
TMOD &= 0xF0; // Clear all T0 bits (T1 left unchanged)
TMOD |= 0x01; // Set required T0 bits (T1 left unchanged)
ET0 = 0; // No interupts
// Values for 50 ms delay
TH0 = 0xFC; // Timer 0 initial value (High Byte)
TL0 = 0x18; // Timer 0 initial value (Low Byte)
TF0 = 0; // Clear overflow flag
TR0 = 1; // Start timer 0
while (TF0 == 0); // Loop until Timer 0 overflows (TF0 == 1)
TR0 = 0; // Stop Timer 0
}
/*********************************/
void DELAY_HARDWARE_X_Second(void)
{
unsigned int d;
// Call DELAY_HARDWARE 100ms() 100 times
for (d = 0; d < 10; d++)
{
DELAY_HARDWARE_1ms();
}
}
/**********************/
void init_seri(void)
{
BD = 1; // Baudratengenerator
PCON |= 0x80;
S0CON = 0x52; // Serial Interface Mode 1,
}
/**********************/
void main(void)
{
int Zahl; // Definition der verwendeten Variablen
char n, m;
Zahl = 0;
init_seri();
P4_0 = 1;
P4_1 = 1;
printf("\n Anfang ");
while(1)
{
n = P4_0;
m = P4_1;
DELAY_HARDWARE_X_Second();
{ Zahl = Zahl + 1;
printf("\n %d %bd %bd", Zahl, n, m);
}
}
}

Gruß

KurtM
12.12.2004, 12:17
Hallo nochmal,
in dieser Quellcode, die Abtastung ist für 10 Millisekunden eingestellt. D.h. die folgende Kommentar ist nicht mehr gültig.

// Call DELAY_HARDWARE 100ms() 100 times

MfG
KurtM

13.12.2004, 18:18
Hallo Kommunity!
gibt es keine Antwort auf meine Frage?
MfG
KurtM

PicNick
13.12.2004, 18:31
Hi, versteh ich das richtig:
In der Schleife
liest du die zwei Pins ein
wartest ein weilchen
addierst 1 auf Zähler
printf Zahl, Pin0, pin1
usw.
Was kommt dabei raus ?
Zahl wird immer größer, die Pins halt irgendwas ?
?? :-k robert

stegr
13.12.2004, 20:09
Nein, der Programmablauf ist folgender:

while (TRUE) {
lese pins aus
warte 10ms
übertrage über UART 4-6 Bytes
}

Dabei entsteht folgendes Problem:
Auf Basis deiner oben angegebenen 35ms je Durchlauf ergibt sich:
1200 Baud als Übertragungsrate für den UART... Kommt das vielleicht hin?

Die nächste Sache ist: was bezweckst du mit dem 10ms warten? Dadurch, dass du nur alle 10ms abtastest, behen dir alle verloren, die es schaffen zwischen deinem Abtasten zu treffen. Nach Shannon darfst du nur mit 50Hz drehen, also 20ms pro Raster (so dass du zwei Abtastungen je Lücken-Ganzstellen-Kombi hast).

Also mach zwei Sachen:
1.) UART schneller laufen lassen
2.) immer nur die Zustandswechsel übertragen und nicht alles. Dadurch bekommst du die Schleife sehr viel schneller und deine Abtastrate liegt irgendwo bei 100 kHz, also kannst du mit 50kHz drehen... das sollte reichen.... Du speicherst also immer den aktuellen Wert, machst ein XOR mit dem alten Wert und wenn sich etwas ändert, kommt dabei 1 heraus. Wenn eien 1 herauskommt, dann überträgst du das an den Rechner. Wenn eine 0 heraus kommt, dann wird nichts übertragen, sondern wieder Pinstatus eingelesen und verglichen usw.
Damit solltest du kein Zeitproblem mehr haben...

MfG
Stefan

13.12.2004, 23:53
Hallo Stefan und Robert,
warum ich eine Warteschleife in dem Programm geschrieben habe ist, weil ich eine bestimmte und genauere Zeitachse ( 'Zahl') für die Auswertung der Abtastwerte brauche. Z.B. zeitliche Verlauf von Geschw. bzw. Beschleunigung.
Was mit 10ms abgeht ist Quatsch. Das war also nur eine Versuch... Natürlich verliere ich dazwischen sehr viele Takte.
Gemeinsam Pin0 und Pin1 geben die Drehrichtung und natürlich die Drehgeschwindigkeit.

Als Abtastung was ich brauche ist, nach meine Berechnungen für eine Geschwindigkeit von 10U/Sek. in eine 120er Taktscheibe, eine µC Abtastrate von mindestens 2.4 KHz.
Mit der Übertragung beim Zustandswechsel ist eine gute Idee. Aber darf ich den UART schneller laufen lassen, da in der Anleitung von dem µC Board '9600 Baud' als Standard angegeben ist? und wie mache ich das?
Danke für die Antworte
MfG
KurtM

stegr
14.12.2004, 20:43
Aber darf ich den UART schneller laufen lassen, da in der Anleitung von dem µC Board '9600 Baud' als Standard angegeben ist?

Wenn du 2,4kHz brauchst, wirst du mit 9600 Bits pro Sekunde nicht hinkommen... Es sei denn, du nimmst max. 4 Bits zur gesamten Beschreibung des Zustands... und eigentlich reicht dir ja auch 1 Bit, nämlich nur eins für die Drehrichtung (links oder rechts). Alles andere musst du ja nicht übertragen...

Aber es sollte auch kein Problem sein die Baudrate hochzudrehen, kommt aber auf die andere Seite an: Wenn du einen Rechner dran hast, ist es absolut kein Thema; wenn du aber nen anderen uC dran hast, musst du den auch umstellen, sofern das dort mit deinem Programm vereinbar ist...

MfG
Stefan

14.12.2004, 22:08
Hallo,
ich glaube, daß ich das Problem gelöst habe, zumindest theoretisch... Vielen Dank für die Hilfe.

Gruß
KurtM