Construction of Word Clock v1
Moderators: pedja089, stojke369, trax, InTheStillOfTheNight
Construction of Word Clock v1
I do not want to spam the comments on the projectpage. http://www.elektronika.ba/841/word-clock/
i have the hardware finish and have made the first test. Your programm ist on the ATMega328. All LED's are shine sometimes white, somtimes red (reversed polarity).
I have measure:
1)
The touchsensor is not reacted on the matrix, but an H-level is at the microcontroller (pin 6 [Sens2_OUT] or Pin23 [Sens1_OUT]) when i touch the sensor.
2)
On Pin2 [32kHz] of the microcontroller or Pin5 [32kHz] of the DS3232 are not 32kHz just 1/2Hz
3)
From pin 14 comes a pulse sequence (bit sequence for the MAX7219)
4)
On the Pin 34 [DOUT] is a h-level, without a puls sequence
5)
As fusebites i have set H = D9 and L= 62 by AVR-Studio 4
What can be the Problem.
Thanks
i have the hardware finish and have made the first test. Your programm ist on the ATMega328. All LED's are shine sometimes white, somtimes red (reversed polarity).
I have measure:
1)
The touchsensor is not reacted on the matrix, but an H-level is at the microcontroller (pin 6 [Sens2_OUT] or Pin23 [Sens1_OUT]) when i touch the sensor.
2)
On Pin2 [32kHz] of the microcontroller or Pin5 [32kHz] of the DS3232 are not 32kHz just 1/2Hz
3)
From pin 14 comes a pulse sequence (bit sequence for the MAX7219)
4)
On the Pin 34 [DOUT] is a h-level, without a puls sequence
5)
As fusebites i have set H = D9 and L= 62 by AVR-Studio 4
What can be the Problem.
Thanks
Re: Problem with wordclock
Hello Pielo,
The fuse for ATmega328P that must remain set/enabled is: "SPI Enabled" and nothing else. I have a different programmer (AVRFlash from http://www.mikroe.com).
For the oscillator you must set: XTAL 8 - 16 MHz
Device freq. is 8 MHz
About the red color of your LEDs - I don't understand how that can happen. What LEDs did you use??? The LEDs are controlled with MAX7219 IC and I neved had any problems with reverse polarity. Maybe you soldered LEDs the wrong way?
Do not worry about the 32kHz pin of DS3231 - we can't control it so forget about it.
For the start, do not connect touch sensors to the microcontroller, first you should see some LEDs light up when you power it up. There is a startup sequence with scrolling text and you should see some LEDs blink for few seconds and then only some of them will remain ON.
About the corner dots - please do not connect any corner dots at this time, we will do this at the very end - when everything else is working.
********
UPDATE 2015-04-01
Please read this post for LED matrix schematics and new part of the code to run it: http://www.elektronika.ba/forum/viewtop ... 88#p149788
********
Regards
The fuse for ATmega328P that must remain set/enabled is: "SPI Enabled" and nothing else. I have a different programmer (AVRFlash from http://www.mikroe.com).
For the oscillator you must set: XTAL 8 - 16 MHz
Device freq. is 8 MHz
About the red color of your LEDs - I don't understand how that can happen. What LEDs did you use??? The LEDs are controlled with MAX7219 IC and I neved had any problems with reverse polarity. Maybe you soldered LEDs the wrong way?
Do not worry about the 32kHz pin of DS3231 - we can't control it so forget about it.
For the start, do not connect touch sensors to the microcontroller, first you should see some LEDs light up when you power it up. There is a startup sequence with scrolling text and you should see some LEDs blink for few seconds and then only some of them will remain ON.
About the corner dots - please do not connect any corner dots at this time, we will do this at the very end - when everything else is working.
********
UPDATE 2015-04-01
Please read this post for LED matrix schematics and new part of the code to run it: http://www.elektronika.ba/forum/viewtop ... 88#p149788
********
Regards
Re: Problem with wordclock
Thanx for your answer
LED's are "Osram LUW T6SG". They have a red led antiparallel to the white led. The polarity is right, because sometime is 1 part of matrix white and sometimes is the same part red
Ich have very mutch oscillator setting on AVR-Studio. I have made a picture from Fuse Calculator is this the right setting, or a other?
Uploaded with ImageShack.us
the dot corners have i disconect.
LED's are "Osram LUW T6SG". They have a red led antiparallel to the white led. The polarity is right, because sometime is 1 part of matrix white and sometimes is the same part red
Ich have very mutch oscillator setting on AVR-Studio. I have made a picture from Fuse Calculator is this the right setting, or a other?
Uploaded with ImageShack.us
the dot corners have i disconect.
Re: Problem with wordclock
Hello,
Everything looks OK. Just decrease Boot Size to 1024 words - just in case
I used LEDs from China (http://www.ebay.com) and they are very very cheap. I don't know about the reverse red led in your white led, I don't know if that can cause some problems with MAX7219 - I never tested it with that kind of LEDs!
Also, make sure you connected MAX7219 ICs correctly to the ATmega328P before you power it up!
Just a note: To connect LED matrix to MAX7219 chip, you must connect LED ANODES to "SEG" outputs, and LED CATHODES to "DIG" outputs, like in this example: http://bit.ly/Y8YT2o
Everything looks OK. Just decrease Boot Size to 1024 words - just in case
I used LEDs from China (http://www.ebay.com) and they are very very cheap. I don't know about the reverse red led in your white led, I don't know if that can cause some problems with MAX7219 - I never tested it with that kind of LEDs!
Also, make sure you connected MAX7219 ICs correctly to the ATmega328P before you power it up!
Just a note: To connect LED matrix to MAX7219 chip, you must connect LED ANODES to "SEG" outputs, and LED CATHODES to "DIG" outputs, like in this example: http://bit.ly/Y8YT2o
Re: Problem with wordclock
is there a possibility to test the MAX7219 single. in my opinion is that correct connect
Re: Problem with wordclock
You can just connect 1 MAX on the data-bus and see how it works. No need to change the code.
Re: Problem with wordclock
is it right to the Pin24 [DOUT] from the first MAX7219 an h-signal is present and no an impulse
Re: Problem with wordclock
DOUT pin will transfer data from DIN pin after 16 bytes (if I remember correctly), so it will be HIGH most of the time when data is not being transferred. You must look at this line with an oscilloscope if you want to examine it.
Re: Problem with wordclock
Thanks for your infos. i have found the problem, the red led was it. I must short the red led's with overload and it was.
Now I must change the "7x5 Font.h" so that correct letters are visible, right? Than I must change the "wc.c" so that the words in the menu are in german, right? At last I must change the "lang_ba.h" so that reasonable times are visible.
Now I must change the "7x5 Font.h" so that correct letters are visible, right? Than I must change the "wc.c" so that the words in the menu are in german, right? At last I must change the "lang_ba.h" so that reasonable times are visible.
Re: Problem with wordclock
Great that you managed to find and fix the problem!
You will add "lang_de.h" file for your own front plate with german letters. But, you will do that AFTER you design your front board with all "times" that will be displayed on the clock. Have you done that already?
Now you have a much more complicated job, you must "re-map" indices (indexes) of rows and columns in the source-code and this is done manually by trial and error method. But first, did you solder your LED matrices to MAX ICs? Do you have some pictures or schematics so I could help?
edit: you will not need to change 7x5 font.h file!!!
That will be the last step for you.Now I must change the "7x5 Font.h" so that correct letters are visible, right? Than I must change the "wc.c" so that the words in the menu are in german, right? At last I must change the "lang_ba.h" so that reasonable times are visible.
You will add "lang_de.h" file for your own front plate with german letters. But, you will do that AFTER you design your front board with all "times" that will be displayed on the clock. Have you done that already?
Now you have a much more complicated job, you must "re-map" indices (indexes) of rows and columns in the source-code and this is done manually by trial and error method. But first, did you solder your LED matrices to MAX ICs? Do you have some pictures or schematics so I could help?
edit: you will not need to change 7x5 font.h file!!!
Re: Construction of Word Clock v1
I have make two schenmatics. one from full-matrix and one from matrix with coner led's.
where must i change the sorce code?
http://imageshack.us/a/img94/9161/max7219full.png
http://imageshack.us/a/img685/310/max7219cornerleds.png
where must i change the sorce code?
http://imageshack.us/a/img94/9161/max7219full.png
http://imageshack.us/a/img685/310/max7219cornerleds.png
Re: Problem with wordclock
The schematics are kind of correct - take look at my schematics that I attached here. That's how you need to connect it.
When you connect everything up you will need to change the body of function "max72xx_send_matrix()". There you will see this part of the code:
For MAX 1 and MAX 4 it is the same:
What we do here is "move" the data rows to the appropriate rows in the actual LED order that you made for your LED matrix. We also "move" the data columns to columns in the display.
The first part, for example:
moves the bit 00000010 to this location 00100000 in the display.
The second part, for example:
moves the entire row from index 1 to index 4.
If you arrange your LEDs like in the schematics that I am sending you, then I will be able to tell you what bit to move where, and what row to move to what index!
And for MAX 2 and MAX 3 it is the same:
The story here is the same as for the MAX 1 and MAX 4...
Take look at the schematics I am sending you here.
When you connect everything up you will need to change the body of function "max72xx_send_matrix()". There you will see this part of the code:
For MAX 1 and MAX 4 it is the same:
Code: Select all
// MAX1 and MAX4 are soldered in the same fashion
if(max_id==0 || max_id==3)
{
uint8_t old_byte = display_matrix[max_id][j];
// now rearrange the bits into a new byte
uint8_t new_byte = 0;
new_byte |= (old_byte & 0b00000001);
new_byte |= (old_byte & 0b00000010) << 4;
new_byte |= (old_byte & 0b00000100) >> 1;
new_byte |= (old_byte & 0b00001000) << 3;
new_byte |= (old_byte & 0b00010000) >> 1;
new_byte |= (old_byte & 0b00100000) << 2;
new_byte |= (old_byte & 0b01000000) >> 4;
new_byte |= (old_byte & 0b10000000) >> 3;
// now rearrange the indexes
uint8_t new_index;
switch (j)
{
case 0: new_index=0; break;
case 1: new_index=4; break;
case 2: new_index=6; break;
case 3: new_index=2; break;
case 4: new_index=3; break;
case 5: new_index=7; break;
case 6: new_index=5; break;
case 7: new_index=1; break;
}
display_matrix_new[max_id][new_index] = new_byte;
}
The first part, for example:
Code: Select all
new_byte |= (old_byte & 0b00000010) << 4;
The second part, for example:
Code: Select all
case 1: new_index=4; break;
If you arrange your LEDs like in the schematics that I am sending you, then I will be able to tell you what bit to move where, and what row to move to what index!
And for MAX 2 and MAX 3 it is the same:
Code: Select all
// and MAX2 and MAX3 are soldered in the same fashion
else
{
uint8_t old_byte = display_matrix[max_id][j];
// now rearrange the bits into a new byte
uint8_t new_byte = 0;
new_byte |= (old_byte & 0b00000001) << 4;
new_byte |= (old_byte & 0b00000010) << 1;
new_byte |= (old_byte & 0b00000100) << 5;
new_byte |= (old_byte & 0b00001000);
new_byte |= (old_byte & 0b00010000) << 2;
new_byte |= (old_byte & 0b00100000) >> 4;
new_byte |= (old_byte & 0b01000000) >> 1;
new_byte |= (old_byte & 0b10000000) >> 7;
// now rearrange the indexes
uint8_t new_index;
switch (j)
{
case 0: new_index=1; break;
case 1: new_index=5; break;
case 2: new_index=7; break;
case 3: new_index=3; break;
case 4: new_index=2; break;
case 5: new_index=6; break;
case 6: new_index=4; break;
case 7: new_index=0; break;
}
display_matrix_new[max_id][new_index] = new_byte;
}
Take look at the schematics I am sending you here.
- Attachments
-
- word_clock_1.jpg
- (777.63 KiB) Downloaded 4 times
-
- max_orders.jpg
- (99.04 KiB) Downloaded 4 times
Re: Construction of Word Clock v1
Did you rotate the matrices like I showed you in my schematics?
Do you have some pictures of your hardware so I can take a look?
Do you have some pictures of your hardware so I can take a look?
Re: Problem with wordclock
trax wrote: For MAX 1 and MAX 4 it is the same:Code: Select all
// MAX1 and MAX4 are soldered in the same fashion if(max_id==0 || max_id==3) { uint8_t old_byte = display_matrix[max_id][j]; // now rearrange the bits into a new byte uint8_t new_byte = 0; new_byte |= (old_byte & 0b00000001); new_byte |= (old_byte & 0b00000010) << 4; new_byte |= (old_byte & 0b00000100) >> 1; new_byte |= (old_byte & 0b00001000) << 3; new_byte |= (old_byte & 0b00010000) >> 1; new_byte |= (old_byte & 0b00100000) << 2; new_byte |= (old_byte & 0b01000000) >> 4; new_byte |= (old_byte & 0b10000000) >> 3; [/quote] is this the SEG - Pins and the ohter table for the DIG-Pins, or it is very different
Re: Construction of Word Clock v1
I have looked at your picture - you soldered it correctly. Great!
The easiest way to do this is to delete the entire main() function, and put this one instead:
Focus on the line "// FINDING ROWS". This should turn ON row 1 (upper row) of the clock in the BOTTOM LEFT quarter (if you are looking at the clock from the front). If it doesn't (if it turns ON row number 5 for example), then you need to go to the "max72xx_send_matrix()" function, at the
section, and adjust this part of the code:
There we change that row index from 1 to 5 and for every other row (8 in total). Of course, you will have to change this line to to see where row 2 will be turned ON and so on for remaining 6 rows.
After you find those rows, you must also find the columns with this code:
and now you will go to the "max72xx_send_matrix()" function, at the line and move the turned ON led to the appropriate position. For example, if the code above turned on LED nr. 5 (from the right-to-left order) you must "move" it left 4 times with this:
and so on.
It is kind of difficult to explain but that's about it.
The easiest way to do this is to delete the entire main() function, and put this one instead:
Code: Select all
//############
// Main app //
//############
int main(void)
{
// Initialize Timer0 overflow ISR
TCCR0A = 0;
TCCR0B = _BV(CS00); // no prescaling, but timer started!
TIMSK0 |= _BV(TOIE0); //-for-> ISR(TIMER0_OVF_vect)
// Interrupts ON
sei();
// turn on pin-change-interrupts
pin_interrupt_init(); // this will set the DDRs for button/sensors and prepare the interrupts
STATUS_LED_PORT |= _BV(STATUS_LED_PIN); // led on
// initialize the MAX72XX chips
max72xx_init_hw(); // init the hw for MAX72XX
// RTC init
rtc_init(); // init the DS323X RTC IC
// Light sensor init
light_sensor_init(); // init the light sensor
// MAX72XX inits
max72xx_init_all(); // init all MAX chips in the system
// Check to see if there is something valid in EEPROM
uint8_t *pEE = (uint8_t *)EEPROM_START;
if( eeprom_read_byte(pEE++) == 0xAA ) // 0xAA is my "valid flag"
{
calib_light_sens_min = eeprom_read_word((uint16_t *)pEE);
pEE+=2;
calib_light_sens_max = eeprom_read_word((uint16_t *)pEE);
pEE+=2;
eeprom_read_block((void *)&disp_duration,pEE,DISP_THINGS);
pEE+=DISP_THINGS;
bools[BUSR1] = eeprom_read_byte(pEE);
}
// falsify RTC changes so it display whatever is required immediatelly
bs(bRTC_MinChg,BAPP1);
bs(bRTC_SecChg,BAPP1);
bs(bRTC_TempChg,BAPP1);
delay_ms_(1000); // startup delay
STATUS_LED_PORT &= ~_BV(STATUS_LED_PIN); // led off
// scroll some intro text...
max72xx_write(MAX72XX_COUNT+1, MAX72XX_intensity, 0x07); // set brightness to half initially
// FINDING ROWS
// max72xx_write(MAX ID 1..4, CLOCK LED ROW ADDRESS 1..8, DATA_HERE);
max72xx_write(1, 1, 0b11111111); // turn on MAX 1 - address of DIGn (this is actually a ROW in the clock)
while(1); // stop here
return 0;
}
Code: Select all
// MAX1 and MAX4 are soldered in the same fashion
Code: Select all
// now rearrange the indexes
uint8_t new_index;
switch (j)
{
case 0: new_index=0; break;
case 1: new_index=4; break;
case 2: new_index=6; break;
case 3: new_index=2; break;
case 4: new_index=3; break;
case 5: new_index=7; break;
case 6: new_index=5; break;
case 7: new_index=1; break;
}
Code: Select all
max72xx_write(1, 1, 0b11111111);
Code: Select all
max72xx_write(1, 2, 0b11111111);
After you find those rows, you must also find the columns with this code:
Code: Select all
//############
// Main app //
//############
int main(void)
{
// Initialize Timer0 overflow ISR
TCCR0A = 0;
TCCR0B = _BV(CS00); // no prescaling, but timer started!
TIMSK0 |= _BV(TOIE0); //-for-> ISR(TIMER0_OVF_vect)
// Interrupts ON
sei();
// turn on pin-change-interrupts
pin_interrupt_init(); // this will set the DDRs for button/sensors and prepare the interrupts
STATUS_LED_PORT |= _BV(STATUS_LED_PIN); // led on
// initialize the MAX72XX chips
max72xx_init_hw(); // init the hw for MAX72XX
// RTC init
rtc_init(); // init the DS323X RTC IC
// Light sensor init
light_sensor_init(); // init the light sensor
// MAX72XX inits
max72xx_init_all(); // init all MAX chips in the system
// Check to see if there is something valid in EEPROM
uint8_t *pEE = (uint8_t *)EEPROM_START;
if( eeprom_read_byte(pEE++) == 0xAA ) // 0xAA is my "valid flag"
{
calib_light_sens_min = eeprom_read_word((uint16_t *)pEE);
pEE+=2;
calib_light_sens_max = eeprom_read_word((uint16_t *)pEE);
pEE+=2;
eeprom_read_block((void *)&disp_duration,pEE,DISP_THINGS);
pEE+=DISP_THINGS;
bools[BUSR1] = eeprom_read_byte(pEE);
}
// falsify RTC changes so it display whatever is required immediatelly
bs(bRTC_MinChg,BAPP1);
bs(bRTC_SecChg,BAPP1);
bs(bRTC_TempChg,BAPP1);
delay_ms_(1000); // startup delay
STATUS_LED_PORT &= ~_BV(STATUS_LED_PIN); // led off
// scroll some intro text...
max72xx_write(MAX72XX_COUNT+1, MAX72XX_intensity, 0x07); // set brightness to half initially
// FINDING COLUMNS
// max72xx_write(MAX ID 1..4, CLOCK LED ROW ADDRESS 1..8, DATA_HERE);
max72xx_write(1, 1, 0b00000001); // turn on MAX 1 - this will turn on one column (Row-ID not important here)
while(1); // stop here
return 0;
}
Code: Select all
// now rearrange the bits into a new byte
Code: Select all
new_byte |= (old_byte & 0b00000001) << 4;
It is kind of difficult to explain but that's about it.
Re: Construction of Word Clock v1
Pielo, what kind of wood panel did you use for your clock, what wood is this?
Re: Construction of Word Clock v1
A 20 mm thick plywood panel overlaid with a phenol film (spruce)trax wrote:Pielo, what kind of wood panel did you use for your clock, what wood is this?
Re: Construction of Word Clock v1
I have a problem with these code's ...
STATUS_LED_PORT |= _BV(STATUS_LED_PIN); // led on
STATUS_LED_PORT &= ~_BV(STATUS_LED_PIN); // led off
I become again and again the same error message and I have no idea what the problem is.
Did you have ideas, what can be the problem?
STATUS_LED_PORT |= _BV(STATUS_LED_PIN); // led on
STATUS_LED_PORT &= ~_BV(STATUS_LED_PIN); // led off
I become again and again the same error message and I have no idea what the problem is.
Build started 21.1.2013 at 08:13:20
avr-gcc -mmcu=atmega328p -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT wc.o -MF dep/wc.o.d -c ../../../original/wc.c
../../../original/wc.c: In function 'main':
../../../original/wc.c:130:8: error: 'STATUS_LED_PORT' undeclared (first use in this function)
../../../original/wc.c:130:8: note: each undeclared identifier is reported only once for each function it appears in
../../../original/wc.c:130:27: error: 'STATUS_LED_PIN' undeclared (first use in this function)
make: *** [wc.o] Fehler 1
Build failed with 2 errors and 0 warnings...
Did you have ideas, what can be the problem?