DS1307 code

Arduino specifieke Software
Berichten: 21
Geregistreerd: 14 Jan 2014, 17:57

DS1307 code

Berichtdoor Hendrik » 25 Mrt 2014, 23:51

Ik heb een DS1307 op een arduino one aangesloten en de code hiervoor uit het boek Beginning Arduino Programming gebruikt.
dit gaat een heel eind goed tot het moment om Y te geven op de serial monitor, maar door yes in te geven ging hij wel van start; alleen het jaartal is al vooringevuld met 00 en geeft als resultaat het jaar 200.
Hoe kom ik op het juiste spoor, er zijn geen foutmeldingen en ik gebruik wire.h?

Een andere code geeft als foutmelding
core.a(main.cpp.o) : In function `main`:
C:\users|Hendrik|Documents\Arduino\hardware\arduino\cores\arduino/main.cpp:11: undefined reference to `setup`
C:\users|Hendrik|Documents\Arduino\hardware\arduino\cores\arduino/main.cpp:14: undefined reference to `loop`
Is dit een kwestie van verkeerde map of zit ergens een fout?
groet
Hendrik

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: DS1307 code

Berichtdoor nicoverduin » 25 Mrt 2014, 23:55

zonder de hele code kunnen we niet zoveel heh :)
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 21
Geregistreerd: 14 Jan 2014, 17:57

Re: DS1307 code

Berichtdoor Hendrik » 26 Mrt 2014, 16:31

Hieronder de code van het eerste bovengenoemde probleem:

#include <Wire.h>
const int DS1307 = 0x68;
const char* days[] =
{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const char* months[] =
{"January", "February", "March", "April", "May", "June", "July", "August",
"September", "October", "November", "December"};
byte second = 0;
byte minute = 0;
byte hour = 0;
byte weekday = 0;
byte monthday = 0;
byte month = 0;
byte year = 00;
void setup() {
Wire.begin();
Serial.begin(9600);
delay(2000);
Serial.print("The current date and time is: ");
printTime();
Serial.println("To set the date and time please select Newline ending to continue.");
Serial.println("Would you like to set the date and time now? Y/N");
while (!Serial.available()) delay(5000);
if (Serial.read() == 'y' || Serial.read() == 'Y') {
Serial.read();
setTime();
Serial.print("The current date and time is now: ");
printTime();
}
Serial.println("Goodbye.");
}
void loop() {}
byte decToBcd(byte val) {
return ((val/10*16) + (val%10));
}
byte bcdToDec(byte val) {
return ((val/16*10) + (val%16));
}
void setTime() {
Serial.print("Please enter the current year, 00-99. - ");
year = readByte();
Serial.println(year);
Serial.print("Please enter the current month, 1-12. - ");
month = readByte();
Serial.println(months[month-1]);
Serial.print("Please enter the current day of the month, 1-31. - ");
monthday = readByte();
Serial.println(monthday);
Serial.println("Please enter the current day of the week, 1-7.");
Serial.print("1 Sun | 2 Mon | 3 Tues | 4 Weds | 5 Thu | 6 Fri | 7 Sat - ");
weekday = readByte();
Serial.println(days[weekday-1]);
Serial.print("Please enter the current hour in 24hr format, 0-23. - ");
hour = readByte();
Serial.println(hour);
Serial.print("Please enter the current minute, 0-59. - ");
minute = readByte();
Serial.println(minute);
second = 0;
Serial.println("Thank you.");
Wire.beginTransmission(DS1307);
Wire.write(byte(0));
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(weekday));
Wire.write(decToBcd(monthday));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.write(byte(0));
Wire.endTransmission();
}
byte readByte() {
while (!Serial.available()) delay(10);
byte reading = 0;
byte incomingByte = Serial.read();
while (incomingByte != '\n') {
if (incomingByte >= '0' && incomingByte <= '9')
reading = reading * 10 + (incomingByte - '0');
else;
incomingByte = Serial.read();
}
Serial.flush();
return reading;
}
void printTime() {
char buffer[3];
const char* AMPM = 0;
readTime();
Serial.print(days[weekday-1]);
Serial.print(" ");
Serial.print(months[month-1]);
Serial.print(" ");
Serial.print(monthday);
Serial.print(", 20");
Serial.print(year);
Serial.print(" ");
if (hour > 12) {
hour -= 12;
AMPM = " PM";
} else AMPM = " AM";
Serial.print(hour);
Serial.print(":");
sprintf(buffer, "%02d", minute);
Serial.print(buffer);
Serial.println(AMPM);
}
void readTime() {
Wire.beginTransmission(DS1307);
Wire.write(byte(0));
Wire.endTransmission();
Wire.requestFrom(DS1307, 7);
second = bcdToDec(Wire.read());
minute = bcdToDec(Wire.read());
hour = bcdToDec(Wire.read());
weekday = bcdToDec(Wire.read());
monthday = bcdToDec(Wire.read());
month = bcdToDec(Wire.read());
year = bcdToDec(Wire.read());
}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: DS1307 code

