Show Posts
Pages: 1 2 3 [4] 5 6 ... 163
46  International / Deutsch / Re: AttachInterrupt Frage on: April 09, 2014, 12:42:09 pm
ich habe ein Arduino Mega 2560 und dieser erhält jede Sekunde eine kurze Eingangsspannung am Port 3, was über

attachInterrupt(1, blink, RISING);

einen Interrupt auslösen soll, welcher eine LED zwischen an und aus umschaltet.
Der Quelltext ist ähnlich dem auf der Arduino-Seite aufgebaut:
http://arduino.cc/en/Reference/attachInterrupt

Und wie ist die Schaltung aufgebaut?
Schaltplan?

Kann es sein, dass Du einen PullUp/PullDown-Widerstand in der Schaltung "vergessen" hast?

So dass Dein Signal am Eingang 3 gar nicht vernünftig auf 0 Volt runtergezogen wird, zwischen den Ereignissen "jede Sekunde eine kurze Eingangsspannung"?
47  International / Deutsch / Re: Upload-Probleme on: April 09, 2014, 08:52:10 am
Verflixt. Und nu?

Wenn Dein Compiler Dir die drei Fragezeichen im Code versteckt:
- Fehlerbereinigte MEGA-Bootloader sollen existieren (könnte man aufspielen)
- ISP-Programmer existieren (könnte man zum Uploaden verwenden)

Oder den Quellcode des Sketches wieder so ändern, dass der Compiler den problematischen Code nicht mehr erzeugt.
48  International / Deutsch / Re: Problem mit Variablen in CAN Nachricht on: April 09, 2014, 08:19:13 am
Ein Serial.print(si_bat_v) gibt mir die 550 aus, offenbar ist das jedoch nicht das Gleiche wie die 550 im Code oben.

Warum bastelst Du überhaupt erst eine Variable zusammen, auf die dann wieder ein Makro angewendet wird?
Warum sendest Du nicht gleich die einzelnen Bytes wieder raus:

Code:
unsigned char stmp3[8] = {rxBuf[1],rxBuf[0],highByte(200),lowByte(200),0,0,0,0};
49  International / Deutsch / Re: Lautstärke in Dezibel messen on: April 09, 2014, 07:57:58 am
Der von Dir verlinkte "Soundsensor" kann an einem Arduino allenfalls als Klatschschalter verwendet werden, um ein lautes Klatschen direkt neben dem Sensor zu erkennen. Oder einen Presslufthammer neben dem Sensor am Geräusch zu erkennen.

Das Ding liefert kein vernüftig skalierendes Ausgangssignal.

Schallpegel mißt man üblicherweise mit einem Schallpegelmessgerät. In den Arduino bekommst Du die Daten eines geeigneten Messgeräts z.B. über eine serielle Schnittstelle. Das hier ist ein Multimeter mit RS232-Schnittstelle und Messmöglichkeit für Schallpegel:
http://www.amazon.de/PCE-222-Feuchtemessger%C3%A4t-Temperaturmessger%C3%A4t-Schallmessger%C3%A4t-orientierenden/dp/B002Q98XKC/

Da würde man noch einen seriellen TTL-RS232 Adapter benötigen, um die RS232-Pegel auf TTL-Pegel für einen Arduino umzusetzen und könnte die Messung mit einem einfachen Sketch umsetzen, bei dem die Daten seriell vom Messgerät empfangen werden.

Je nachdem, wie hoch die Anforderungen an die Schallmessung sind, hat die Preisskala für Schallpegelmessgeräte ein nach oben offenes Ende.
50  International / Deutsch / Re: Upload-Probleme on: April 09, 2014, 07:47:38 am
ABER: es funktioniert dann, wenn ich die Zeile

