Counter und Schrittmotor

Lässt sich die Funktion des Sketch nicht mit einem Switch to Ground an pin4 testen? Oder muss ich den Switch entprellen? Bei meinem Versuch het es nach ein paar ordentlichen Takten wieder eine Eigendynamik bekommen und läuft einfach weiter. ich mach mich derweil auf die Suche nach einem DS3231. Mein Taktgeber hat eh den Geist auf gegeben.

Draht:
Oder muss ich den Switch entprellen?

Ja.

Draht:
ich mach mich derweil auf die Suche nach einem DS3231.

Da soll es Exemplare geben mit Batterie und Ladevorrichtung, was zu Problemen führen kann. Ich habe das hier gelesen, woran man die erkennen kann, habe ich aber nicht abgespeichert. Dubiose Quellen würde ich daher besser meiden.

Draht:
Mein Taktgeber hat eh den Geist auf gegeben.

Friede seinem Schrott :slight_smile:

LIR2030 ist der Akku, CR2030 die Batterie.

Gruß Tommy

agmue:
Ja.

Hab ich befürchtet. Das lass ich jetzt aber mal und vertraue dem Sketch. Sowie ich gesehen habe macht er seine Sache gut! :wink:

agmue:
Friede seinem Schrott :slight_smile:

Es war nur das Uhrwerk einer Quarzuhr.

agmue:
Ja.
Da soll es Exemplare geben mit Batterie und Ladevorrichtung, was zu Problemen führen kann. Ich habe das hier gelesen, woran man die erkennen kann, habe ich aber nicht abgespeichert. Dubiose Quellen würde ich daher besser meiden.

Wahrscheinlich so etwas: MikroShop

Könnte man ja aber auch ohne Batterie oder Akku betreiben, also mit einer eigenen Spannungsversorgung?

Für den Betrieb mit einer Batterie (also nicht mit Akku) sollte die Ladeschaltung außer Gefecht gesetzt werden.

Draht:
Wahrscheinlich so etwas: MikroShop

Ja.

Draht:
Könnte man ja aber auch ohne Batterie oder Akku betreiben, also mit einer eigenen Spannungsversorgung?

Batterie oder Akku erhalten die Zeit bei Stromausfall, die Uhr läuft also weiter. Daher besser mit Batterie oder Akku.

Programm zum Stellen der Uhr und zur Zeitanzeige (Quelle):

#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}
void setup()
{
  Wire.begin();
  Serial.begin(115200);
  // set the initial time here:
  // Wednesday November 26, 2014 and 9:42 pm and 30 seconds
  // DS3231 seconds, minutes, hours, day, date, month, year
  // setDS3231time(30,42,21,4,26,11,14);
  // So Mo Di Mi Do Fr Sa
  //  1  2  3  4  5  6  7
  // setDS3231time(00,46,19,2,23,10,17);
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}
void displayTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  // send it to the serial monitor
  Serial.print(hour, DEC);
  // convert the byte variable to a decimal number when displayed
  Serial.print(":");
  if (minute<10)
  {
    Serial.print("0");
  }
  Serial.print(minute, DEC);
  Serial.print(":");
  if (second<10)
  {
    Serial.print("0");
  }
  Serial.print(second, DEC);
  Serial.print(" ");
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/");
  Serial.print(year, DEC);
  Serial.print(" Day of week: ");
  switch(dayOfWeek){
  case 1:
    Serial.println("Sunday");
    break;
  case 2:
    Serial.println("Monday");
    break;
  case 3:
    Serial.println("Tuesday");
    break;
  case 4:
    Serial.println("Wednesday");
    break;
  case 5:
    Serial.println("Thursday");
    break;
  case 6:
    Serial.println("Friday");
    break;
  case 7:
    Serial.println("Saturday");
    break;
  }
}
void loop()
{
  displayTime(); // display the real-time clock data on the Serial Monitor,
  delay(1000); // every second
}

