Show Posts
Pages: 1 2 [3] 4 5 ... 14
31  International / Deutsch / Re: PulseIn im Fahrtenregler on: December 20, 2012, 11:35:14 am
Wer kann helfen, was macht PulseIn?
Hallo ArduStemmi,

pulseIn() wartet in einer Schleife ganz brutal, bis sich der Zustand des Pins auf LOW/HIGH ändert und dann wieder bis sich der Zustand des Pins zum anderen Pegel HIGH/LOW ändert. So richtig fies in einer Dauerschleife. Na ja, eigentlich sind es sogar fast 3 fiese Schleifen.
Siehe Code:
Code:
/* Measures the length (in microseconds) of a pulse on the pin; state is HIGH
 * or LOW, the type of pulse to measure.  Works on pulses from 2-3 microseconds
 * to 3 minutes in length, but must be called at least a few dozen microseconds
 * before the start of the pulse. */
unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout)
{
// cache the port and bit of the pin in order to speed up the
// pulse width measuring loop and achieve finer resolution.  calling
// digitalRead() instead yields much coarser resolution.
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
uint8_t stateMask = (state ? bit : 0);
unsigned long width = 0; // keep initialization out of time critical area

// convert the timeout from microseconds to a number of times through
// the initial loop; it takes 16 clock cycles per iteration.
unsigned long numloops = 0;
unsigned long maxloops = microsecondsToClockCycles(timeout) / 16;

// wait for any previous pulse to end
while ((*portInputRegister(port) & bit) == stateMask)
if (numloops++ == maxloops)
return 0;

// wait for the pulse to start
while ((*portInputRegister(port) & bit) != stateMask)
if (numloops++ == maxloops)
return 0;

// wait for the pulse to stop
while ((*portInputRegister(port) & bit) == stateMask) {
if (numloops++ == maxloops)
return 0;
width++;
}

// convert the reading to microseconds. The loop has been determined
// to be 20 clock cycles long and have about 16 clocks between the edge
// and the start of the loop. There will be some error introduced by
// the interrupt handlers.
return clockCyclesToMicroseconds(width * 21 + 16);
}

Dazwischen passiert dann sonst nichts mehr, wenn der restliche Code nicht mit Interrupts arbeitet (vollständig und zuverlässig!). Kann deine PWM-Signal-Erzeugung es vertragen, dass da unter Umständen für etliche Millisekunden nichts passiert. Bist du mit deiner Interrupt-Programmierung ganz konsequent?

Du weißt ja schon, dass der Controller ein PWM-Signal rein hardwaremäßig erzeugen kann, wenn man den Counter/Timer zuvor mit den passenden Werten gefüttert hat? Dann kann ein noch so stures Programm ihn nicht dabei stören (mal von Extremfällen abgesehen)!

Ich sehe sonst nichts, wie pulseIn() deine Interrupts stören könnte.

Gruß
Wolfgang
32  International / Deutsch / Re: Arduino IDE für eigene Boards on: November 17, 2012, 09:55:07 am

Hmmm.... OK, der Bootloader ist weg, aber die Fuses haben doch noch immer die Einstiegsadresse vom Bootloader. Und die liegt doch im oberen Speicherbereich.
Wie startet dann der AVR nach einem Reset wieder mit dem Anwenderprogramm??
Ob Bootloader oder Start von 0x0000h wird doch durch das BOOTRST Fusebit gesteuert. Und wenn das nicht geändert wird, dann will doch der AVR wieder an der Startadrese des Bootloaders starten und da ist dann keiner mehr.


In der Praxis dürfte es aber trotz eigentlich falsch gesetzten BOOTRST Fuse oft funktionieren:

Wenn die BOOTRST Fuse programmiert ist, springt der Controller bei einem Reset an den Anfang des Bootloader-Bereichs (statt auf die Adresse 0). Dort enthalten bei einem fehlendem Bootloader bis zum Ende des Flashs alle Speicherzellen üblicherweise den Wert FF (hex) / 11111111 (bin). Immer vorausgesetzt, dass das eigentliche Programm nicht so groß ist, dass es schon in den Bootloader-Bereich hineinreicht.
Im gelöschten/noch nicht programmierten Flash-Speicher sind alle Bits auf 1 gesetzt!
FF FF ist für den Controller ein ungültiger Befehlscode, der nichts tut, aber auch nicht zur Exception oder zu ähnlichem führt. Nach dem "Nichtstun" wird der Program Counter erhöht und das nächste FF FF tut ebenfalls wieder nichts. Und irgendwann kommen wir am Ende des Adressbereichs an.

