Hallo,
ich bastel gerade an meiner Equinox in AVR-GCC.
Der Code ist nicht fehlerfrei. Zumal derzeit noch keine Kommunikation mit der DS3231 erfolgt. Lediglich den SQW Takt von 1024kHz greife ich von dieser ab, welche ich zuvor mit RS1 und RS2 gesetzt hatte.
Nun habe ich das Problem, sobald ich #define ANTI_CLOCKWISE(gegen den Uhrzeigersinn ist bei mir Notwendig, da ich die Adafruit NeoPixel RIng nach hinten an die Wand strahlen lasse) setze, dass ich bei jeder vollen Minute eine falsche Led habe. Ich habe dazu testweise über die UART Schnittstelle einmal den Verlauf einer Minute ausgegeben mit -2 bis +2 (vor und nachgehende Sekunde/Led). Dort kann ich keinen Fehler feststellen.
* Project: DS3231
* Created: 19.08.2014 18:25
* Last Edit: 19.08.2014 18:25
* Author: sschultewolter
00:(01|00|59|58|57) 01:(00|59|58|57|56) 02:(59|58|57|56|55)
03:(58|57|56|55|54) 04:(57|56|55|54|53) 05:(56|55|54|53|52)
06:(55|54|53|52|51) 07:(54|53|52|51|50) 08:(53|52|51|50|49)
09:(52|51|50|49|48) 10:(51|50|49|48|47) 11:(50|49|48|47|46)
12:(49|48|47|46|45) 13:(48|47|46|45|44) 14:(47|46|45|44|43)
15:(46|45|44|43|42) 16:(45|44|43|42|41) 17:(44|43|42|41|40)
18:(43|42|41|40|39) 19:(42|41|40|39|38) 20:(41|40|39|38|37)
21:(40|39|38|37|36) 22:(39|38|37|36|35) 23:(38|37|36|35|34)
24:(37|36|35|34|33) 25:(36|35|34|33|32) 26:(35|34|33|32|31)
27:(34|33|32|31|30) 28:(33|32|31|30|29) 29:(32|31|30|29|28)
30:(31|30|29|28|27) 31:(30|29|28|27|26) 32:(29|28|27|26|25)
33:(28|27|26|25|24) 34:(27|26|25|24|23) 35:(26|25|24|23|22)
36:(25|24|23|22|21) 37:(24|23|22|21|20) 38:(23|22|21|20|19)
39:(22|21|20|19|18) 40:(21|20|19|18|17) 41:(20|19|18|17|16)
42:(19|18|17|16|15) 43:(18|17|16|15|14) 44:(17|16|15|14|13)
45:(16|15|14|13|12) 46:(15|14|13|12|11) 47:(14|13|12|11|10)
48:(13|12|11|10|09) 49:(12|11|10|09|08) 50:(11|10|09|08|07)
51:(10|09|08|07|06) 52:(09|08|07|06|05) 53:(08|07|06|05|04)
54:(07|06|05|04|03) 55:(06|05|04|03|02) 56:(05|04|03|02|01)
57:(04|03|02|01|00) 58:(03|02|01|00|59) 59:(02|01|00|59|58)
Den Fehler kann ich auf diese beide Funktionen eingrenzen, dennoch habe ich den kompletten Code unten aus meiner Dropbox abgehangen.
// Korrigiert die fehlerhaften Zugriffe
int16_t leds_index(int16_t led)
{
if(led < 0) led = NUM_LEDS + led;
else if(led >= NUM_LEDS) led = led - NUM_LEDS;
#ifdef ANTI_CLOCKWISE
led = (NUM_LEDS -1) - led % NUM_LEDS;
#endif
return led;
}
void leds_clock2(int8_t _hour12, int8_t _minute, int8_t _second, int8_t index)
{
leds_clear();
leds_rgb(_second-2, 0, 0, fade[127-index]);
leds_rgb(_second-1, 0, 0, fade[255-index]);
leds_rgb(_second, 0, 0, fade[255]);
leds_rgb(_second+1, 0, 0, fade[128+index]);
leds_rgb(_second+2, 0, 0, fade[index]);
leds_rgb(_hour12*5-1, 255, 0, 0);
leds_rgb(_hour12*5, 255, 0, 0);
leds_rgb(_hour12*5+1, 255, 0, 0);
leds_rgb(_minute, 0, 255, 0);
leds_update();
}
AVR-GCC Code:
Video: