Zitat Zitat von Klebwax Beitrag anzeigen
Die achtfache Addition dürfte bei einem ATMEGA mit 16MHz so rund eine µs dauern. Wenn das versehentlich 16-Bit Variable sind, vielleicht auch zwei. Ist also unerheblich. Die Übertragung mit 100kHz I2C dauert etwa 300µs (3*9 Takte plus Start und Stop), und das unabhängig davon, ob die 100kHz in SW oder in HW gemacht werden. Um das Ganze etwas zu beschleunigen, kann man den "Sequential mode" Mode verwenden (Datenblatt 3.2.1). Da kann man alle 16 Bit in einem I2C Transfer schreiben.

Aber selbst wenn man das zweimal macht, dauert das weniger als eine Millisekunde. Das merkt man nicht, es muß also etwas anderes sein.

MfG Klebwax
Tag

Das es an der Kommunikation des Busses liegt hatte ich auch nicht gedacht
sondern das es Programmtechnisch ist.
habe jetzt sämtliche Variablen von int auf unsigned char geändert, was die Programmlänge reduziert.

Ich bin zwar der Meinung das die CPU etwes schneller ist, aber wenn auch nicht wirklich viel.

Gut

Dann was mache ich noch im Programm:
Der Eingabebus arbeitet aus einer anderen oder älteren Entwicklung als Paralleler 16 Bit Bus.
Hier frage ich 16 Eingänge ab und speichere diese in Variablen ab.
Beispiel E1-16 -> vin1....vin16 die ich später abfragen kann.

Hier zähle ich per Takt über einen interen Timer einen Zähler (counter ++) immer hoch.
Pro Eingang mache ich nun folgendes

if (counter == 1 && in1 == 1)
{
vin1 = 1
}

if (counter == 1 && in1 == 0)
{
vin1 = 0
}

das mache ich natürlich 16x pro counterstellung..hier muss ich aber sagen wenn nur der eingangsbus programmiert ist,
die cpu sehr schnell ist.
erst wenn der I2C bus ins spiel kommt, also von der software wird er langsamer

sind vllt die if anweisungen das problem ?

vllt kann man diese routinen auch anders machen, arrays vllt ???

grüsse
Patrick

- - - Aktualisiert - - -

Zitat Zitat von 021aet04 Beitrag anzeigen
Was schieben ist bzw wie man schiebt, steht dort. Als Beispiel:
Ergebnis = (1<<2) | (1<<3);
(1<<2) ist ein Schiebebefehl => es wird eine 1 geladen und um 2 stellen nach links geschoben => es steht dann beim 3ten Bit im Ergebnis eine 1

Das Zeichen | bedeutet bitweises Oder

Beim oberen Beispiel hast du dann im Bit 2 und Bit 3 eine 1 stehen.

Ich würde mir die Grundlagen der Digitaltechnik anschauen.

MfG Hannes
Mahlzeit

ich muss sagen ich bin beruflich SPS Programmierer, kenne als Schiebeoperationen.
das Problem ist ich habe mit Codevision angefangen zu programmieren über einen kollegen und mir vieles selber angeignet.
Daher denke ich auch, ist das Programmieren wie ich es mache nciht immer optimal und vermutlich auch zu kompliziert.


Aber ich weiss was du meinst, könnte man versuchen