Und jetzt wird  wieder alles gut! Der Program Counter wird beim Überlauf als nächstes auf Adresse 0 gesetzt und dort sollte in der Interrupt-Vektor-Tabelle hoffentlich der Sprungbefehl zum eigentlichen Beginn des Programms stehen, der sonst bei einem Reset direkt ausgeführt würde.

Aber die feine Art ist das auf keinen Fall!

Gruß
Wolfgang


33  International / Deutsch / Re: ATMega 328 Brennen on: September 19, 2012, 03:36:33 am
Hallo melmann,
wie du siehst, wäre es wahrscheinlich sinnvoll, die 15,95€ für einen Programmer locker zu machen. Das macht vieles einfacher, gerade wenn du nicht die Standard Arduino-Boards, sondern einen Selbstbau-Barebone verwenden willst. Und du kannst dich beim Lernen auf die wesentlichen Dinge konzentrieren und muss nicht jedesmal beim Programmieren des Controllers mit einen zweiten Board "rumhampeln" smiley-wink

Am Anfang meiner "Arduino-Karriere" hat man mir hier im Forum den Tipp gegeben, mir einen externen Programmer (ist zwar ein AVRISP MK II und nicht der mySmartUSB light) zuzulegen und ich habe das nie bereut.

Übrigens, ich bekomme keine Provision für verkaufte Programmer und ich denke, alle anderen die hier einen externen Programmer empfehlen, auch nicht. smiley-wink

Schönen Gruß und viel Erfolg bei deinem Projekt
Wolfgang
34  Community / Website and Forum / Re: mit timer interrupt auslösen on: August 08, 2012, 01:28:27 pm
Hallo e-moler,

du solltest deine Frage im deutschen Teil des Forums stellen. Dort wirst du sicherlich eine Antwort auf deine Fragen bekommen. Die Leute dort sind nett und garnicht "fies".

Hier wird man dir nicht helfen können, weil die meisten hier nicht deutsch sprechen und du deine Fragen in einem Teil des Forums gestellt hast, dass sich mit dem Forum selbst, dem Server, der Web-Site, usw. befasst. Deshalb auch die Frage von PaulS, was deine Frage damit zu tun hat.

Also, trau dich smiley-wink

Gruß
Wolfgang

Short summary for the English speaking forum members: I gave e-moler the advice to better post his question in the general German part of the forum.


35  International / Deutsch / Re: Anfänger Frage: #define on: July 31, 2012, 04:50:36 am
"Das mit dem Semikolon" könnte man auch so machen, dass
#define LEDPIN_PINMODE             pinMode (13, OUTPUT);pinMode (30, OUTPUT)    // Pin 60 (PC7) (ohne Semikolon am Ende)

später als

  LEDPIN_PINMODE;  // sieht schon fast wie c aus

verwendet wird.
( Ein Semikolon zu viel schadet hier übrigens nicht, und ist sytaktisch erlaubt )

