Arduino Befehle ohne Arduino board

Hallo Community,

geplant wäre es einen eigenen Arduino zu bauen, habe nun auch testweise auf dem Steckbrett die Beschaltung für den IC ATMEGA 328P-PU aufgebaut und spiele über ICSP und dem Arduino Programm(und ICSP Adapter von Arduino) das Programm in den IC! Jedoch die Arduino Befehle "digitalWrite(),.." usw. funktionieren nicht mehr, ich kann zwar das Programm einspielen, aber der Ausgang wird nie HIGH,.. - über die Register DDR, PORT usw. funktioniert es jedoch.
Auch über ICSP mit einem Arduino Uno Board funktionieren die Arduino Befehle!
Nun zu meiner Frage: ist es nicht möglich einen ATMEGA ohne Arduino-Board mit den Arduino befehlen zu nützen, auch wenn ich die Software von Arduino zum programmieren und einspielen nutze? (wird dafür eine zusätzliche Beschaltung notwendig?)

Danke im Voraus!

Doch doch!
Das muss alles funktionieren.

(wird dafür eine zusätzliche Beschaltung notwendig?)

Minimalbeschaltung:
Ein 100nF Stützkondensator
Ein Widerstand am Reset pin

Fuses richtig setzen!

Denke das ganze ist für 16mhz ausgelegt ?

Einen 16mhz Quarz und 2x22pf einbauen und auf "external crystal oszillator" fusen.

ja, IC ist mit 2x 22pF Kond. und einen 16Mhz Quarz angebunden, wenn der Quarz abgehängt wird, dann funktioniert die Schaltung auch mit DDR,PORT Registern nicht mehr, bzw. kann auch kein Programm mehr hochgeladen werden.
Jedoch habe ich gelesen, dass standardmäßig der interne Oszillator eingestellt ist ?
Ich bin jetzt am suchen nach einer Anleitung, wie ich richtig die fuse bits setze, habe aber bis jetzt noch nichts verständliches gefunden, wodurch ich mir nicht den IC kaputt mache!
Könnte mir das wer kurz erklären/zeigen?
(gestoßen bin ich auf diese Seite AVR® Fuse Calculator – The Engbedded Blog)

Danke

Wenn du einen 16MHz Quarz dran hast, sollte es reichen, wenn du den Arduino Bootloader drauf schreibst. Bei dem Vorgang werden auch gleich die Fuses gesetzt.

Wie ich es tue....
Alten Atmega aus dem UNO ziehen
Neuen Mega rein
Per USBasp Bootloader drauf, wenn nötig, fuses setzen.
Per USB Software drauf. (ist dann gleich der Bootloadertest)

Fertig ist der 328 für die Schaltung.

Ich habe mir eigene boards.txt Einträge für meine Dinger gemacht.

combie:
Wenn du einen 16MHz Quarz dran hast, sollte es reichen, wenn du den Arduino Bootloader drauf schreibst. Bei dem Vorgang werden auch gleich die Fuses gesetzt.

Wie ich es tue....
Alten Atmega aus dem UNO ziehen
Neuen Mega rein
Per USBasp Bootloader drauf, wenn nötig, fuses setzen.
Per USB Software drauf. (ist dann gleich der Bootloadertest)

Fertig ist der 328 für die Schaltung.

Ich habe mir eigen Boards.txt Einträge für meine Dinger gemacht.