Serial.begin(115200); auskommentiere!
Dann sind die beiden LED`s auch aus nach dem upolad.
Das wundert mich nun doch schwer, denn ich hab das seit Monaten drin..?

Hast Du vielleicht noch eine veraltete Arduino-Softwareversion v.1.0.1 im Einsatz?
Dann würde sich ein Update auf v.1.0.5 anbieten.
51  International / Deutsch / Re: Upload-Probleme on: April 09, 2014, 07:19:19 am
-am Programm kann es nicht liegen, denn auf den Uno kann ichs ganz problemlos aufspielen.

Ich schätze mal, Dein MEGA hat den "Schlechte-Grammatik-Bug" und Du pflegst einen Programmierstil, bei dem Du irgendwo in Deinem Quelltext drei (oder noch mehr) Ausrufungszeichen nacheinander stehen hast.

Suche die Stelle und bemühe Dich mehr um korrekte Zeichensetzung, also keine dreifachen Ausrufungszeichen nacheinander, sondern korrekterweise ein Satzzeichen und fertig. Na gut, 2 Ausrufungszeichen nacheinander akzeptiert der MEGA auch noch, aber 3 Ausrufungszeichen nacheinander sind vielen MEGA-Bootloadern einfach zu viel.
52  International / Deutsch / Re: Bootloader für ATMega328p-AU (SMD) brennen on: April 09, 2014, 07:10:07 am
der 100nF-Keramik-Kondensator möglichst nahe am Chip (decoupling, weiss leider nicht, wie das auf Deutsch heisst)

www.rn-wissen.de/index.php/Abblockkondensator
53  International / Deutsch / Re: Arduino uno alle Pins von 0-13 als PWM nutzbar? on: April 09, 2014, 07:06:58 am
Welche Möglichkeiten hab ich, alle Pins beim arduino uno R3 ganz normal mit PWM zu verwenden?

Ich kenne nur:
Hardware-PWM ==> Die Hardware wird so eingestellt, dass sie selbst PWM taktet
Software-PWM ==> Dein Programm taktet Pins auf HIGH und LOW

Hardware-PWM kannst Du an den Hardware-PWM Pins machen. Und nur an diesen.

An allen anderen Pins kannst Du nur Software-PWM machen: Also per Software gesteuert durch das Programm die Pins im gewünschten Takt HIGH und LOW setzen.
54  International / Deutsch / Re: Frage zu kleinem Countdown (ohne Time.h) on: April 09, 2014, 06:56:17 am
Das mit der Beschallung des Tasters wusste ich bis jetzt noch nicht.

Na ja, eigentlich Beschaltung und nicht Beschallung.
Jedenfalls müßtest Du mit Deinen Programmen eine Nummer kleiner anfangen!

Man kann sinnvollerweise nicht den dritten Schritt (drei Schalter auswerten) machen, wenn man den ersten Schritt (einen Schalter auswerten) nicht fehlerfrei hinbekommt. Das kann nur in völliger Konfusion und garantierter Fehlfunktion enden.

Anbei mal ein Beispielcode zur Verdeutlichung der Trennung in Eingabe-Verarbeitung-Ausgabe.
Beachte bitte, was in der loop-Funktion drinsteht!
Vielleicht kannst Du Dir für Deine Programme was abgucken.

Zum Verständnis des Codes schaust Du Dir am besten auch mal an, was "static" im Zusammenhang mit einer deklarierten Variablen in einer Funktion bedeutet.

Die Auswertung der Schalter erfolgt so: Reagiert wird immer auf das Drücken eines Schalters, d.h. wenn der vorherige Schalterzustand "nicht gedrückt" war und der Schalter in den Zustand "gedrückt" übergeht. Damit das "Prellen" mechanischer Taster http://de.wikipedia.org/wiki/Prellen nicht zu Fehlfunktionen (Mehrfachzählungen) führt, ist in der loop-Funktion ein kurzes Delay von 5 Millisekunden enthalten, so dass ein Tasterzustand nicht öfter als alle 5 Millisekunden ausgewertet wird.

Code:
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

/* in der nachfolgenden Zeile wird festgelegt, ob die Schalter
   mit PullUp oder PullDown Widerständen beschaltet sind.
   INPUT_PULLUP aktiviert die internen PullUp-Widerstände des Atmega
   INPUT setzt voraus, dass die Schalter mit externen PullDown-Widerständen beschaltet sind
*/
#define INPUTMODE INPUT_PULLUP  // INPUT_PULLUP oder INPUT setzen
const int minuten_switch = 7;
const int sekunden_switch = 6;
const int start_switch = 8;

int timerLaufzeit = 0;
boolean timerGestartet=false;

void eingabe()
{
  static boolean oldMinSwitch=false; // Statische Variable für letzten Schalterzustand
  static boolean oldSecSwitch=false; // Statische Variable für letzten Schalterzustand
  static boolean oldStartSwitch=false; // Statische Variable für letzten Schalterzustand
  boolean MinSwitch= digitalRead(minuten_switch); // aktueller Schalterzustand
  boolean SecSwitch= digitalRead(sekunden_switch); // aktueller Schalterzustand
  boolean StartSwitch= digitalRead(start_switch); // aktueller Schalterzustand
  if (INPUTMODE==INPUT_PULLUP) // Vertauschte Schaltlogik bei PullUp
  {
    MinSwitch=!MinSwitch; // ausgelesenen Zustand vertauschen wg. PullUp
    SecSwitch=!SecSwitch; // ausgelesenen Zustand vertauschen wg. PullUp
    StartSwitch=!StartSwitch; // ausgelesenen Zustand vertauschen wg. PullUp
  }
  if (MinSwitch==HIGH && oldMinSwitch==LOW) timerLaufzeit+=60; // Zustandsänderung gedrückt?
  oldMinSwitch=MinSwitch; // aktueller Schalterzustand wird zum alten Schalterzustand
  if (SecSwitch==HIGH && oldSecSwitch==LOW) timerLaufzeit++; // Zustandsänderung gedrückt?
  oldSecSwitch=SecSwitch; // aktueller Schalterzustand wird zum alten Schalterzustand
  if (StartSwitch==HIGH && oldStartSwitch==LOW) timerGestartet=true; // Zustandsänderung gedrückt?
  oldStartSwitch=StartSwitch; // aktueller Schalterzustand wird zum alten Schalterzustand
}

void verarbeitung()
{
  static unsigned long lastMillis=0; // statischer Zähler für letzten Stand des millis() Timers
  static unsigned long timedMillis=0;// statischer Zähler für Millisekunden beim Herunterzählen
  unsigned long nowMillis=millis();  // aktueller Stand des millis() Timers
  if (timerGestartet && timerLaufzeit>0) // Zähler läuft und Restzeit vorhanden
  {
    timedMillis+= nowMillis-lastMillis; // Millisekunden hochzählen
    if (timedMillis>=1000)  // Nach jeweils 1000 Millisekunden
    {
      timedMillis=0;  // Millisekundenzähler auf 0 setzen
      timerLaufzeit--; // Eine Sekunde Laufzeit abziehen
      if (timerLaufzeit==0) timerGestartet=false; // Timer anhalten
    }
  }
  lastMillis=nowMillis; // Zählerstand merken, bei dem diese Funktion zuletzt lief
}

void ausgabe()
{
  int minuten=timerLaufzeit/60; // Ganzzahldivision durch 60
  int sekunden=timerLaufzeit%60;// Modulo-Divisionsrecht bei geteilt durch 60
  lcd.setCursor(0, 1);
  if (minuten < 10) lcd.print("0");
  lcd.print(minuten);
  lcd.print(":");
  if (sekunden < 10) lcd.print("0");
  lcd.print(sekunden);
}


void setup() {
  lcd.begin(16, 2);
  pinMode(minuten_switch,INPUTMODE);
  pinMode(sekunden_switch ,INPUTMODE);
  pinMode(start_switch, INPUTMODE);
  lcd.print("TIMER:");
}

void loop()
{
  eingabe();
  verarbeitung();
  ausgabe();
  delay(5); // Kleines Delay zum softwaremäßigen Entprellen der mechanischen Schalter
}

Der Code ist so wie er dasteht für eine Schaltung OHNE PULLDOWN-Widerstände, stattdessen werden die internen PullUps aktiviert. Im Quellcode kann man leicht zwischen INPUT_PULLUP (interne PullUps) oder INPUT (externe PullDowns) wechseln, je nach vorhandener Schaltung.

Bei den internen Variablen verwende ich nicht Minuten und Sekunden getrennt, sondern eine Variable "timerLaufzeit", in der die Timerlaufzeit in Sekunden drinsteht. Wenn man die verschiedenen Buttons drückt, wird diese Variable entweder um 60 Sekunden hochgesetzt (plus 1 Minute) oder um 1 Sekunde, dadurch vermeidet man Umstände beim Minutenwechsel.

Der aktuelle Zählerstand in Minuten und Sekunden wird erst bei der Ausgabe mit Modulo-Arithmetik ausgerechnet, und dann auf dem LCD ausgegeben.

Nur mal so als Demo, wie ein modulares und leicht wartbares Programm aussehen könnte.
55  International / Deutsch / Re: Bootloader für ATMega328p-AU (SMD) brennen on: April 09, 2014, 04:59:42 am
Es kann ja auch sein, dass ich den Chip beim Löten einfach gekillt habe. Ich wollte aber vorher einfach sichergehen, dass ich nicht irgend nen dummen Fehler gemacht habe.

Als einfachen Test kannst Du bei jeder Schaltung immer den Test der Stromaufnahme machen.
Ganz simpel mit einem Multimeter mal ausmessen, wieviel mA Strom die Schaltung zieht.

Ein nackter Atmega328 an 5V @16 MHz sollte meines Erachtens nach irgendwas bei ca. 17 mA ziehen.

Wieviel mA zieht Deine Schaltung?
56  International / Deutsch / Re: Welcome to nginx! on: April 09, 2014, 04:48:35 am
was ist das??
...
Thank you for using nginx.

Der Webserver liefert nach einem aufgetretenen Fehler eine Standardseite aus.
Z.B. während der Server überlastet ist (keine Verbindung zur Datenbank oder sonstwas).
57  International / Deutsch / Re: Frage zu kleinem Countdown (ohne Time.h) on: April 09, 2014, 04:43:53 am
...passiert wieder nichts. Das Programm zählt einfach über die 60 hinaus.

Wenn Du ein Programm machen möchtest, das übersichtlich ist, dann solltest Du Dich darum bemühen, keinen Spaghetticode für irgendwelche Daten zu schreiben, sondern dann solltest Du:
a) der Aufgabenstellung angemessene Datentypen und Variablen verwenden
b) dem Programm eine angemessene Struktur geben

In Sachen Programmstruktur hat sich die Aufteilung nach dem EVA-Prinzip sehr bewährt:
E - Eingabe (mit Einzeltasten, Tastenfeld, Potentiometer, Drehgeber, IR-Fernbedienung etc.)
V - Verarbeitung (Eingabedaten so verarbeiten, dass sie ausgegeben werden können)
A - Ausgabe (Daten ausgeben über Status-LEDs, Relais, Funk, SD-Karte, Serial, Text-LCD, Grafik-LCD)

Durch die modulare Trennung  Eingabe/Verarbeitung/Ausgabe wird das Programm auch leicht wartbar: Wenn Du beispielsweise die Zeiteinstellung ("Eingabe") umstellen möchtest von einer Tastenbedienung und Du möchtest lieber ein drehbares Potentiometer oder eine IR-Fernbedienung zur Einstellung der Zeit verwenden, dann braucht später nur die Funktion für die "Eingabe" geändert werden.

Und wenn Du statt einer Ausgabe auf LCD-Display später ein Relais schalten möchtest oder ein Funksignal nach Timerablauf gesendet werden soll, brauchst Du nur die Funktion "Ausgabe" ändern.

So werden Programme nicht nur übersichtlicher, sondern auch leichter wartbar.

Bist Du Dir denn jetzt schaltungstechnisch darüber im klaren, wie Du Deine drei Taster angeschlossen hast?
So wie im Button-Tutorial http://arduino.cc/en/tutorial/button mit PullDown-Widerstand?
Oder ohne Widerstand nur den Taster beschaltet?

An einem Microcontroller sind "offene" Eingänge stets "floatend" und liefern keinen definierten Pegel zurück. Deshalb MÜSSEN Taster nicht nur im gedrückten Zustand an einem bestimmten Pegel anliegen, sondern auch im offenen Zustand. Falls Du keinen externen Pull-Widerstand mit jedem Taster verwenden möchtest, kannst Du den internen Pull-Widerstand über den pinMode "INPUT_PULLUP" aktivieren, womit dann ein offener Schalter "HIGH" liefert und ein geschlossener "LOW".

Ist das die Beschaltung (nur Taster, kein externer PullWiderstand am Taster), die Du verwenden möchtest?
58  International / Deutsch / Re: Upload Probleme; echt frustrierend; alles vesucht? on: April 08, 2014, 01:46:00 am
Was kann ich noch tun?

Du könntest ein anderes / kürzeres / qualitativ hochwertigeres USB-Kabel verwenden.

Bzw. wenn das Kabel am Front-USB des PCs angeschlossen Probleme macht, lieber einen USB-Anschluss von der Rückseite des PCs zum Anschließen verwenden.
59  International / Deutsch / Re: NTC Temperatursensor Fehler on: April 07, 2014, 02:26:43 pm
sensorwert ist ein float, die Rechnung fängt also nicht soo schlecht an.

Das ist das schöne an globalen Variablen. Man hat eventuell Erfolgserlebnisse beim Suchen.
Großes Lob an Thilo, dass er es nicht als unwichtig weggelassen hat.

Stimmt, da hast Du recht und mein Beitrag in Reply #3 ist nicht weiter zu beachten.

Allerdings würde ich auch hier:
Code:
int SensorPin = 0; // Für den Senoreingang wird Analog 0 gewählt
eher A0 einsetzen:
Code:
int SensorPin = A0; // Für den Senoreingang wird Analog 0 gewählt

Wenn ich micht nicht täusche, funktioniert "0" zusammen mit analogRead zwar auf manchen Boards und mit manchen Arduino-Softwareversionen, aber nicht mit allen Boards und allen Arduino-Softwareversionen.
60  International / Deutsch / Re: NTC Temperatursensor Fehler on: April 07, 2014, 02:15:38 pm
Wäre nett wenn ihr mir helfen könntet, danke im Voraus smiley

Wenn Du hier eine Gleitkommarechnung machen möchtest:
Code:
u2 = (sensorWert * 5)/1024; // Spannung am Sensor wird berechnet
dann würde ich an der Stelle auch eine Gleitkommarechnung machen und keine Integer-Division:
Code:
u2 = (sensorWert * 5)/1024.0; // Spannung am Sensor wird berechnet
Sonst hast Du nämlich eine Rechnung, die nur 0,1,2,3 oder 4 als Ergebnis einer Division mit ganzen Zahlen liefert.
Pages: 1 2 3 [4] 5 6 ... 163