Wobei zu bemerken wäre, dass im Sourcecode (Datei MultiWii_2_1.ino) in der Funktion setup() LEDPIN_PINMODE tatsächlich mit einem abschließenden Semikolon verwendet wird (zusätzlich zu dem Semikolon im #define in def.h) und somit ein überflüssiges Semikolon aus dem Präprozessor herauskommt.
Wie schon von michael_x gesagt ist ein einzelnes Semikolon syntaktisch zulässig (leere Anweisung) und der C/C++-Compiler wird es hoffentlich wegoptimieren.

Nichtsdestotrotz ist es für jemand, der genau hinschaut verwirrend und man sollte meiner Meinung nach entweder in MultiWii_2_1.ino das Semikolon hinter LEDPIN_PINMODE weglassen oder besser in def.h das Semikolon weglassen und stattdessen in MultiWii_2_1.ino das Semikolon hinter LEDPIN_PINMODE setzen (sieht irgendwie natürlicher aus).
36  International / Deutsch / Re: Timer / Counter on: July 30, 2012, 10:41:06 am
Hallo Madvision,
schau mal hier, wenn  du genaueres über Timer und Counter wissen willst:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer
http://www.rn-wissen.de/index.php/Timer/Counter_%28Avr%29
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Uhr

Natürlich geht es auch ohne das ganze Wissen über Timer und Counter, wenn du den Vorschlag von mkl0815 befolgst.
Aber willst du nicht mehr wissen? mkl0815 weiß bestimmt auch mehr, als er dir hier verrät!  smiley-wink

Gruß
Wolfgang
37  International / Deutsch / Re: Fritiertes Silikon? on: July 30, 2012, 10:27:22 am
Hallo,
bei dieser Überschrift hatte ich ja schon mit dem schlimmsten gerechnet. smiley-wink War wohl im Englischen "fried silicon"?

engl.: silicon -> deutsch: Silizium
engl.: silicone -> deutsch: das Zeug u.a. für Brustimplantate
engl.: to fry -> deutsch: braten, brutzeln, frittieren

Ich konnte mir diese Anmerkung nicht verkneifen. Aber ich arbeite noch daran, das Bild aus meinem Kopf zu bekommen. Ist nicht bös' gemeint!
Vielleicht gibts ja trotz der Überschrift von anderen ein paar hilfreiche Tipps für die Fehlersuche smiley-wink


Gruß
Wolfgang

38  International / Deutsch / Re: Doofe Frage: String to Integer on: June 03, 2012, 03:51:51 am
Code:
char test[]="   12345";   // Ein Text mit einer Zahl drin
char test2[80] = "77";    // In Test2 könnten dynamisch noch längere Texte gespeichert werden.
int i = atoi(test);   //  i = 12345 Die Zahl selbst
i = atoi(test2);      // i = 77
Wenn ich das richtig verstanden habe, sucht arduinosfish eine Umwandlung eines Strings der Arduino-Stringklasse in einen Integer und nicht die Umwandlung eines char-Arrays in einen Integer. Daher nochmal mein vorheriger Verweis auf die toInt()-Methode der String-Klasse.

Wenn er natürlich die Strings ganz wegwirft, ist das char-Array sicherlich ressourcen-sparender, aber eine String-Klasse ist in der Anwendung (meistens) deutlich komfortabler (z.B. Strings mit "=" zuweisen, statt mit strcpy() kopieren, mit "+" oder "+=" zwei Strings verbinden, statt mit strcat(), mit "==" oder "!=" auf Gleichheit testen, statt mit strcmp(), mit "<" oder oder "<" alphabetisch vergleichen, usw.).

[Edit]: Entschuldigung, ich sehe gerade, dass sich der Beitrag von michael_x an harding und nicht an arduinofish gerichtet hat und für dessen Frage sicherlich hilfreich ist.

Schönen Tag noch.
Wolfgang
39  International / Deutsch / Re: char Frage on: June 02, 2012, 02:53:23 pm
In C/C++ ist keine direkte Zuweisung einer Zeichenkette (= char-Array) an ein anderes char-Array erlaubt.

Dazu kann man stattdessen
Code:
char Str1[15];
strcpy (Str1, "arduinoarduino");   // Vorsicht! Keiner und nichts überprüft die Größe des Ziels!!!
nehmen.

Und mit Strings der Klasse "String" funktioniert die Zuweisung mit dem Gleichheitszeichen, weil der Zuweisungsoperator "=' für diese Klasse entsprechend überladen ist.
40  International / Deutsch / Re: Doofe Frage: String to Integer on: June 02, 2012, 08:50:35 am
Die Klasse "String" kennt die Methode "toInt". Liefert einen long-Wert zurück (auch wenn sie toInt heißt). Ruft intern atol() auf um sich auf den internen char-Puffer der String-Klasse zu stürzen.
Es lohnt sich, bei Bedarf mal in die Datei WString.h bzw. WString.cpp (irgendwo tief verborgen unterhalb des Arduino-Verzeichnisses) zu schauen. Da kann man so manches entdecken. smiley-wink

Edit: Das Thema hatten wir schon mal. Siehe auch Reply #9 in diesem Thread:
http://arduino.cc/forum/index.php/topic,95230.msg716081.html#msg716081
Da gibt's auch einen Programm-Schnipsel bezüglich der Anwendung von toInt().

Viel Erfolg
Wolfgang
41  International / Deutsch / Re: Mega 2560 + Strom sparen? on: May 31, 2012, 01:40:50 pm
Hat keiner ne Idee:)?
Doch, ich hätte da was anzubieten:

