Beruflich Dokumente
Kultur Dokumente
"ch.h"
"hal.h"
"chprintf.h"
"max7219.h"
/*===========================================================================*/
/* LED Matrix related code.
*/
/*===========================================================================*/
#define MAX_PRESET_NUMB
//#define MAX_PRESET_NUMB
#define MAX_DIGITS
26
10
8
0x84,
0x86,
0x00,
0x3F,
0xDF,
0x7E,
0x03,
0x76,
0x8E,
0xFF,
0xFF,
0xFF,
0xFF,
0xFF,
0xFF,
0xFF,
0x24,
0x00,
0xF0,
0xF0,
0x00,
0x00,
0x7E,
0x81,
0x7E,
0x00,
0x86,
0xC7,
0x42,
0x3F,
0xDB,
0xFF,
0x03,
0xFF,
0x91,
0xFF,
0xFF,
0xFF,
0xFF,
0xFF,
0xFF,
0xFF,
0x18,
0x00,
0xFC,
0xFC,
0x00,
0x3C,
0x42,
0x81,
0x42,
0x3C,
0xFF,
0xE1,
0xC3,
0x20,
0xDB,
0x89,
0xE3,
0x99,
0x91,
0xC0,
0xC0,
0xC0,
0xC0,
0xC0,
0xC0,
0xC0,
0x18,
0x00,
0xF2,
0xF2,
0x18,
0x24,
0x42,
0x81,
0x42,
0x24,
0xFF,
0xB1,
0xDB,
0x20,
0xDB,
0x89,
0xFB,
0x99,
0x91,
0xFF,
0xC2,
0xC3,
0xC3,
0x3F,
0x8E,
0xFF,
0x18,
0x00,
0xF2,
0xF2,
0x18,
0x24,
0x42,
0x81,
0x42,
0x24,
0x80,
0x9F,
0xFF,
0xF8,
0xFB,
0x89,
0x1F,
0xFF,
0xFF,
0xC3,
0xFF,
0xF1,
0xDB,
0x20,
0x99,
0x91,
0x1E,
0x00,
0xF0,
0xFC,
0x00,
0x3C,
0x42,
0x81,
0x42,
0x3C,
0x80,
0x8E,
0x66,
0xF8,
0x71,
0x70,
0x07,
0x76,
0x7E,
0xC3,
0xFF,
0x9D,
0xDB,
0xF0,
0x91,
0x91,
0x18,
0x00,
0xF0,
0xF0,
0x00,
0x00,
0x7E,
0x81,
0x7E,
0x00,
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0xFF},
0xC0},
0x8F},
0x7E},
0x20},
0x61},
0xF1},
0x1E},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0xFF},
0x00},
0x00},
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
/**<
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
LOCK.
niente
catenaccioaperto
catenacciochiuso
SIMBOLO1
SIMBOLO2
SIMBOLO3
SIMBOLO4
SIMBOLO3
SIMBOLO2
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
};
/*===========================================================================*/
/* SPI related code.
*/
/*===========================================================================*/
#define
#define
#define
#define
GPIOB_SPID1_CS
GPIOA_SPID1_SCK
GPIOA_SPID1_MISO
GPIOA_SPID1_MOSI
6
5
6
7
/*
/*
/*
port of CS */
pin of CS */
CR1 register */
8
9
{EXT_CH_MODE_DISABLED, NULL},
{EXT_CH_MODE_DISABLED, NULL},
{EXT_CH_MODE_DISABLED, NULL},
{EXT_CH_MODE_DISABLED, NULL},
{EXT_CH_MODE_FALLING_EDGE |
EXT_CH_MODE_AUTOSTART |
EXT_MODE_GPIOB, ExtCallBack},
{EXT_CH_MODE_DISABLED, NULL},
{EXT_CH_MODE_DISABLED, NULL},
{EXT_CH_MODE_DISABLED, NULL},
{EXT_CH_MODE_DISABLED, NULL},
{EXT_CH_MODE_DISABLED, NULL},
{EXT_CH_MODE_DISABLED, NULL},
{EXT_CH_MODE_DISABLED, NULL},
{EXT_CH_MODE_DISABLED, NULL},
{EXT_CH_MODE_DISABLED, NULL},
{EXT_CH_MODE_DISABLED, NULL},
{EXT_CH_MODE_DISABLED, NULL},
{EXT_CH_MODE_DISABLED, NULL},
{EXT_CH_MODE_DISABLED, NULL}
}
};
/*===========================================================================*/
/* PWM related code
*/
/*===========================================================================*/
static void pwmpcb(PWMDriver *pwmp) {
(void)pwmp;
}
static void pwmc3cb(PWMDriver *pwmp) {
(void)pwmp;
if(!palReadPad(GPIOB, GPIOB_SDO))
matrixlatch |= (1 << ii);
ii++;
if (ii == 16)
chEvtBroadcastFlags(&TTP229, 0);
}
static PWMConfig pwmcfg = {
1000000,
10,
*/
pwmpcb,
{
{PWM_OUTPUT_DISABLED, NULL},
{PWM_OUTPUT_DISABLED, NULL},
{PWM_OUTPUT_ACTIVE_LOW, pwmc3cb},
{PWM_OUTPUT_DISABLED, NULL}
},
0,
0
};
/*===========================================================================*/
/* THD3
*/
/*===========================================================================*/
static THD_WORKING_AREA(waThd3, 128);
static THD_FUNCTION(Thd3, arg) {
(void) arg;
chRegSetThreadName("timer iniziale");
while(TRUE)
{
if(conteggio<11)
{
if(attivazione) {
for(kk = 0; kk < MAX_DIGITS; kk++)
{
max7219WriteRegister(&SPID1, MAX7219_AD_DIGIT_0 + (kk << 8),
presets[numero][kk]);
}
numero=numero-1;
conteggio=conteggio+1;
}
}
chThdSleepMilliseconds(995);
}
}
/*===========================================================================*/
/* THD1
*/
/*===========================================================================*/
static THD_WORKING_AREA(waThd1, 128);
static THD_FUNCTION(Thd1, arg) {
(void) arg;
chRegSetThreadName("Attiva Allarme");
while(TRUE) {
if(allarme){
palSetPad(GPIOA,GPIOA_LED_GREEN);
if(rivelataprimapresenza==0){
resetpresenza++;
chprintf(chp,"resetpresenza %d \n\r", resetpresenza);
if(resetpresenza>50){
for(tt = 0; tt < MAX_DIGITS; tt++)
{
max7219WriteRegister(&SPID1, MAX7219_AD_DIGIT_0 + (tt << 8),
presets
[16][tt]);
chThdSleepMilliseconds(50);
rivelataprimapresenza=1;
}
if(palReadPad(GPIOA,10) && rivelataprimapresenza==0)
attivazione=1;
palSetPad(GPIOA, 1);
chThdSleepMilliseconds(300);
palClearPad(GPIOA, 1);
rivelataprimapresenza=1;
}
}
/* al pin del led connesso anche il sensore di presenza*/
else
{
palClearPad(GPIOA,GPIOA_LED_GREEN);
attivazione=0;conteggio=0;rivelataprimapresenza=0;
palClearPad(GPIOA, 1);
}
/*if(b)
{palSetPad(GPIOA, 1);
chThdSleepMilliseconds(100);
palClearPad(GPIOA, 1);
b=0;} */
chThdSleepMilliseconds(50);
}
}
/*===========================================================================*/
/* THD2
*/
/*===========================================================================*/
static THD_WORKING_AREA(waThd2, 128);
static THD_FUNCTION(Thd2, arg) {
(void) arg;
chRegSetThreadName("Matrix handler");
chEvtObjectInit(&TTP229);
chEvtRegister(&TTP229, &myel, 0);
palSetPadMode(GPIOB, GPIOB_SCL, PAL_MODE_ALTERNATE(2));
palSetPadMode(GPIOB, GPIOB_SDO, PAL_MODE_INPUT | PAL_STM32_OSPEED_HIGHEST);
while(TRUE) {
extStart(&EXTD1, &extcfg);
chEvtWaitAny(ALL_EVENTS);
extStop(&EXTD1);
ii = 0;
matrixlatch = 0;
pwmStart(&PWMD4, &pwmcfg);
pwmEnableChannelNotification(&PWMD4, 2);
pwmEnableChannel(&PWMD4, 2, PWM_PERCENTAGE_TO_WIDTH(&PWMD4, 5000));
chEvtWaitAny(ALL_EVENTS);
pwmStop(&PWMD4);
}
}
/*-------------------------------------------------------------------------------------------------------------------------------* Application entry point.
*/
int main(void) {
/*
* System initializations.
* - HAL initialization, this also initializes the configured device drivers
* and performs the board-specific initializations.
* - Kernel initialization, the main() function becomes a thread and the
* RTOS is active.
*/
halInit();
chSysInit();
palSetPadMode(GPIOA, 1,
PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST);
/*
* SPID1 I/O pins setup.(It bypasses board.h configurations)
*/
palSetPadMode(GPIOA, GPIOA_SPID1_SCK,
PAL_MODE_ALTERNATE(5) | PAL_STM32_OSPEED_HIGHEST);
/* New SC
palSetPadMode(GPIOA, GPIOA_SPID1_MISO,
PAL_MODE_ALTERNATE(5) | PAL_STM32_OSPEED_HIGHEST);
/* New MI
K */
SO*/
palSetPadMode(GPIOA, GPIOA_SPID1_MOSI,
PAL_MODE_ALTERNATE(5) | PAL_STM32_OSPEED_HIGHEST);
/* New MO
SI*/
palSetPadMode(GPIOB, GPIOB_SPID1_CS,
PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST);/* New CS
*/
spiStart(&SPID1, &spicfg);
max7219WriteRegister(&SPID1, MAX7219_AD_DISPLAY_TEST, FALSE);
max7219WriteRegister(&SPID1, MAX7219_AD_SHUTDOWN, MAX7219_OM_Normal);
max7219WriteRegister(&SPID1, MAX7219_AD_SCAN_LIMIT, MAX7219_SL_7);
max7219WriteRegister(&SPID1, MAX7219_AD_DECODE_MODE,
MAX7219_DM_No_decode);
max7219WriteRegister(&SPID1, MAX7219_AD_INTENSITY,
MAX7219_IM_31_32);
/*
* Here we are creating two threads.
*/
chThdCreateStatic(waThd1, sizeof(waThd1), NORMALPRIO + 1, Thd1, NULL);
chThdCreateStatic(waThd2, sizeof(waThd2), NORMALPRIO + 2, Thd2, NULL);
chThdCreateStatic(waThd3, sizeof(waThd3), NORMALPRIO + 1, Thd3, NULL);
sdStart(&SD2, NULL);
/*
* Normal main() thread activity: nothing.
*/
int k=0;
int combinazione[4];
int codice[4];
int g=0;
int y=0;
int password[4]={1,16,4,13};
while (TRUE) {
resetcombinazione++;
//chprintf(chp,"resetcombinazione %d \n\r", resetcombinazione);
if((!allarme) && (resetcombinazione>200))
{
for(tt = 0; tt < MAX_DIGITS; tt++)
{
max7219WriteRegister(&SPID1, MAX7219_AD_DIGIT_0 + (tt << 8), preset
s[16][tt]);
chThdSleepMilliseconds(50);
}
for(tt = 0; tt < MAX_DIGITS; tt++)
{
max7219WriteRegister(&SPID1, MAX7219_AD_DIGIT_0 + (tt << 8), preset
s[17][tt]);
}
resetcombinazione=0;
k=0;
}
if(attivazione==1 && conteggio==11 )
{
palTogglePad(GPIOA,1);
reset++;
/*chprintf(chp,"reset %d \n\r", reset);*/
if (reset==100)
{
k=0;
reset=0;
for(tt = 0; tt < MAX_DIGITS; tt++)
{
max7219WriteRegister(&SPID1, MAX7219_AD_DIGIT_0 + (tt << 8), pre
sets[16][tt]);
chThdSleepMilliseconds(50);
}
}
for(tt = 0; tt < MAX_DIGITS; tt++)
{
max7219WriteRegister(&SPID1, MAX7219_AD_DIGIT_0 + (tt << 8), presets
[pp][tt]);
}
pp++;
if(pp==26)
{
pp=20;
}
}
for(jj = 0; jj < 16; jj++)
{
/*riempimento combinazione o codice*/
if(matrixlatch & (1 << jj))
{
if(k<4)
{
palSetPad(GPIOA, 1);
for(tt = 0; tt < MAX_DIGITS; tt++)
{
max7219WriteRegister(&SPID1, MAX7219_AD_DIGIT_0 + (tt
<< 8), presets[jj][tt]);
}
chThdSleepMilliseconds(250);
palClearPad(GPIOA, 1);
for(tt = 0; tt < MAX_DIGITS; tt++)
{
max7219WriteRegister(&SPID1, MAX7219_AD_DIGIT_0 + (
tt << 8),
presets
[17][tt]);
}
chprintf(chp,"Button %d pressed\n\r", jj + 1);
if(!allarme){
// if(resetcombinazione>200){k=0;
// resetcombinazione=0;
// }
combinazione[k]=jj+1;
k++;}
if(allarme){
for(tt = 0; tt < MAX_DIGITS; tt++)
{
max7219WriteRegister(&SPID1, MAX7219_AD_DIGIT_0 + (t
t << 8),
presets[17][tt]);
}
codice[k]=jj+1;
k++;}
}
}
/*-----------------*/
if(k==4) {
if(!allarme)
{
allarme=1;
chprintf(chp," combinazione= ") ;
for(g=0;g<4;g++){
chprintf(chp," %d ", combinazione[g]) ;}
chprintf(chp," \n\r ");
k=0;g=0;
}
else {
chprintf(chp," codice= ") ;
for(g=0;g<4;g++){
chprintf(chp," %d ", codice[g]) ;
if (combinazione[g]==codice[g] )
{
y=y+1;
}
if (password[g]==codice[g] )
{
r=r+1;
}
}
chprintf(chp," \n\r ");
if(y==4 || r==4)
{numero=9;
allarme=0;
for(tt = 0; tt < MAX_DIGITS; tt++)
{
max7219WriteRegister(&SPID1, MAX7219_AD_DIGIT_
0 + (tt << 8),
presets[18][tt
]);
}
chprintf(chp," allarme disattivato\n\r ") ;
reset=0; resetcombinazione=0; resetpresenza=0;
chThdSleepMilliseconds(400);
for(tt = 0; tt < MAX_DIGITS; tt++)
{
max7219WriteRegister(&SPID1, MAX7219_AD_DIGIT_0 + (tt
<< 8),
presets[17][
tt]);
}
}
else {
chprintf(chp," codice errato\n\r ") ;
}
k=0;g=0; y=0;r=0;
}
}
}
matrixlatch = 0;
chThdSleepMilliseconds(100);
}
}