Hallo.
Ich lerne gerade Arduinos und C und verwende im Projekt ein LCDisplay
Nokia 5110 mit PCD8544 Controller, siehe:
http://www.rinkydinkelectronics.com/images/libpics/L0044P001313163463.png
Nun will ich die Arduino-Befehle (z. B. digitalWrite()) durch
C-Programmierung ersetzen, die wesentlich schneller sind. Dabei entsteht
leider ein Problem mit der Definition/Festlegung der Pinzuweisung.
Arduino IDE:
------------
1
#define LCD_DC 7 // LCD: Data/!Command, Pegel: LOW für Befehl (command) oder HIGH für Daten (data)
2
constbooleanISCMD=LOW;// Wird an das LCD gesendet muß eingestellt werden, ob es Daten oder Befehle sind, siehe LCD_DC.
3
constbooleanISDATA=HIGH;// dito
4
5
digitalWrite(LCD_DC,ISCMD);// Die folgenden Daten werden als Befehl/Kommando interpretiert (Einstellung des LCD)
C:
--
1
#define LCD_DC PD7 // LCD: Data/!Command, Pegel: LOW für Befehl (command) oder HIGH für Daten (data)
2
#define LCD_DC_PORT PORTD // Diese Zeile will ich einsparen [1]
Wenn ich jetzt den Pin wechsle (z. B. PB3 statt PD7) und die zweite
Zeile übersehe und vergesse PORTD in PORTB zu ändern meckert der
Compiler nicht und ich wundere mich, daß das nicht funktioniert.
[1]: Gibt es eine Möglichkeit den C-Befehl so zu implementieren, daß die
Zeile mit der Port-Festlegung entfallen kann?
Folgenes habe ich gefunden, was vielleicht eine Lösungsweg mit sbi und
cbi eröffnet hätte:
"In Quellcodes, die für ältere Version den des avr-gcc/der avr-libc
entwickelt wurden, werden einzelne Bits mittels der Funktionen sbi und
cbi gesetzt bzw. gelöscht. Beide Funktionen sind nicht mehr
erforderlich."
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Ver.C3.A4ndern_von_Registerinhalten
Grüße an Alle, die mir helfen. ;-)
SG
Sorry, ich bin versehentlich auf Absenden gekommen.
Da wollte ich noch den Code als Code markieren...
Vielleicht kann ein Moderator den Betreff korrigieren:
Arduino digitalWrite durch C-Code ersetzen
SG
Ich weiß nicht in wie weit dir klar ist, was du in der Hardware genau
austeuerst. Sagen dir Register und Registerbits etwas?
Arduino macht nämlich vermutlich noch mehr, wie Beo Bachta schon gesagt
hat.
Die beiden defines in deinem Fall legen zwei verschiedene Sachen fest:
LCD_DC_PORT ist ein Register, dass an einer bestimmten Adresse steht und
das verhalten eines Ports beeinflusst. Für den Compiler ist das im
Prinzip eine integer Variable. Nur das Handbuch vom Controller sagt dir,
was diese tut.
LCD_DC ist ein Index für ein Bit in diesem Register, dass gelöscht
werden soll. Für den Compiler ist das ein Integerwert.
Wenn du nach der Deklaration von PORTD und PD7 suchst, dann findest du
defines die das ganze umsetzen. Die defines gibt es auch nur, weil der
Code dann besser lesbar ist, als mit den direkten Adressen zu arbeiten.
Für den Compiler ist es aber einfach nur ein Integer und ein Wert, die
in keinem Zusammenhang stehen. Deine Programmlogik und die Doku bringen
den Zusammenhang.
Die einzige Möglichkeit es zu vereinfachen wäre das ganze in
Hilfsfunktionen oder Hilfsklasse (dann bräuchte man z.B. C++)
auszulagern. In deinem Fall bringt das aber nur was, wenn du das in
mehreren Projekten verwendest, denn die Hilfsfunktion schreibt sich ja
auch nicht von allein.
SG schrieb:> Nun will ich die Arduino-Befehle (z. B. digitalWrite()) durch> C-Programmierung ersetzen, die wesentlich schneller sind.
Dann verwende doch digitalWriteFast()
Danke für die Hinweise.
Beo Bachta schrieb:> Du musst auch den Teil umsetzen der in der Arduino-Source die Port-Pins auf
Output stellt.
Das ist das gleiche Problem, aber vielleicht für andere Mitleser
interessant und zur Vollständigkeit aufgeführt:
Arduino IDE:
M.K. B. schrieb:> Ich weiß nicht in wie weit dir klar ist, was du in der Hardware genau
ansteuerst.
Sehr klar. Es läuft auch schon.
> Die beiden defines in deinem Fall legen zwei verschiedene Sachen fest ...
Auch das ist völlig klar.
Wie gesagt, ich bin nicht so versiert, daher meine Frage.
Ich will ja das Rad nicht neu erfinden...
Wolfgang schrieb:> Dann verwende doch digitalWriteFast()
Habe ich mir gerade heruntergeladen und angesehen:
https://code.google.com/p/digitalwritefast/
Scheint wohl die Lösung zu sein.
Danke!
SG
SG schrieb:> Und was ist Deine Lösung, wenn Du das Problem verstanden hättest?> Wenn Du das gleiche LCD ansteuerst, zeig doch mal Deinen (C-)Code.
ich leiste mir echt den Luxus die LIBs zu nutzen
ergo ist mein Code nicht sehr berauschend,
im wesentlichen um Verdrahtung zu sparen ein paar Pin #defines
an keiner Stelle brauche ich
pinMode(LCD_DC, OUTPUT); // Ausgang zuweisen
LCD_DC_PORT |= (1<<LCD_DC); // statt pinMode(LCD_DC, OUTPUT);
yesitsme schrieb:> Ich denke das digitalWrite() hauptsächlich durch den Lookup von Port und> Bitmask langsam wird, der bei jedem Aufruf gemacht werden muss.>> Wenn man viel IO machen muss, könnte man diesen Lookup in der init()> machen.
Die beim Arduino benutzte Sprache kann das sogar beschreiben, daß es
schon beim Übersetzen ein konstanter Ausdruck ist und damit schon vor
dem Anlegen einer Betriebsspannung berechnet sein kann.