1. Die Fehlermeldungen resultieren daher, dass BODS und BODSE nicht in der controllertyp-spezifischen Header-Datei für den 2560 definiert sind. Es handelt sich dabei um Bit-Nummern in einem speziellen Register des Controllers.

2. Das dürfte daran liegen, dass die Betriebsart "BOD Disable" beim ATMega 2560 nicht unterstützt wird (wohl aber beim 328P). Jedenfalls habe ich im Datenbuch für den 2560 nichts dergleichen gefunden.

3. Folglich dürfte Uwe mit seiner Vermutung richtig liegen, dass die Library nicht für den 2560 geeignet ist, weil der "nicht alles kann", was der 328P kann.

4. Könnte man als Tüftler versuchen, die Library so anzupassen, dass die beim 2560 nicht unterstützten Betriebsarten aus dem Programmcode herausgeworfen werden (und den Rest behalten). Das erfordert aber ganz sicher auch ein fleißiges Studium des Datenbuchs, um den Code der Library überhaupt zu verstehen.

5. Frage ich mich, ob es auf einem ATMega-Board Sinn macht, den eigentlichen Controller auf möglichst geringe Stromaufnahme zu trimmen, während die sonstigen Chips auf dem Board (z.B. Controller für USB<->RS232-Wandlung, Power-LED, usw.) von alledem nichts wissen.

Gruß
Wolfgang


42  International / Deutsch / Re: Einsteigerfrage Example "Blink" on: May 17, 2012, 09:24:13 am
Also ich würde da nicht pauschal von "Linux" reden,
unter Ubuntu 12.04 (64-bit) blinkt dein Ursprungssketch nämlich munter vor sich hin ...
Diese Version ist ja auch ziemlich neu. Mag sein, dass hier irgendwie eine andere/neuere/schönere/bessere Version der Libraries/Compiler/binutils installiert wird. Darin liegt ja das Problem wohl generell.

Gruß
Wolfgang
43  International / Deutsch / Re: Einsteigerfrage Example "Blink" on: May 16, 2012, 12:29:47 pm
In Windows.

Könnte also daran liegen, dass mx55 SuSE-Linux verwendet und dieses Problem nur bei der Linux-Compiler/Library-Version (und da eventuell auch nur bei Arduino 1.0) auftritt.
44  International / Deutsch / Re: Einsteigerfrage Example "Blink" on: May 16, 2012, 12:21:55 pm
Ich meine, ich hätte mal gehört, dass es unter Linux Probleme mit der delay()-Funktion geben kann (abhängig von der Compiler-Version und der Version der Libraries). Allerdings treten die nicht auf, wenn zusätzlicher Code zum Blink-Sketch dazugepackt wird.

Siehe auch: http://www.shredzone.de/cilla/page/344/arduino-auf-fedora-15-einrichten.html

@Ketchup: Hast du den ersten Blink-Sketch unter Windows oder unter einem Linux ausprobiert?

Wolfgang
45  International / Deutsch / Re: Linux auf ATMega 1284p laufen lassen on: April 07, 2012, 07:27:54 am
Dafür kannst du im Sommer Ski bzw Snowboard fahren. Hat doch alles was für sich...
Geil, so eine Skihalle, nicht wahr? Ich denke immer an die Stromkosten, wenn ich an dem Ding bei 30 Grad im Schatten vorbeifahre. smiley-wink
Pages: 1 2 [3] 4 5 ... 14