Berichtdoor nicoverduin » 26 Mrt 2014, 18:31

Vermoedelijk zit hier je probleem:
Code: Alles selecteren
   Serial.print(", 20");
   Serial.print(year);


Omdat je Serial.print gebruikt zie je geen voorloop nullen (even los van of de programmering van de DS op zich al goed gaat.
Als je dit toepast voor genoemde regels gaat het vermoedelijk goed.
Code: Alles selecteren
sprintf(buffer, " 20%02d", year);
Serial.print(buffer);

Hier vul je dus een buffer met een formatted string:
De eerste 20 is het jaar 20xx.
%02d = een invul format (% teken) met voorloop nullen (0) 2 cijfers lang (2) als decimaal (d).
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 21
Geregistreerd: 14 Jan 2014, 17:57

Re: DS1307 code

Berichtdoor Hendrik » 27 Mrt 2014, 09:53

dit leek mij ook een goede mogelijkheid, maar ik heb die beide regels vervangen door jouw voorstel.
helaas precies hetzelfde resultaat.
hij slaat bij het invullen year over want daar staat al een 0.

Is er wat te zeggen over de merkwaardige foutmelding die ik heb aangegeven bij de 2de vraag?
groet

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: DS1307 code

Berichtdoor nicoverduin » 27 Mrt 2014, 12:43

ik weet niet welke source code je gebruikt. Lijkt erop dat hij de Arduino folder niet ziet.
Dus als ik het goed begrijp zegt hij al bij Serial.print(year) dat er een 0 staat?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 21
Geregistreerd: 14 Jan 2014, 17:57

Re: DS1307 code

Berichtdoor Hendrik » 27 Mrt 2014, 23:20

zodra ik aangeef dat ik de tijd wil instellen laat hij zien dat het jaar al is ingevuld en vraagt hij naar de maand.
dat verhaal over source code en arduino map slaat dat op probleem 2? want daarvoor heb ik een alternatieve code gebruikt.
groet

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: DS1307 code

Berichtdoor nicoverduin » 28 Mrt 2014, 07:37

Ik had het ook over dat 2e probleem van niet vinden van beide functies.
Terug naar je eerste code:
Het lezen van waardes klopt niet. In de setup doe je 3x een Serial.read() voor het testen van de y of Y. En daar gaat het al fout. Bij seriele communnicatie krijg je behalve te tekens ook nog eens een CR en LF als de seriele monitor zo is ingesteld. Je doet er beter aan om een functie te maken die een string leest van de Serial. Dus blijven lezen totdat je een CR of LF binnen krijgt. Die string zet je dan om in de waarde die je wilt (numeriek of string). Als je begint te lezen skip je alle CR's of LF's die nog zijn blijven hangen.
Want afhankelijk van hoe je monitor is ingesteld komt het volgende binnen:
Y CR LF 14 CR LF 03 CR LF 28 CR LF
of
Y CR 14 CR 03 CR 28 CR
of
Y 14 03 28

Daar moet je dus rekening mee houden.

@edit
ff de code hier geladen. De oorzaak zit er bij jou dus in dat je monitor waarschijnlijk een CR/LF stuurt. Maar je moet alleen een LF of Newline zoals dat heet erbij sturen. 't is ook weer geen geweldige code......
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 21
Geregistreerd: 14 Jan 2014, 17:57

Re: DS1307 code

Berichtdoor Hendrik » 28 Mrt 2014, 20:30

Nico, ik heb het gevoel dat we er steeds dichterbij komen. De monitor blijkt niet op Y of y te werken maar op yes, dat staat ook niet in het boek, ik zet het rolmenuutje onderaan wel op Newline.
I weet nog te weinig van coderen om de actie met CR en LF uit te kunnen voeren.
wat betreft die andere code van probleem 2 wordt er kennelijk een code genaamd main.h opgeroepen die ik in de hele code niet ben tegengekomen, maar die wel tot de foutmelding leidt en bovendien wordt wel exact de plaats van dit bestand beschreven. Ik heb wel twee directories die arduino heten en ik had gedacht dit project met alle bijlagen te scheiden van de standaardcodes en libraries van arduino zelf, maar daarin zit wel die main.h Wordt opgeroepen via wire.h? Moet ik alles toch in 1 map stoppen? terwijl uit de foutmelding de precieze plaats blijkt? kortom een merkwaardig probleem. Mogelijk dat je dit wel begrijpt.
groet
henk

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: DS1307 code

Berichtdoor nicoverduin » 28 Mrt 2014, 21:01

Als je in de monitor aangeeft dat deze met Lf moet werken gaat het goed. Yes als text is fout daar zit geen enkele check voor in je programma. Ik heb dat eerste programma met monitor op lf gezet en werkt als een tierelier.
Voor dat tweede lat de code maar zien.
En ga alsjeblieft niet slimmer doen dan de Standaard installatie van de arduino.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: ovowicoolixae en 81 gasten