Ausführungszeit von Befehlen in BASCOM

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 16 4 2024  11:08:15      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


Autor
Ausführungszeit von Befehlen in BASCOM

    







BID = 585722

E-P-S

Neu hier



Beiträge: 32
Wohnort: Neuruppin
Zur Homepage von E-P-S
 

  


Hallo zusammen. Um mein Problem zu beschreiben, zunächst was ich hier habe.

Mein ATMEGA8 steuert eine Reihe von Schieberegistern (CMOS 4094) an. Er ist mit 7,3728MHz getaktet.

Das Schieben der Bits nehme ich von Hand vor, d.h. nicht mit SPI o.ä. sondern durch selbstständiges schalten der Ports.

Das ganze ist als Ring aufgebaut, d.h. wenn ich Daten in die Schieberegister hineinschiebe, lese ich gleichzeitig an deren Ende die Daten wieder in den AVR ein.

Alles funktioniert auch wie es soll und bei einem CMOS komme ich auf ~11000 Zyklen pro Sekunde.

Komisch ist nun folgendes. Habe ich 2 CMOS dran, sind es nur noch ~ 5300 Zyklen und bei 3 noch ~4000 Zyklen.

Das ist eindeutig zu wenig und ich wollte nun gerne bestimmen wo mir hier Zeit verloren geht.

Ich programmiere in BASCOM und meine Frage ist: "Wie kann ich die Ausführungszeiten von Befehlen, bzw. Programmzeilen, messen. ODER: Bei was in BASCOM geht viel zeit verloren (Arrays, Funktionen etc.)?"

Die angebotenen Timer (z.B. SysSec) beziehen sich nur auf Sekunden - was etwas zu langsam ist.

hier noch der entsprechende Codeausschnitt:


Code :

   Set Mb_strob                                             'Strobe auf LOW

Reset Mb_clock 'Clock auf LOW
Reset Mb_d_out 'Daten auf LOW

For I = 7 To 0 Step -1

If Nbyte.i = 1 Then
Set Mb_d_out 'Datenausgang auf HIGH
Else
Reset Mb_d_out 'Datenausgang auf LOW
End If

Set Mb_clock 'Clock AUF HIGH

Retbyte.i = Mb_d_inp 'Dateneingang auslesen

Reset Mb_clock 'Clock auf LOW

Next



Der Code schiebt immer 1 Byte raus, während er 1 Byte einliest. Das ganze ist in einer Funktion an die das zu sendende Byte übergeben wird und die mir das empfangene zurück gibt. Lasst euch durch das LOW/HIGH nicht täuschen, die nachgeschaltete Elektronik invertiert mir einige Signale.

Ich bedanke mich schon einmal ganz herzlich.

BID = 585735

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

 

  


Zitat :
Alles funktioniert auch wie es soll und bei einem CMOS komme ich auf ~11000 Zyklen pro Sekunde.
Ich denke, wenn du Assembler schreibst, kannst du auch 4 Register mit der 10-fachen Geschwindigkeit versorgen.

Es ist nicht ungewöhnlich, dass bei solchen Hochsprachen ein paar hundert Befehle abgearbeitet werden, wofür der Assemblerprogrammierer vielleicht 1..5 Instruktionen braucht.

_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

BID = 585777

E-P-S

Neu hier



Beiträge: 32
Wohnort: Neuruppin
Zur Homepage von E-P-S

Tja, da ist was dran, nur ist der gesamte Quellcode des Programms schon recht groß und meine Assembler Kenntnisse sind nicht die besten....

BID = 585801

BjörnB

Stammposter

Beiträge: 242
Wohnort: Dortmund

Hallo,

wenn Du mehr als ein Schieberegister verwendest dann reicht für die zu schreibenden Daten nicht mehr ein Byte, sondern Du brauchst einen größeren Datentyp, z.B. Int32. Intern wird Int32 aber z.B. als 4 einzelne Bytes verarbeitet, eine Addition dauert nun z.B. nicht mehr einen sondern vier Takte.

Liefert BASCOM kein Assembler-Listing wie etwa WinAVR es macht? So könnte man sich mal anschauen, was intern wirklich passiert, wobei das bei großen Programmen nicht ganz einfach ist, wenn man nicht fit in Assembler ist.

Schöne Grüße,
Björn

BID = 585802

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

Dann schau doch mal mit dem Simulator dem Maschinenprogramm bei der Arbeit zu.
Dann wirst du schon sehen, wo der Prozessor soich die meiste Zeit rumtreibt.
So schöne Tools gabs früher nicht, da musste man sich vorher Gedanken machen wie man ein Programm schreibt.

Ich habe aber einen Verdacht:
Vertausch doch mal die beiden Befehle

Retbyte.i = Mb_d_inp 'Dateneingang auslesen
Reset Mb_clock 'Clock auf LOW

Die Daten sind ja auch noch nach der fallenden Taktflanke am Ausgang vorhanden.
Evtl. baut das Programm wegen des zwischen Set/Reset eingeschobenen Ladebefehls die ganze Adressierung für den Port wieder neu auf.

Besonders aber die veränderliche Bitadressierung in der Schleife dürfte ziemlich rechenintensiv sein, weil da vermutlich jedesmal eine neue Testmaske aufgebaut wird.
Es geht bestimmt schneller, wenn du das betreffende Byte einfach rotierst oder schiebst und jedesmal nur das Bit 0 oder Carry ausgibst.

Ausserdem ist die IF/Else Konstruktion bestimmt zeitraubend.
Kannst du nicht einfach das Bit in den Port kopieren, ohne erst festzustellen, ob es eine 1 oder 0 ist ?


_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

BID = 585857

ElektroNicki

Inventar



Beiträge: 6429
Wohnort: Ugobangowangohousen


Offtopic :


Zitat :
E-P-S hat am  4 Feb 2009 17:59 geschrieben :

7,3728MHz

Warum zum Geier so ne krumme Zahl?


_________________

BID = 585858

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika


Offtopic :
Wen interessierts?


Schau dir mal die Instruktionen bld und bst an, damit kannst du, wie perl angedeutet hat, die Bits einfach an die Bestimmungsposition kopieren, ohne sie testen zu müssen. Dazu braucht es dann nicht mal mehr eine Maskierung. Nur eine weitere Schiebeinstruktion.

_________________

BID = 585859

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

Das dürfte mit dem Takt für die seriellen Übertragungen zusammenhängen.
Prüf mal ob das ein Vielfaches von 1200, ..., 9600, ..., 115,2 kBaud ist.

_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

BID = 585861

ElektroNicki

Inventar



Beiträge: 6429
Wohnort: Ugobangowangohousen

Hmm, bremst Koffein jetzt auf einmal das Gehirn?
Offtopic :
Hatte Ohrenweh und die Wirkung vom Ibuprofen mit etwas Schokakola erhöht

Hast Recht, 7,3728/64=0,1152

_________________

BID = 585880

E-P-S

Neu hier



Beiträge: 32
Wohnort: Neuruppin
Zur Homepage von E-P-S

Die krumme Taktzahl kommt daher das ich den AVR am PC habe und so eine Fehlerfreie Kommunikation hinbekomme - richtig erkannt.

Ich werde mir die Ratschläge zu herzen nehmen - ich danke euch erstmal für die vielen Tipps.


Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 25 Beiträge im Durchschnitt pro Tag       heute wurden bisher 7 Beiträge verfasst
© x sparkkelsputz        Besucher : 180898590   Heute : 3408    Gestern : 9164    Online : 495        16.4.2024    11:08
7 Besucher in den letzten 60 Sekunden        alle 8.57 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0364279747009