Acties:
  • 0 Henk 'm!

  • jeronimus2212
  • Registratie: Februari 2025
  • Laatst online: 23-02 07:34
ik heb onderstaande code. hij werkt alleen lukt het me niet de uren en minuten te verstellen
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
 #include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include "RTClib.h"

// Definieer het aantal LED's en de pin waarop de LED-strip is aangesloten
#define LED_PIN     6
#define LED_COUNT   60

// Definieer de pinnen voor de schakelaars
#define SET_MINUTES_PIN 5  // Schakelaar om minuten in te stellen
#define INCREASE_PIN    3  // Schakelaar om uren/minuten te verhogen
#define SET_HOURS_PIN   4  // Schakelaar om uren in te stellen

// Initialiseer de LED-strip
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

// Initialiseer de DS3231 RTC
RTC_DS3231 rtc;

// Variabelen voor handmatige tijdinstelling
unsigned long manualTimeSetMillis = 0; // Tijdstip waarop de handmatige tijd is ingesteld
int manualHours = -1;
int manualMinutes = -1;
int manualSeconds = -1;

// Variabelen voor het instellen van uren en minuten
bool settingHours = false; // Geeft aan of we uren instellen
bool settingMinutes = false; // Geeft aan of we minuten instellen
unsigned long lastBlinkMillis = 0; // Tijdstip van de laatste knipperactie
bool blinkState = false; // Huidige knipperstatus (aan/uit)