Stellen der Uhr:

  • Im Programm die Zeile setDS3231time(00,59,9,2,5,10,20); für 5.10.20 9:59:00 aktivieren. Die Zeit sollte ca. zwei Minuten in der Zukunft liegen, um genügend Zeit zum Kompilieren und den Upload zu haben.
  • Kompilieren und Upload.
  • Nach dem Upload Reset-Taste drücken und halten.
  • Ca. zwei Sekunden (für den Bootloader) vor der einzustellenden Zeit den Reset-Taster loslassen.
  • Im Programm Zeile zum Stellen der Zeit kommentieren // setDS3231time …
  • Kompilieren und Upload.

agmue:
Ja.
Batterie oder Akku erhalten die Zeit bei Stromausfall, die Uhr läuft also weiter. Daher besser mit Batterie oder Akku.

Ok, danke dann bestelle ich mal 2 Stück von diesen DS3231 und meld mich dann wieder :wink:

Nun hab ich doch noch eine Frage inzwischen: Ich habe mir für Testzwecke einen provisorischen Taktgeber erstellt. Dies mit einem externen Blink Sketch welcher auf einem 2. Atmega 328 läuft.
Das läuft soweit gut, nur bei den 30 Grad Winkeln überspringt das Sketch jeweils immer ein paar Schritte. (siehe Abb. unten serieller Monitor)

2:19:00.300 -> Takte: 0
02:19:01.803 -> Minuten-Winkel: 210
02:19:04.258 -> Takte: 1
02:19:04.295 -> Minuten-Winkel: 240
02:19:08.223 -> Takte: 2
02:19:12.211 -> Takte: 3
02:19:16.158 -> Takte: 4
02:19:20.136 -> Takte: 5
02:19:24.097 -> Takte: 6
02:19:28.079 -> Takte: 7
02:19:32.061 -> Takte: 8
02:19:35.999 -> Takte: 9
02:19:39.977 -> Takte: 0
02:19:41.471 -> Minuten-Winkel: 270
02:19:43.958 -> Takte: 1
02:19:43.992 -> Minuten-Winkel: 300
02:19:47.937 -> Takte: 2
02:19:51.876 -> Takte: 3

Hier noch das Taktgeber-Sketch dazu:

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, LOW);   // turn the LED on (HIGH is the voltage level)
  delay(20);                       // wait for a second
  digitalWrite(13, HIGH);    // turn the LED off by making the voltage LOW
  delay(200);                       // wait for a second
}

Ich hatte mit 500 ms LOW und 500 ms HIGH probiert, weil das ein symmetrisches Signal von 1 Sekunde ergibt.

Einem robusten Programm sollte das egal sein, aber … ::slight_smile:

Ok, aus irgend einem Grund hält sich der 'Taktgeber? nicht an die angegebenen Zeiten. Ich muss erst herausfinden, was da schief läuft.

// wait for a second

Daran hält sich der Taktgeber sicher nicht.

Grundregel:
Falsche Kommentare sind schlechter als gar keine.

All right jetzt geht es. Habe einen neuen Atmega 328 genommen und mit mit diesem Sketch versehen:

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, LOW);   // turn the LED on (HIGH is the voltage level)
  delay(500);                       // wait for a second
  digitalWrite(13, HIGH);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

michael_x:
Daran hält sich der Taktgeber sicher nicht.
Grundregel:
Falsche Kommentare sind schlechter als gar keine.

In Form von:

digitalWrite(13, HIGH);    
  delay(1000);

schon.

(deleted)

Oh, vielen dank Peter-CAD-HST. und bleib auch gesund :wink:

@Peter-CAD-HST auch die Helfer sollten Code in Codetags setzen - immer ein gutes Vorbild sein :wink:

Für den einfachen Test-Taktgeber reicht doch die simple delay-Variante vollkommen aus oder?
Wenn es denn tatsächlich delay-los sein soll - weshalb auch immer - kannst Du auch die MoToTimebase aus den MobaTools benutzen. Da ist die Lanzeitgenauigkeit so gut,wie es der Quarz/Resonator des Controllers eben hergibt ( Programmlaufzeiten mitteln sich aus ).

MicroBahner:
@Peter-CAD-HST auch die Helfer sollten Code in Codetags setzen - immer ein gutes Vorbild sein :wink:

Für den einfachen Test-Taktgeber reicht doch die simple delay-Variante vollkommen aus oder?

Ja, das reicht zum Testen mit dem provisorischen Taktgeber. Delaylos muss ja nur der Counter-Schrittmotor-Sketch sein.