Danke für die kurze Beschreibung, ich habe Bootloader bereits aufgespielt, dies habe ich bereits getestet, desweiteren wurde der ATMEGA bereits mit Arduino Bootloader ausgeliefert (http://www.amazon.de/gp/product/B00OM7BMT0?psc=1&redirect=true&ref_=oh_aui_detailpage_o02_s00#productDetails) leider funktionieren die Befehle von Arduino dennoch nicht.

Hier ein Foto vom Aufbau Dropbox - Error - Simplify your life

Wiesinger10:
leider funktionieren die Befehle von Arduino dennoch nicht.

Und dass Deine Arduino-Programmierkenntnisse nicht funktionieren, kannst Du ausschließen?

Zeige den Sketch (gepostet innerhalb von Code-Tags, im Edit-Menu über das </> Symbol einfügbar!

Coder der Funktioniert (LED blinkt)

#include <avr/io.h>
#include <util/delay.h>

int main (void)
{

   DDRB|=(1<<PB1);

   while(1)
   {

      PORTB&=~(1<<PB1);
      _delay_ms(1000);
      PORTB|=(1<<PB1);
      _delay_ms(1000);
    
   }
   
}

Code der nicht Funktioniert (LED macht gar nichts - bleibt dunkel)

#include <arduino.h>

void setup() 
{               
  pinMode(PB1, OUTPUT);    
}


void loop() 
{
  digitalWrite(PB1, HIGH); 
  delay(500);          
  digitalWrite(PB1, LOW);  
  delay(500);          
}

Edit: statt PB1 habe ich es schon mit den Eintrag Pin "9" versucht - auch kein Erfolg

hey sorry, was ist da los, jetzt geht es auf einmal

ich hab jetzt nocheinmal PB1 mit 9 ersetzt und jetzt blinkt es :o

Sorry das ich euch aufgehalten habe!
Danke für die Hilfe !!!

Wiesinger10:
Edit: statt PB1 habe ich es schon mit den Eintrag Pin "9" versucht - auch kein Erfolg

Du musst überall die Arduino Pinnummern im Programm verwenden, wo Du Arduino-Befehle verwendest.

Also sowohl mit der Funktion "pinMode" als auch mit der Funktion "digitalWrite".

Außerdem solltest Du include-Dateien per #include entweder mit dem richtigen Dateinamen inkludieren (auch wenn die Verwechslung von Groß- und Kleinschreibung unter Windows-Betriebssystemen meist folgenlos bleibt) oder sie einfach weglassen.

Ich habe Deinen Code mal angepasst und dem Pin einen Namen spendiert:

#define TESTPIN 9

void setup() 
{               
  pinMode(TESTPIN, OUTPUT);    
}


void loop() 
{
  digitalWrite(TESTPIN, HIGH); 
  delay(500);          
  digitalWrite(TESTPIN, LOW);  
  delay(500);          
}

Wenn Du statt 'TESTPIN' lieber die tatsächliche Arduino-Pinnummer 9 einsetzt, funktioniert es aber genauso.

Du kannst natürlich nicht die Arduino Pin Nummer durch PB1 ersetzen. PB1 ist nur ein Makro für "1"

Serenifly:
Du kannst natürlich nicht die Arduino Pin Nummer durch PB1 ersetzen. PB1 ist nur ein Makro für "1"

ich wäre der Meinung gewesen, dass ich dies schon einmal getestet hätte und da hätte es funktioniert - seltsame Sache - desweiteren dachte ich, dies wäre intern im Arduino verlinkt, da PB1 ja Pin 9 am Arduino ist..

Danke für eure Hilfe - man(n) lernt nie aus =D - jetzt geht mein Plan doch auf

Serenifly:
PB1 ist nur ein Makro für "1"

Das verstehe ich nicht, wie ist das gemeint? PB1 = Port B Bit 1 beim µC, würde ich als hardwarenah bezeichnen. PB1 ist verbunden mit "9" am Header des UNO. Wenn nun "9" ein Ersatz für "PB1" wäre, könnte ich das verstehen. Wo kommt aber nun die "1" her? :confused:

Du hast es doch schon gesagt. Bit 1 von Port B. Allerdings musst du bedenken, dass du so nie einen Pin mit nur einem Bezeichner ansprechen kannst. Du brauchst immer Port Namen und Bit Nummer.

Diese drei Zeilen sind das gleiche:

PORTB = _BV(1);
PORTB = _BV(PB1);
PORTB = _BV(PORTB1);

Wobei _BV() (bit value) wiederum ein Makro für (1 << n) ist

Pin 15 (IC-Beinchen) = PB1 (Port B Bit 1 aus µC-Sicht) = Pin 9 (UNO Header)

Danke!

Hierzu nochmal

Wiesinger10:
desweiteren dachte ich, dies wäre intern im Arduino verlinkt, da PB1 ja Pin 9 am Arduino ist..

Die Port Bezeichnungen A, B, C, etc. kommen nicht vom Arduino. Die kommen auf der untersten Ebene vom Prozessor. Daher ändern die sich auch von Prozessor zu Prozessor.

Damit das Prozessor-unabhängig ist und auch damit es von der Syntax einfacher wird, legt die Arduino IDE da ihre eigenen Nummern drüber. Das vereinfacht das Arbeiten, aber man erkauft sich das mit einem Geschwindigkeitsverlust, da das Umrechnen recht aufwendig ist. Für viele Anwendungen ist das aber egal.

Wenn du Code siehst der die Pins direkt mit PORTB o.ä. anspricht wurde der entweder nicht für den Arduino geschrieben (obwohl der natürlich auch da läuft) oder er wurde auf Geschwindigkeit optimiert.

aber man erkauft sich das mit einem Geschwindigkeitsverlust,

Eigentlich nicht.
Aber....
Der Geschwindigkeitsverlust kommt daher, dass Arduino meint, bei jedem digitaWrite() usw. die evtl. betreffenden PWMs aus zu machen, von analog auf Digital umzuschalten, und sonstigen Kram zu erledigen.

Das auch. Und dafür geht am weit mehr Zeit drauf. Aber er rechnet auch was um die Pins umzusetzen. Das wird zwar mit Makros gemacht aber es muss trotzdem was zur Laufzeit gerechnet werden:

#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )
#define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) )

Ja
digitalWriteFast() und seine Brüder sind erheblich fixer.
Aber was mir nicht behagt, und an manchen Stellen leider nicht sinnvoll ist, ist, dass es die Pin Nummern konstant erwartet.

Wenn man sich das Rechnen zur Laufzeit ersparen will, muss die Pin Nummer zur Compile-Zeit bekannt sein. Dann kann man den Kram durch den Präprozessor ausrechnen lassen. Das geht halt nicht wenn man über ein Array drauf zugreift oder den Pin als Parameter an eine Funktion übergibt. Geht nichts anders. Irgendwo muss man Abstriche machen wenn man den Komfort will.