void setup() {
  // Start de seriële communicatie voor debugging
  Serial.begin(9600);

  // Initialiseer de LED-strip
  strip.begin();
  strip.show(); // Zet alle LED's uit
  strip.setBrightness(5); // Stel de helderheid in (0-255)

  // Initialiseer de RTC
  if (!rtc.begin()) {
    Serial.println("Kon RTC niet vinden!");
    while (1);
  }

  // Als de RTC geen tijd heeft, stel dan de tijd handmatig in
  if (rtc.lostPower()) {
    Serial.println("RTC heeft geen stroom gehad, stel de tijd in!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

  // Stel de schakelaarpinnen in als invoer
  pinMode(SET_MINUTES_PIN, INPUT_PULLUP);
  pinMode(INCREASE_PIN, INPUT_PULLUP);
  pinMode(SET_HOURS_PIN, INPUT_PULLUP);

  // Instructies voor de seriële monitor
  Serial.println("Gebruik de schakelaars om uren/minuten in te stellen:");
  Serial.println("- Pin 5: Minuten instellen (knipperen)");
  Serial.println("- Pin 4: Uren instellen (knipperen)");
  Serial.println("- Pin 3: Verhoog uren/minuten");
}

void loop() {
  // Controleer of er invoer is op de seriële monitor
  if (Serial.available()) {
    String input = Serial.readStringUntil('\n');
    if (input.length() == 8 && input.charAt(2) == ':' && input.charAt(5) == ':') {
      manualHours = input.substring(0, 2).toInt();
      manualMinutes = input.substring(3, 5).toInt();
      manualSeconds = input.substring(6, 8).toInt();
      manualTimeSetMillis = millis(); // Sla het tijdstip van instellen op
      Serial.println("Tijd ingesteld op: " + input);
    } else {
      Serial.println("Ongeldige invoer. Gebruik het formaat HH:MM:SS.");
    }
  }

  // Controleer de schakelaars
  if (digitalRead(SET_MINUTES_PIN) == LOW) {
    settingMinutes = true;
    settingHours = false;
  } else if (digitalRead(SET_HOURS_PIN) == LOW) {
    settingHours = true;
    settingMinutes = false;
  } else {
    settingHours = false;
    settingMinutes = false;
  }

  // Verhoog uren of minuten als de verhoog-schakelaar is ingedrukt
  if (digitalRead(INCREASE_PIN) == LOW) {
    if (settingHours) {
      manualHours = (manualHours + 1) % 12; // Verhoog uren (modulo 12 voor 12-uursformaat)
      delay(200); // Debounce
    } else if (settingMinutes) {
      manualMinutes = (manualMinutes + 1) % 60; // Verhoog minuten (modulo 60)
      delay(200); // Debounce
    }
    // Wacht tot de knop is losgelaten om herhaaldelijk verhogen te voorkomen
    while (digitalRead(INCREASE_PIN) == LOW) {
      delay(10);
    }
  }

  // Bereken de huidige tijd (handmatig of van de RTC)
  int hours, minutes, seconds;
  if (manualHours != -1 && manualMinutes != -1 && manualSeconds != -1) {
    // Gebruik handmatige tijd en laat deze doortellen
    unsigned long elapsedSeconds = (millis() - manualTimeSetMillis) / 1000;
    seconds = manualSeconds + elapsedSeconds;
    minutes = manualMinutes + seconds / 60;
    hours = manualHours + minutes / 60;
    seconds %= 60;
    minutes %= 60;
    hours %= 12; // Gebruik modulo 12 voor 12-uursformaat
  } else {
    // Gebruik RTC-tijd
    DateTime now = rtc.now();
    hours = now.hour();
    minutes = now.minute();
    seconds = now.second();
  }

  // Zet alle LED's uit
  for (int i = 0; i < LED_COUNT; i++) {
    strip.setPixelColor(i, strip.Color(0, 0, 0)); // Uit
  }

  // Toon de uren (groen)
  int hourLED = (hours * 5) % LED_COUNT; // Verdeel de uren over 60 LED's
  for (int i = 0; i < 3; i++) {
    if (!settingHours || blinkState) { // Knipperen als uren worden ingesteld
      strip.setPixelColor((hourLED + i) % LED_COUNT, strip.Color(0, 255, 0)); // Groen
    }
  }

  // Toon de minuten (rood)
  int minuteLED = minutes % LED_COUNT; // Verdeel de minuten over 60 LED's
  if (!settingMinutes || blinkState) { // Knipperen als minuten worden ingesteld
    strip.setPixelColor(minuteLED, strip.Color(255, 0, 0)); // Rood (eerste LED)
    strip.setPixelColor((minuteLED + 1) % LED_COUNT, strip.Color(255, 0, 0)); // Rood (tweede LED)
  }

  // Toon de seconden (blauw)
  int secondLED = seconds % LED_COUNT; // Verdeel de seconden over 60 LED's
  strip.setPixelColor(secondLED, strip.Color(0, 0, 255)); // Blauw

  // Update de LED-strip
  strip.show();

  // Knipperlogica
  if (millis() - lastBlinkMillis >= 500) { // Knipper elke 500 ms
    blinkState = !blinkState;
    lastBlinkMillis = millis();
  }

  // Toon de tijd en LED-status in de seriële monitor
  Serial.print("Tijd: ");
  Serial.print(hours);
  Serial.print(":");
  Serial.print(minutes);
  Serial.print(":");
  Serial.print(seconds);
  Serial.print(" | Uren LED's: ");
  Serial.print(hourLED);
  Serial.print(", ");
  Serial.print((hourLED + 1) % LED_COUNT);
  Serial.print(", ");
  Serial.print((hourLED + 2) % LED_COUNT);
  Serial.print(" | Minuten LED's: ");
  Serial.print(minuteLED);
  Serial.print(", ");
  Serial.print((minuteLED + 1) % LED_COUNT);
  Serial.print(" | Seconden LED: ");
  Serial.println(secondLED);

  delay(100); // Korte vertraging voor betere responsiviteit
}
weet iemand wat er fout gaat in de code.
is een arduino uno met een ds3231 en 60 ws2812b leds

[ Voor 0% gewijzigd door SA007 op 22-02-2025 20:40 ]


Acties:
  • +1 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 08-05 21:14
Wat mij opvalt is regel 22, 23 en 24.
Daar staat int = - 1

Ik codeer zelf niet maar weet wel dat negatieve getallen allerlei speciale regels nodig hebben.
edit:
Toch compileert het, dus daar zal het niet aan liggen waarschijnlijk.

Kun je de bron van je project misschien erbij zetten of heb je het zelf geschreven ?

[ Voor 33% gewijzigd door kitao op 22-02-2025 15:09 ]


Acties:
  • 0 Henk 'm!

  • jeronimus2212
  • Registratie: Februari 2025
  • Laatst online: 23-02 07:34
Ja klopt had ook +1 maar beide werkte niet. Ik heb zelf het vermoeden dat het probleem is de manual time. Dat hij de rtc tijd pakt en ik daardoor niet de tijd kan veranderen. Maar weet niet goed hoe ik dat aan moet passen dat hij niet alleen de manual time aanpast maar ook de rtc time. Heb de code zelf gemaakt. Ben ook geen programmeur veel YouTube gekeken 😬

[ Voor 11% gewijzigd door jeronimus2212 op 22-02-2025 15:15 ]


Acties:
  • +1 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 08-05 21:14
In de DS1307 zit een Ram, daar schrijft ie naar toe zoals ik in deze video zag aan het begin.
En daar haalt de uC ook de nieuwe ingestelde tijd weer vandaan.

YouTube: Assembly via Arduino - Programming DS1307 RTC

edit: Bij nader inzien zitten al die Ram pointer stappen waarschijnlijk al in jouw toegevoegde library.
Heb je een schemaatje van je opstelling ?

47 // Als de RTC geen tijd heeft, stel dan de tijd handmatig in
if (rtc.lostPower()) {
Serial.println("RTC heeft geen stroom gehad, stel de tijd in!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}

Dus dan zou je alleen op hand de tijd kunnen instellen als de RTC geen voeding heeft gehad?
En dus ook geen batterij erin anders neemt die de voeding automatisch over.

The DS1307 has a built-in power-sense circuit that detects power failures and automatically switches to the backup supply. Timekeeping operation continues while the part operates from the backup supply
https://www.analog.com/me...on/data-sheets/DS1307.pdf

Bij de DS3231 idem
The device incorporates a battery input, and maintains accurate timekeeping when main power to the device
is interrupted.

https://www.analog.com/me...on/data-sheets/DS3231.pdf

[ Voor 68% gewijzigd door kitao op 22-02-2025 16:05 ]


Acties:
  • +1 Henk 'm!

  • jeronimus2212
  • Registratie: Februari 2025
  • Laatst online: 23-02 07:34
Heb de code aangepast en de manual time verwijdert nu werkt hij bedankt.
zal dadelijk nog even een schema uploaden mocht iemand het willen gebruiken.
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include "RTClib.h"

// Definieer het aantal LED's en de pin waarop de LED-strip is aangesloten
#define LED_PIN     6
#define LED_COUNT   60

// Definieer de pinnen voor het aanpassen van de tijd
#define HOUR_ADJUST_PIN   3
#define MINUTE_MODE_PIN   4
#define HOUR_MODE_PIN     5

// Initialiseer de LED-strip
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

// Initialiseer de DS3231 RTC
RTC_DS3231 rtc;

// Variabelen voor knipperen en instellen
bool minuteMode = false; // Modus voor minuten instellen
bool hourMode = false;   // Modus voor uren instellen
bool blinkState = false; // Huidige knipperstatus
unsigned long lastBlinkTime = 0; // Tijdstip van laatste knipper

void setup() {
  // Start de seriële communicatie voor debugging
  Serial.begin(9600);

  // Initialiseer de LED-strip
  strip.begin();
  strip.show(); // Zet alle LED's uit
  strip.setBrightness(50); // Stel de helderheid in (0-255)

  // Initialiseer de RTC
  if (!rtc.begin()) {
    Serial.println("Kon RTC niet vinden!");
    while (1);
  }

  // Als de RTC geen tijd heeft, stel dan de tijd handmatig in
  if (rtc.lostPower()) {
    Serial.println("RTC heeft geen stroom gehad, stel de tijd in!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

  // Stel de pinnen in voor het aanpassen van de tijd
  pinMode(HOUR_ADJUST_PIN, INPUT_PULLUP);
  pinMode(MINUTE_MODE_PIN, INPUT_PULLUP);
  pinMode(HOUR_MODE_PIN, INPUT_PULLUP);
}

void loop() {
  // Lees de huidige tijd van de RTC
  DateTime now = rtc.now();
  int hours = now.hour();
  int minutes = now.minute();
  int seconds = now.second();

  // Controleer of de minuten- of urenmodus actief is
  minuteMode = (digitalRead(MINUTE_MODE_PIN) == LOW); // Corrigeer de haakjes
  hourMode = (digitalRead(HOUR_MODE_PIN) == LOW);     // Corrigeer de haakjes

  // Als de minutenmodus actief is, knipper de minuten-LED's
  if (minuteMode) {
    if (millis() - lastBlinkTime > 500) { // Knipper elke 500 ms
      blinkState = !blinkState;
      lastBlinkTime = millis();
    }
  }

  // Als de urenmodus actief is, knipper de uren-LED's
  if (hourMode) {
    if (millis() - lastBlinkTime > 500) { // Knipper elke 500 ms
      blinkState = !blinkState;
      lastBlinkTime = millis();
    }
  }

  // Als Pin 3 (uren/minuten aanpassen) is ingedrukt
  if (digitalRead(HOUR_ADJUST_PIN) == LOW) {
    if (minuteMode) {
      minutes = (minutes + 1) % 60; // Verhoog minuten met 1
      rtc.adjust(DateTime(now.year(), now.month(), now.day(), hours, minutes, seconds));
      delay(200); // Debounce
    } else if (hourMode) {
      hours = (hours + 1) % 24; // Verhoog uren met 1
      rtc.adjust(DateTime(now.year(), now.month(), now.day(), hours, minutes, seconds));
      delay(200); // Debounce
    }
  }

  // Zet alle LED's uit
  for (int i = 0; i < LED_COUNT; i++) {
    strip.setPixelColor(i, strip.Color(0, 0, 0)); // Uit
  }

  // Toon de uren (groen)
  int hourLED = (hours * 5) % LED_COUNT; // Verdeel de uren over 60 LED's
  if (!hourMode || blinkState) { // Als urenmodus niet actief is of knipper aan
    for (int i = 0; i < 3; i++) {
      strip.setPixelColor((hourLED + i) % LED_COUNT, strip.Color(0, 255, 0)); // Groen
    }
  }

  // Toon de minuten (rood)
  int minuteLED = minutes % LED_COUNT; // Verdeel de minuten over 60 LED's
  if (!minuteMode || blinkState) { // Als minutenmodus niet actief is of knipper aan
    strip.setPixelColor(minuteLED, strip.Color(255, 0, 0)); // Rood (eerste LED)
    strip.setPixelColor((minuteLED + 1) % LED_COUNT, strip.Color(255, 0, 0)); // Rood (tweede LED)
  }

  // Toon de seconden (blauw)
  int secondLED = seconds % LED_COUNT; // Verdeel de seconden over 60 LED's
  strip.setPixelColor(secondLED, strip.Color(0, 0, 255)); // Blauw

  // Update de LED-strip
  strip.show();

  // Toon de tijd en LED-status in de seriële monitor
  Serial.print("Tijd: ");
  Serial.print(hours);
  Serial.print(":");
  Serial.print(minutes);
  Serial.print(":");
  Serial.print(seconds);
  Serial.print(" | Uren LED's: ");
  Serial.print(hourLED);
  Serial.print(", ");
  Serial.print((hourLED + 1) % LED_COUNT);
  Serial.print(", ");
  Serial.print((hourLED + 2) % LED_COUNT);
  Serial.print(" | Minuten LED's: ");
  Serial.print(minuteLED);
  Serial.print(", ");
  Serial.print((minuteLED + 1) % LED_COUNT);
  Serial.print(" | Seconden LED: ");
  Serial.println(secondLED);

  delay(500); // Korte vertraging voor betere responsiviteit
}

[ Voor 0% gewijzigd door SA007 op 22-02-2025 20:40 ]


Acties:
  • 0 Henk 'm!

  • jeronimus2212
  • Registratie: Februari 2025
  • Laatst online: 23-02 07:34
Afbeeldingslocatie: https://tweakers.net/i/61u9yBLdbMoAajJDE37KPPkI24E=/800x/filters:strip_icc():strip_exif()/f/image/4qtNBMQ3KP7jkewSfuXcX4JU.jpg?f=fotoalbum_large

Acties:
  • 0 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 08-05 21:14
Bedankt voor het schema, heel toevallig was ik vanmorgen net bezig met een RTC, zie
kitao in "[Discussie] Arduino-topic"

Ik heb jouw sketch in Proteus gezet, de sketch uit de OP
Probleem, in Proteus zit geen DS3231 en als ik deze regel verander van
18 RTC_DS3231 rtc; naar RTC_DS3232 rtc;
dan compileert het niet en krijg ik deze melding:
'RTC_DS3232' does not name a type; did you mean 'RTC_DS3231'?

Er zitten wel een paar WS28 in maar ik ken de led-strips nog niet.
Desondanks beweegt er wel iets
Dat betekent dat de simulatie wel een RTC ziet. Haal ik die namelijk weg dan verschijnt er de melding 'RTC niet gevonden'

Afbeeldingslocatie: https://tweakers.net/i/pp-GB8FXGe5vKt81o4jc0cX6Sng=/800x/filters:strip_icc():strip_exif()/f/image/dj95iNIgJGItd7uPGqVKtAzY.jpg?f=fotoalbum_large

Dit komt in beeld bij opstart

Afbeeldingslocatie: https://tweakers.net/i/1OoA3xAXEzyBYNYzqH4o8QVCcUA=/800x/filters:strip_icc():strip_exif()/f/image/8AOWHchezKsTXjguOmMIKASQ.jpg?f=fotoalbum_large

Deze kwam ik onderweg ook nog tegen
https://projecthub.arduin...opixel-strip-clock-de8678


.

[ Voor 40% gewijzigd door kitao op 22-02-2025 18:05 ]


Acties:
  • 0 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 08-05 21:14
Nog iets wat opvalt in jouw code :

#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include "RTClib.h"

moet dat geen < RTClib.h> zijn, dus met < > ipv " " ?

[ Voor 9% gewijzigd door kitao op 22-02-2025 19:17 ]


Acties:
  • 0 Henk 'm!

  • SA007
  • Registratie: Oktober 2002
  • Laatst online: 11-05 23:55

SA007

Moderator Tweaking
Ik heb de code uitklapbaar gemaakt (en syntax highlighting), maakt het topic wat leesbaarder.

Dat nog is het niet de bedoeling om je code neer te gooien en te vragen 'wat is hier het probleem'.
Vul het op zijn minst aan met wat je al geprobeerd hebt, wat je tegen bent gekomen en wat je verwacht wat het hoort te doen.

Acties:
  • 0 Henk 'm!

  • jeronimus2212
  • Registratie: Februari 2025
  • Laatst online: 23-02 07:34
gezellige boel hier. waren een leuke paar uur tijd om weer te gaan.

Acties:
  • 0 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 08-05 21:14
Vorige keer heb ik ook heel lang lopen zoeken om een code in te klappen maar ik kwam er niet uit.
Het is inmiddels wel gelukt om de WS28 ledjes te laten branden maar dan wel vanuit een standaard voorbeeld
https://arduinogetstarted...arduino-ws2812b-led-strip

Afbeeldingslocatie: https://tweakers.net/i/LGQYqDQ_V14r_R4SdP54uJ8LQIE=/800x/filters:strip_icc():strip_exif()/f/image/7QIjSlmX4iW3WrJ6jz848MNP.jpg?f=fotoalbum_large

Ik heb jouw OP code in Notepad++ ernaast gelegd en dit valt mij op :
void setup() {
WS2812B.begin(); // INITIALIZE WS2812B strip object (REQUIRED)
}

In deze code staat wel 80x de term WS2818 en in jouw code niet 1x ?
Ik zeg niet dat het fout is, ik kan het lastig uitproberen als ik in Proteus geen toegang heb tot de DS3231 en die evenals de strip niet op tafel heb liggen.

Acties:
  • 0 Henk 'm!

  • Rrob
  • Registratie: Augustus 2005
  • Laatst online: 11-05 17:17
Ikdenk dat het probleem met de code uit de startpost zit in het if-statement op regel 109. Die doet pas iets als aan alle drie de voorwaarden is voldaan { A && B && C } . Maar als je de tijd met de knoppen instelt heb je sowieso geen secondes en vanwege de if op regel 93 alleen of 1 uur of 1 minuut.

Misschien helpt het om op R 109 beide && te vervangen door ||
Maar eigenlijk moet dat hele stuk code anders nu kan je max 1 x de increase knop gebruiken en dan is dat if statement klaar en gaat de code verder. Je wilt iets van een while loop oid hebben zodat je met het vasthouden van éen knop in een functie blijft waarbij je telt hoevaak de 2e knop wordt ingedrukt. En als die 1e knop wordt losgelaten verwerk je de input.

Acties:
  • 0 Henk 'm!

  • Rmg
  • Registratie: November 2003
  • Laatst online: 12:06

Rmg

kitao schreef op zaterdag 22 februari 2025 @ 19:15:
Nog iets wat opvalt in jouw code :

#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include "RTClib.h"

moet dat geen < RTClib.h> zijn, dus met < > ipv " " ?
Er zit wat verschil tussen " en < maar echt uitmaken doet het meestal niet. (In dit geval)

Het heeft te maken met zoekpaden " zoekt eerst in de directory waar je file staat en dan pas je include paden en < alleen je include paden.

https://gcc.gnu.org/onlinedocs/cpp/Include-Syntax.html


Consistent zijn is wel netter natuurlijk.

Acties:
  • 0 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 08-05 21:14
@Rmg

Ok, bedankt, goed om te weten :)
Een tijd geleden probeerde ik C++ aan te leren via een site zoals dit
https://www.learncpp.com/
maar ik heb sindsdien de illusie opgegeven zelf code te schrijven dus ik richt me alleen nog maar op het leren lezen ervan en af en toe kleine wijzigingen aan te brengen. Het is bijvoorbeeld zonde als je een mooi stuk code van internet afhaalt en het project niet doorgaat omdat er een haakje verkeerd staat dus het is wel handig er iets van af te weten.

Zoals gezegd was ik toevallig ook bezig met een RTC
kitao in "[Discussie] Arduino-topic"
en ik zet de code dan in debug, dwz, ik stap er doorheen.
Nu is het zo dat bij deze code, maar ook bij andere situaties met een interrupt
https://akuzechie.blogspo...a-arduino-ds1307-rtc.html
het in Michrochip Studio, terwijl het ingesteld staat op simulatie modus, toch vastloopt op die interrupt.
Ik heb van alles geprobeerd, step over, step out, run to cursor, breakpoint hier en daar, maar het is net drijfzand, je komt er niet meer uit, zelfs niet als ik de Twint in het register handmatig een 1 geef

Afbeeldingslocatie: https://tweakers.net/i/jb0z6R97oC5ued_pyfu3lLwNpVc=/800x/filters:strip_icc():strip_exif()/f/image/LKd6yVVEbetGNlE90uvW8XeP.jpg?f=fotoalbum_large

Hetzelfde programma debuggend in Proteus levert daarentegen totaal geen problemen op, Step out icm een breakpoint en ik kan weer vrolijk verder

Afbeeldingslocatie: https://tweakers.net/i/SGkAg_WHpNbg5F_NTK_wnsAzd4s=/fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():strip_exif()/f/image/aDpASI6f5bml9qPcxUl4uWvg.jpg?f=user_large

Het lijkt dan een luxe probleem maar het heen en weer springen van programma naar programma is op zich geen oplossing. Ook vraag ik me af waar dat verschil in debug methode nu eigenlijk vandaan komt.

Mocht iemand de DS1307 van Kuzechie willen uitproberen, volgens mij zit er een fout in zijn schema en dienen de Sda en Scl pull ups te krijgen en geen pull downs. Schema zoals getekend werkt namelijk niet in de simulatie en zonder de 10K weerstanden wel.

Afbeeldingslocatie: https://tweakers.net/i/sGM98idbcgDNeMbUDAT77fhUfbM=/800x/filters:strip_icc():strip_exif()/f/image/AKNEbqGOjY83DWXaEfoRYG00.jpg?f=fotoalbum_large

[ Voor 9% gewijzigd door kitao op 23-02-2025 13:42 ]


Acties:
  • 0 Henk 'm!

  • memphis
  • Registratie: Oktober 2000
  • Laatst online: 12:32

memphis

48k was toen meer dan genoeg.

Bij SDA/SDL signaal lijnen moet je dan ook geen pull down maar pull up weerstanden gebruiken. De pinnen zijn zgn open collector.

Ben je overigens bekend met deze emulator? https://wokwi.com/

Er zijn mensen die mij een GOD vinden


Acties:
  • 0 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 08-05 21:14
Ja klopt, ik was het even vergeten totdat het vastliep maar Kuzechie heeft er zelf een eerdere video aan besteed
YouTube: Assembly via Arduino (part 17) - Programming I2C

daaronder verwijzend naar zijn blog, met daarin wel pull-ups op de Sda en Scl

https://akuzechie.blogspo...uino-programming-i2c.html

Afbeeldingslocatie: https://tweakers.net/i/59fuT0TLRK22AQL3oUymx9OwcdA=/800x/filters:strip_icc():strip_exif()/f/image/TlG9Bbfixw89RODwmMqedzvs.jpg?f=fotoalbum_large

Dus het zal wel een zetfoutje in de afbeelding zijn geweest.

Wokwi kon ik nog niet maar ga ik zeker bekijken, bedankt voor het delen.

Acties:
  • 0 Henk 'm!

  • kitao
  • Registratie: Juli 2012
  • Laatst online: 08-05 21:14
kitao schreef op zondag 23 februari 2025 @ 12:44:

Nu is het zo dat bij deze code, maar ook bij andere situaties met een interrupt
https://akuzechie.blogspo...a-arduino-ds1307-rtc.html
het in Michrochip Studio, terwijl het ingesteld staat op simulatie modus, toch vastloopt op die interrupt.
Ik heb van alles geprobeerd, step over, step out, run to cursor, breakpoint hier en daar, maar het is net drijfzand, je komt er niet meer uit, zelfs niet als ik de Twint in het register handmatig een 1 geef

[Afbeelding]
De oplossing hiervoor bleek achteraf nogal simpel te zijn :$
Zet de cursor in de code op het register, een mini veldje verschijnt en pas de hex-waarde aan.

Afbeeldingslocatie: https://tweakers.net/i/RxMzYP628WH86a2bjhKG8Pmnh8c=/800x/filters:strip_icc():strip_exif()/f/image/40wkFmcc2bTOwouTNzyEv3SN.jpg?f=fotoalbum_large

Andere optie is de interrupt wait uit het programma weg te commenten, met @@@@@ om het sneller terug te vinden indien nodig

Afbeeldingslocatie: https://tweakers.net/i/gaZZeDcvYwcnGYWgjOhwgRyMsEY=/800x/filters:strip_icc():strip_exif()/f/image/605QwBePbnxUYpPumDdDCyhD.jpg?f=fotoalbum_large

[ Voor 15% gewijzigd door kitao op 03-03-2025 07:44 ]

Pagina: 1