//Der Arduino-Pin 13 ist auf dem Arduino Uno der Pin PB5
6
#define LED_DDR DDRB
7
#define LED_PORT PORTB
8
#define LED_BIT PB5
9
10
int main(void)
11
{
12
LED_DDR |= (1 << LED_BIT); // sets the digital pin as output
13
14
//die 8 LEDs leigen alle auf PORTD, also diesen komplett auf Ausgang
15
DDRD = 0xFF;
16
17
LED_PORT |= (1 << LED_BIT); // sets the Board-LED on
18
while(1)
19
{
20
for(uint8_t i = 0; i < 8; i++)
21
{
22
PORTD |= (1 << i); // sets the LED on pin <i> on
23
_delay_ms(100); // waits 100 milliseconds
24
PORTD &= ~(1 << i); // sets the LED on pin <i> off
25
}
26
_delay_ms(1000); // waits for a second
27
}
28
}
Wieso akzeptiert der Compiler eigentlich diese Zeile anstandslos? :
LED_PORT |= (1 << LED_BIT); // sets the Board-LED on
Müsste er da nicht eine Fehlermeldung (oder zumindest ein Warning)
bringen?
Und: ist der Code in der Ausführung eigentlich überhaupt korrekt?
Ich hab's auf einem Arduino MEGA 2560 ausprobiert mit dieser Änderung:
#define LED_BIT PB7
aber es tut nicht was es sollte, nämlich blinken.
Ich frag das mal in die Runde der Arduino-Experten hier, da ich mich mit
Arduinos erst seit nur kurzem befasse.
Mutluit M. schrieb:> Wieso akzeptiert der Compiler eigentlich diese Zeile anstandslos? :> LED_PORT |= (1 << LED_BIT); // sets the Board-LED on> Müsste er da nicht eine Fehlermeldung (oder zumindest ein Warning)> bringen?
Wieso sollte er denn?
Stefan S. schrieb:> Mutluit M. schrieb:>> Wieso akzeptiert der Compiler eigentlich diese Zeile anstandslos? :>> LED_PORT |= (1 << LED_BIT); // sets the Board-LED on>> Müsste er da nicht eine Fehlermeldung (oder zumindest ein Warning)>> bringen?>> Wieso sollte er denn?
Ach! Jetzt kapiere ich es: PORTB ist eine globale variable! (Ich hatte
angenommen es ist nur eine Konstante bzw. Zahlenwert).
Ok, dann liegt dort also kein Fehler vor.
Mutluit M. schrieb:> Wieso akzeptiert der Compiler eigentlich diese Zeile anstandslos? :> LED_PORT |= (1 << LED_BIT); // sets the Board-LED on> Müsste er da nicht eine Fehlermeldung (oder zumindest ein Warning)> bringen?
Warum denn?
Das "#define" ist eine Preprozessoranweisung, die den Compiler dazu
veranlasst, LED_BIT durch PB5 und LED_PORT durch PORTB zu ersetzen
(Textersetzung vor dem Compilieren).
Dann steht da PORTB |= (1<< PB5) als übliche Anweisung um PB5 auf HIGH
zu setzen.
Der Vorteil ist, dass du in den define-Anweisungen fürs ganze Programm
übersichtlich auf einen andern Pin wechseln könntest und gleichzeitig im
Programm sprechende Namen hast, die du nicht ändern musst.
Mutluit M. schrieb:> Ich frag das mal in die Runde der Arduino-Experten hier,> da ich mich mit Arduinos erst seit nur kurzem befasse.
Dein Code hat nichts mit Arduino zu tun. Das Code-Pattern, was du da
gefunden hast, ist die übliche Art, einen AVR zu programmieren.
Mutluit M. schrieb:> Jetzt kapiere ich es: PORTB ist eine globale variable!
Naja. Es ist ein Peripherieregister.
Wenn der Code komplett ist, wird hier
for(uint8_t i = 0; i < 8; i++)
{
PORTD |= (1 << i); // sets the LED on pin <i> on
_delay_ms(100); // waits 100 milliseconds
PORTD &= ~(1 << i); // sets the LED on pin <i> off
}
_delay_ms(1000); // waits for a second
nur jeweils der PullUp ein und ausgeschaltet.
Hubert G. schrieb:> nur jeweils der PullUp ein und ausgeschaltet.
Ist klar!
Denn darum steht ja auch DDRD = 0xFF ein paar Zeilen drüber.
? ? ?
S. R. schrieb:> Dein Code hat nichts mit Arduino zu tun. Das Code-Pattern, was du da> gefunden hast, ist die übliche Art, einen AVR zu programmieren.
Naja...
Immerhin läuft/kompiliert es in/mit der Arduino IDE.
Arduino Fanboy D. schrieb:> Immerhin läuft/kompiliert es in/mit der Arduino IDE.
Nur, wenn der Arduino auch einen AVR benutzt. Ansonsten läuft/kompiliert
in der Arduino IDE auch normaler C++-Code, aber der wird deswegen
trotzdem nicht zu "Arduino-Code".
S. R. schrieb:> Arduino Fanboy D. schrieb:>> Immerhin läuft/kompiliert es in/mit der Arduino IDE.>> Nur, wenn der Arduino auch einen AVR benutzt. Ansonsten läuft/kompiliert> in der Arduino IDE auch normaler C++-Code, aber der wird deswegen> trotzdem nicht zu "Arduino-Code".
Also, ich für mich habe alles in der Linux shell gemacht (also alles
Kommandozeile), keine IDE benutzt.
S. R. schrieb:> Nur, wenn der Arduino auch einen AVR benutzt. Ansonsten läuft/kompiliert> in der Arduino IDE auch normaler C++-Code, aber der wird deswegen> trotzdem nicht zu "Arduino-Code".
Du bist ja wirklich ein ganz schlauer.
Ein richtiger Blitzmerker.
Ich bin schwer beeindruckt!
Aber wenn du gerne die Definitionshoheit "Was ist Arduino Code, und was
nicht?" für dich beanspruchen möchtest...
Von mir aus.
Nimm dir, was dir zusteht!
------------
Mutluit M. schrieb:> Also, ich für mich habe alles in der Linux shell gemacht (also alles> Kommandozeile), keine IDE benutzt.
Glaube ich dir...
Macht aber bei dem, was hinten rausschaut, keinen wirklichen
Unterschied.
Oder?
Arduino Fanboy D. schrieb:> Mutluit M. schrieb:>> Also, ich für mich habe alles in der Linux shell gemacht (also alles>> Kommandozeile), keine IDE benutzt.>> Glaube ich dir...> Macht aber bei dem, was hinten rausschaut, keinen wirklichen> Unterschied.> Oder?
Naja, kommt ja drauf an. Denn C-Code zu schreiben in Arduino Studio
(oder wie deren IDE gennant wird) sieht ganz anders aus als C-Code mit
gcc-avr.
Im ersteren Fall gibt es ja die berühmten Funktionen setup() und loop(),
ich glaube die nennen solche Programme auch "Sketches" o.ä..
Nur im zweiten Fall handelt es sich um ein richtiges & vollständiges
C-Program.
Die Intention des verlinkten Fachartikels um den es hier geht, war ja
auch genau diese Unterschiede aufzuzeigen. Ich empfehle den ansonsten
guten Artikel zu lesen.
Arduino Fanboy D. schrieb:> Aber wenn du gerne die Definitionshoheit "Was ist Arduino Code, und was> nicht?" für dich beanspruchen möchtest...> Von mir aus.
Ich glaube hier möchte jemand ganz anderes gerne umdefinieren was
"Arduino Code" ist und was nicht. Natürlich könnte man jeden Code der in
der Arduino IDE kompiliert jetzt als "Arduino Code" bezeichnen. Dann
ziehen wir alle um aufs Narrenschiff und schießen uns Löcher ins Knie
und schütten warme Milch rein. Klar KÖNNTEN wir tun.
Mutluit M. schrieb:> Naja, kommt ja drauf an. Denn C-Code zu schreiben in Arduino Studio> (oder wie deren IDE gennant wird) sieht ganz anders aus als C-Code mit> gcc-avr.
Ja?
Arduino nutzt den avr-gcc.
Ganz anders, ist das also nicht.
Allerdings ist es meist C++ in der Arduinowelt, zumindest bei/in den
*.ino Dateien.
Mutluit M. schrieb:> Im ersteren Fall gibt es ja die berühmten Funktionen setup() und loop(),> ich glaube die nennen solche Programme auch "Sketches" o.ä..
setup() und loop() sind ohne Zweifel weit verbreitet, in der
Arduinowelt.
Aber eine Notwendigkeit diese zu nutzen, besteht nicht.
Ganz im Gegenteil!
Es kann sogar notwendig sein, darauf zu verzichten.
Und das ist gar nicht so selten.
Und genau aus dem Grund läuft der eingangs vorgestellte Code auch
unverändert mit der Arduino IDE.
Auch weil sich C und C++ in dem Punkt ähnlich genug sind.
---------------
Cyblord -. schrieb:> Natürlich könnte man jeden Code der in> der Arduino IDE kompiliert jetzt als "Arduino Code" bezeichnen.
Ja, das kann man!
Du kannst gerne versuchen einen Unterschied herbeizureden, welcher nicht
existiert. Aber viel klüger, erscheinst du dadurch nicht.
Cyblord -. schrieb:> Dann> ziehen wir alle um aufs Narrenschiff und schießen uns Löcher ins Knie> und schütten warme Milch rein. Klar KÖNNTEN wir tun.
Ich wünsche dir Vergnügen bei deinem Hobby.
Arduino Fanboy D. schrieb:> Mutluit M. schrieb:>> Naja, kommt ja drauf an. Denn C-Code zu schreiben in Arduino Studio>> (oder wie deren IDE gennant wird) sieht ganz anders aus als C-Code mit>> gcc-avr.>> Ja?> Arduino nutzt den avr-gcc.> Ganz anders, ist das also nicht.>>> Allerdings ist es meist C++ in der Arduinowelt, zumindest bei/in den> *.ino Dateien.>> Mutluit M. schrieb:>> Im ersteren Fall gibt es ja die berühmten Funktionen setup() und loop(),>> ich glaube die nennen solche Programme auch "Sketches" o.ä..> setup() und loop() sind ohne Zweifel weit verbreitet, in der> Arduinowelt.> Aber eine Notwendigkeit diese zu nutzen, besteht nicht.> Ganz im Gegenteil!> Es kann sogar notwendig sein, darauf zu verzichten.> Und das ist gar nicht so selten.>> Und genau aus dem Grund läuft der eingangs vorgestellte Code auch> unverändert mit der Arduino IDE.> Auch weil sich C und C++ in dem Punkt ähnlich genug sind.
Ja, gut zu wissen, danke. Da ich den Arduino Studio/IDE noch nicht
selber ausprobiert habe (aus dem simplen Grund weil es auf deren WebSite
geheissen hat dass es eine Windows-Anwendung ist und ich seit vielen
Jahren kein Windows mehr habe), wusse ich nicht dass die im Hintergrund
auch nur den avr-gcc (bzw. avr-g++) einsetzt. Wieder was dazugelernt.
Also, sind die besagten funtionen setup() und loop() demnach
public-Methoden einer (internen) Application-class. Ja, macht Sinn.
Btw, meine beiden code-editoren sind joe und vi(m) :-) Also, sehr
spartanisch im Vergleich zu den "modernen" Editoren :-) Aber mir reicht
es so völlig aus.
Mutluit M. schrieb:> Also, sind die besagten funtionen setup() und loop() demnach> public-Methoden einer (internen) Application-class.
Nöö..
Stinknormale Funktionen
Wäre vielleicht wünschenswert, eine solche Applikation Class zu haben...
Ist aber nicht gegeben.
Mutluit M. schrieb:> Da ich den Arduino Studio/IDE noch nicht> selber ausprobiert habe (aus dem simplen Grund weil es auf deren WebSite> geheissen hat dass es eine Windows-Anwendung ist und ich seit vielen> Jahren kein Windows mehr habe),
Die Arduino IDE ist durchaus für Linux erhältlich.
Das Atmel Studio ist ein reines Win Programm.
Wie auch Visual Studio
> Mutluit M. schrieb:>> Da ich den Arduino Studio/IDE noch nicht>> selber ausprobiert habe (aus dem simplen Grund weil es auf deren WebSite>> geheissen hat dass es eine Windows-Anwendung ist und ich seit vielen>> Jahren kein Windows mehr habe),https://www.arduino.cc/en/Guide/Linux
Arduino Fanboy D. schrieb:> Mutluit M. schrieb:>> Da ich den Arduino Studio/IDE noch nicht>> selber ausprobiert habe (aus dem simplen Grund weil es auf deren WebSite>> geheissen hat dass es eine Windows-Anwendung ist und ich seit vielen>> Jahren kein Windows mehr habe),> Die Arduino IDE ist durchaus für Linux erhältlich.
Ja, sieh mal an. Nochmals danke! Werde ich mir dann tatsächlich mal
anschauen. Schon allein um ein Überblick zu bekommen. Kann ja nicht
schaden.
Nachtrag:
Also, wer hätte es gedacht: die Arduino IDE (und einige weitere pgme)
gibt es ja sogar im Debian repository! :-) Werde ich dann mal von der
dort installieren:
1
$ aptitude search arduino
2
p arduino - AVR development board IDE and built-in libraries
3
p arduino-core - Code, examples, and libraries for the Arduino platform
4
p arduino-mighty-1284p - Platform files for Arduino to run on ATmega1284P
5
p arduino-mk - Program your Arduino from the command line
Arduino-Code ist für mich Programmcode welches das Arduino-Framework
verwendet.
Arduino-Code lässt sich für unterschiedliche Arduino-Hardware
kompilieren (nicht nur für die AVR-Basierten)
Dazu müsste man aber komplett auf Registerzugriffe verzichten und nur
die Framework-Funktionen wie DigitalWrite() und co verwenden.
C.K. schrieb:> Arduino-Code ist für mich Programmcode welches das Arduino-Framework> verwendet.
Leicht zu erkennen an der Dateinamenserweiterung *.ino, die das übliche
Build-System entsprechend behandelt.