Hallo Leute,
ich versuche über eine serielle Schnittstelle, 10 Bits zu empfangenn,
und diese in einer Variablen zu speichern. Das Ganze versuche ich halt
"zu Fuß" zu realisieren.
Um mich direkt ein bisschen zu outen, ich bin mit Arduino
"aufgewachsen", versuche jetzt aber nach und nach in der üblichen C
Programmiersprache (ohne Arduino Libs) zu programmieren. Eben aus den
Gründen, um den Code besser verstehen zu können, flexibler zu bleiben,
um in Zukunft nicht nur an handvoll Atmel µC gebunden zu sein.
Den ersten Test habe ich so ausgeführt.
1
digitalWriteFast(CLK,LOW);
2
digitalWriteFast(CLK,HIGH);
3
value|=digitalRead(DATAPIN)<<9;
4
5
...
6
...
7
...
8
9
digitalWrite(CLK,LOW);
10
digitalWrite(CLK,HIGH);
11
value|=digitalRead(DATAPIN)<<0;
Zuerst wird einmal Clock-Cycle durchgeführt und dann der Pegel
eingelesen und dann an der entsprechenden Bit-Stelle, in einem Integer
abgelegt.
Es hat auch wunderbar in einer for-Schleife funktioniert.
Nun würde ich gern etwas schneller lesen, weil digitalRead/Write zum
Einschlafen sind und da komme ich irgendwie nicht weiter.
Ich ich habe anstelle von digitalRead schon vieles mit Bitmanipulation
ausprobiert und komme aber zu keinem brauchbaren Ergebnis. Wenn ich mir
die Variable dann im seriellen Monitor ausgeben lasse, habe ich dort
meistens mehr als 10 Bits.
Zwischendurch dachte ich, dass ich den µC irgendwie gehimmelt habe. Aber
mit "digitalRead" klappt es nach wie vor, nur eben zu langsam.
Bin für jede Hilfestellung sehr dankbar :-)
Peter Dannegger schrieb:> #include <avr\io.h>
Peter, auch unter Windows funktioniert der Slash in Include-Pfaden
tadellos.
#include <avr/io.h>
ist daher portabler.
Sam schrieb:> Zwischendurch dachte ich, dass ich den µC irgendwie gehimmelt habe. Aber> mit "digitalRead" klappt es nach wie vor, nur eben zu langsam.
Wenn Du, wie man an Deinem Beispielcode sehen kann, ein Makro für
"digitalWriteFast" installiert hast, dürftest Du ziemlich sicher auch
ein Makro für "digitalReadFast" installiert haben.
Wenn es mit "digitalRead" funktioniert, wäre die erste Maßnahme also,
für eine Konstante als Datenpin das Makro "digitalReadFast" zu
verwenden. Das beschleunigt die Dinge schon mal etwas.
Funktioniert es dann?
Wenn das immer noch nicht schnell genug ist, gehst Du mit direkter
Registerprogrammierung dran.
Und wenn nicht die Geschwindigkeit, sondern Deine Programmlogik das
Problem ist, dann prüfe mal, ob Du in Deinem nicht gezeigten Code die
Variable "value" überhaupt auf Null setzt, bevor Du sie mit den
gelesenen Werten veroderst.
1
value=0;
2
...
3
value|=
4
...
5
value|=
6
...
7
value|=
Wenn Du die Variable nicht anfangs auf null setzt und stattdessen einen
Zufallswert aus dem RAM abgreifst, hat sie hinterher ziemlich sicher
mehr Bits gesetzt als Du sie mit den Veroderungen setzt.
Vielen Dank für eure Antworten.
Ich glaube, ich sollte mich noch etwas tiefer in die ganzen Anweisung
(Operanden? <<= ) einarbeiten.
@Jürgen S. ja, die digitalWriteFast Bibliothek habe ich ausprobiert.
Leider hatte ich immer eine Fehlermeldung "invalid type argument of
'unary *'".
Ich habe mir die Bibliothek etwas genauer angeschaut und noch ein Befehl
digitalWriteFast2 gefunden. Damit habe ich keine Fehlermeldungen und ich
bekomme auch meine 10Bits. Was da aber genau gemacht wird, muss ich mir
noch genauer anschauen.
Im Moment hüpfe ich noch durch die Tutorials durch.
Nochmal vielen Dank.