Ist void setup / void loop pflicht?

Hallo,

ich habe momentan ein kleines Problem. Ich habe ein Programm im sketch bzw. im Atmel Studio geschrieben. Mein Arduino Uno soll via. Bluetooth erkennen, ob ich mit dem Handy ein "H" oder ein "F" geschickt habe, und je nach Zustand, eine LED einschalten. Hier ist mein Quelltext:

char val; // variable zum lesen
int ledpin = 5; // LED H
int ledpin2=6; // LED F

void setup() {
    pinMode(ledpin, OUTPUT);  // Pin-dekleration ->OUTPUT 
    pinMode(ledpin2,OUTPUT);
    Serial.begin(9600);       // Start Serial
}
void loop() {
    if( Serial.available() )       // Wenn ich was empfange...
    {
        val = Serial.read();         // ... speicher es in val
    }
    if( val == 'H' )               // wenn 'H' 
    {
        digitalWrite(ledpin, HIGH);  // ledpin auf high
        digitalWrite(ledpin2,LOW);  // ledpin2 auf low
        delay(100);                 //warte 100ms
    } 
    else if (val == 'F')            //wenn 'F'
    {
        digitalWrite(ledpin2,HIGH); //ledpin2 auf high
        digitalWrite(ledpin, LOW);   //ledpin auf low
        delay(100);                 //warte 100ms
    }
                      
    }

Dieser funktioniert, wie ich mir das vorstelle. :)

Wenn ich das aber nun "C - Typisch" ändern möchte, funktioniert das Programm nicht mehr. Ich ersetze "void setup()" durch int main() (gebe return 0; zurück.)

In dieser main-funktion, führe ich eine endlossschleife aus. --> while(1) wo ich eine Funktion aufrufe. { loop); }

char val; // variable zum lesen
int ledpin = 5; // LED H
int ledpin2=6; // LED F
void loop();  //dekleration der Funktion

int main(void) {
    pinMode(ledpin, OUTPUT);  // Pin-dekleration ->OUTPUT 
    pinMode(ledpin2,OUTPUT);
    Serial.begin(9600);       // Start Serial
    while(1)
    {
        loop();
    }

    return 0;
}
void loop(void) {
    if( Serial.available() )       // Wenn ich was empfange...
    {
        val = Serial.read();         // ... speicher es in val
    }
    if( val == 'H' )               // wenn 'H' 
    {
        digitalWrite(ledpin, HIGH);  // ledpin auf high
        digitalWrite(ledpin2,LOW);  // ledpin2 auf low
        delay(100);                 //warte 100ms
    } 
    else if (val == 'F')            //wenn 'F'
    {
        digitalWrite(ledpin2,HIGH); //ledpin2 auf high
        digitalWrite(ledpin, LOW);   //ledpin auf low
        delay(100);                 //warte 100ms
    }
                      
    }

Warum funktioniert das nicht?

Schönen Abend und allen Menschen die es nur lesen, und nicht antworten --> baldige Frohe Feiertage :)

Warum so ein Kraut? Entweder bei Arduinos Aufbau bleiben oder richtiges avr gcc nutzen. return 0 ist nicht zwingend notwendig, da es nie erreicht wird.

Die IDE erwartet eine setup sowie loop Routine.

Wieso willst Du sowas selbst machen wenn Arduino versteckt das berits macht?

in ~Arduino1.0.6/hardware/arduino/cores/arduino/main.ccp

/*
  main.cpp - Main loop for Arduino sketches
  Copyright (c) 2005-2013 Arduino Team.  All right reserved.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#include <Arduino.h>

//Declared weak in Arduino.h to allow user redefinitions.
int atexit(void (*func)()) { return 0; }

// Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { }

int main(void)
{
	init();

	initVariant();

#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
}

Grüße Uwe

Danke für die Antworten.
Ich habe das Problem beim rumprobieren erkannt, und wollte es gerne erklärt bekommen :wink:

Und “kraut” ist das, weil ich das eben nur schnell umgeschrieben habe. Da ich aus der “C” schiene komme, war das für mich bekannter / handlicher.

noch eine weitere Frage:

ich arbeite normalerweise mit DDRx bzw. PORTx .

Gibt es eine Datei, wo die Pins PB / PD usw. vordefinert sind ?

damit ich sowas machen kann: DDRA &= ~( (1<<PA0) | (1<<PA3) );
und nicht immer DDRA &= ~( (1<<0x20) | (1<<0x02) );

?

Du kannst du ganzen Standard avr gcc Sachen auch hier machen. Die Port und Pin Makros sind natürlich definiert. Die Arduino IDE selbst verwendet die ja. Die kapselt das aber lediglich ein einfacheren Makros und Funktionen.

Die IDE hat hier auch ein paar fertige Makros in Arduino.h:

#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))

schau dir mal die entsprechende avr/io.h an, die mit dem Toolchain geliefert wird. Das kommt nicht von Arduino sondern ist Bestandteil der Toolchain von Atmel. Die Bezeichnungen sind auf den PinOut wie auch alle andere Daten zu den Adressen dem Datenblatt zu entnehmen.

Darf man fragen, wenn du von der C Schiene kommst, warum du den Arduino nutzt? Ich würde eher sagen, das ist normalerweise anders herum, oder man scheitert am avr-gcc da man mit den Bezeichnungen DDRx, PINx, PORTx ... nicht zurecht kommt.

Die Hardware ist nicht IDE gebunden ;)