Forum: Mikrocontroller und Digitale Elektronik Buggy C-Code in Arduino-Fachartikel hier?


von Mutluit M. (mutluit)


Lesenswert?

Hi, auf der hiesigen Seite 
https://www.mikrocontroller.net/articles/Umstieg_von_Arduino_auf_AVR
ist ein Arduino-Fachartikel (von newgenertion) mit folgendem C-Code:
1
#include <stdint.h>
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
//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.

von Stefan S. (chiefeinherjar)


Lesenswert?

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?

von Mutluit M. (mutluit)


Lesenswert?

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.

: Bearbeitet durch User
von Jens M. (schuchkleisser)


Lesenswert?

Die "LED" blinkt ja auch nicht.
Blinken tut der andere Port.

von Mutluit M. (mutluit)


Lesenswert?

Jens M. schrieb:
> Die "LED" blinkt ja auch nicht.
> Blinken tut der andere Port.

Aeh, welchen anderen Port meinst du denn?

von HildeK (Gast)


Lesenswert?

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.

von Jens M. (schuchkleisser)


Lesenswert?

Mutluit M. schrieb:
> Aeh, welchen anderen Port meinst du denn?

Wenn der Code oben der ist der läuft: PortD

von S. R. (svenska)


Lesenswert?

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.

von Hubert G. (hubertg)


Lesenswert?

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.

von Walter S. (avatar)


Lesenswert?

Hubert G. schrieb:
> Wenn der Code komplett ist, wird hier

warum lässt du das weg:

Mutluit M. schrieb:
> DDRD = 0xFF;

von Hubert G. (hubertg)


Lesenswert?

Die Zeile hatte ich übersehen, gehörte für mich noch zum Kommentar.

von Einer K. (Gast)


Lesenswert?

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.

von Mutluit M. (mutluit)


Lesenswert?

Also, ich frag mich wieso PORTD da noch benutzt wird neben PORTB,
denn ich erreiche das gleiche mit dem folgenden Code, ganz ohne PORTD:
1
/*
2
Code for Arduino Mega 2560:
3
Switch on/off the onboard LED every 3 seconds for 3 seconds     
4
  
5
(For Arduino UNO change pin 7 below to pin 5)      
6
  
7
*/
8
#include <avr/io.h>
9
#include <util/delay.h>
10
11
#define BLINK_DELAY_MS 3000
12
13
int main(void)
14
{
15
  // set pin 7 of PORTB for output
16
  DDRB |= _BV(DDB7);
17
18
  while(1)
19
  {
20
    // set pin 7 high to turn led on
21
    PORTB |= _BV(PORTB7);
22
    _delay_ms(BLINK_DELAY_MS);
23
24
    // set pin 7 low to turn led off
25
    PORTB &= ~_BV(PORTB7);
26
    _delay_ms(BLINK_DELAY_MS);
27
  }
28
}

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

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".

von Mutluit M. (mutluit)


Lesenswert?

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.

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

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?

Beitrag #5864429 wurde von einem Moderator gelöscht.
von Mutluit M. (mutluit)


Lesenswert?

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.

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

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.

von Pennywise (Gast)


Lesenswert?

SOLLTEN wir tun!

von Mutluit M. (mutluit)


Lesenswert?

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.

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

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

von ichversuchsmal (Gast)


Lesenswert?

> 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

von Mutluit M. (mutluit)


Lesenswert?

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

: Bearbeitet durch User
von C.K. (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.