-
        
+ Antworten
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Maximum Taktung?

  1. #1
    KurtM
    Gast

    Maximum Taktung?

    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?

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.835
    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

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    33
    Beiträge
    506
    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

  4. #4
    KurtM
    Gast

    Maximum Taktung? Quellcode

    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ß

  5. #5
    KurtM
    Gast

    Maximum Taktung? Quellcode Korrektur...

    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

  6. #6
    Gast
    Hallo Kommunity!
    gibt es keine Antwort auf meine Frage?
    MfG
    KurtM

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.835
    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 ?
    ?? robert

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    33
    Beiträge
    506
    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

  9. #9
    Gast
    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

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    33
    Beiträge
    506
    Zitat Zitat von Anonymous
    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

+ Antworten
Seite 1 von 2 12 LetzteLetzte

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •