bonjour,
je suis en train de développer une carte pour commander l’éclairage à diode de mon aquarium.
rapidement, je commande le tous par un pic 16f876 cadencé par un quart de 20Mhz.
Le montage comprend un écran lcd 4*16 caractères, de 4 boutons poussoirs et des 2 sorties PWM.
J'utilise le timer1 pour calculer ma seconde, les 4 boutons me servent à régler mon heure et ma minute (1 incrément heure, 1 décrément heure, 1 incrément minute, 1 décrément minute)
Les sorties PWM vont me servir à piloter mes drivers à led qui comportent une entrée PWM.
L'ecran va me servir à afficher l'heure courante, et plutard d'autre information (tel que la température de l'eau).
Il y a un événement que je ne comprend pas, quand le pic compte tous va bien ma minute défile. Par contre du moment que je touche au BP de réglage 1 coup sur 3 le timer1 s’arrête et il ne compte plus.
Le seul moyen que j'ai pour le redémarrer c'est de faire un reset.
Par contre les sorties PWM elle continue à fonctionner, la gestion de l'ecran fonctionne toujours car quand je touche au BP je voie l'heure se mettre à jour.
Je programme via MIKRObasic V6.0.0.
Y as t'il une raison particulière a ce blocage du timer1?
merci pour votre aides
voila mon code (il est simple):
program Test
dim counter as word
dim seconde1,minute1,heure1,calmin t as string[3]
dim seconde,minute,heure, calmin,calmin1 as byte
' Lcd module connections
dim LCD_RS as sbit at RB4_bit
LCD_EN as sbit at RB5_bit
LCD_D4 as sbit at RB0_bit
LCD_D5 as sbit at RB1_bit
LCD_D6 as sbit at RB2_bit
LCD_D7 as sbit at RB3_bit
LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D4_Direction as sbit at TRISB0_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D7_Direction as sbit at TRISB3_bit
sub procedure Interrupt()
Inc(counter) ' Increment value of counter on every interrupt
PIR1.TMR1IF = 0 ' clear TMR1IF
TMR1H = 0x0B
TMR1L = 0xDB
end sub
main:
PORTB = 0x00 ' Initialize PORTB
TRISB = 0xC0 ' PORTB is output
PORTC = 0x00 ' Initialize PORTA
TRISC = 0xFF ' PORTA is input
T1CON = 0x31 ' Timer1 settings
PIR1.TMR1IF = 0 ' clear TMR1IF
TMR1H = 0x0B
TMR1L = 0xDB
PIE1.TMR1IE = 1 ' enable Timer1 interrupt
counter = 0 ' initialize counter
INTCON = 0xC0 ' Set GIE, PEIE
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
seconde=0
minute=0
heure=0
PWM1_Init(5000)
PWM1_Set_Duty(0)
PWM1_Start()
PWM2_Init(5000)
PWM2_Set_Duty(0)
PWM2_Start()
while TRUE
if (counter = 1) then ' if counter is 10 pour 1s
inc(seconde)
counter = 0 ' reset counter
end if
if (seconde=60) then
inc(minute)
seconde=0
end if
if (minute=60) then
inc(heure)
minute=0
end if
if (minute>60) then
minute=59
end if
if (heure=24) then
heure=0
end if
if (heure>24) then
heure=23
end if
if Button(PORTC, 6, 10, 1) then
inc(minute)
end if
if Button(PORTC, 7, 10, 1) then
dec(minute)
end if
if Button(PORTB, 6, 10, 1) then
inc(heure)
end if
if Button(PORTB, 7, 10, 1) then
dec(heure)
end if
ByteToStr(seconde,seconde1)
ByteToStr(minute,minute1)
ByteToStr(heure,heure1)
LCD_Out(2,9,seconde1)
LCD_Out(2,8,":")
LCD_Out(2,5,minute1)
LCD_Out(2,4,":")
LCD_Out(2,1,heure1)
if (heure=8) then
if (minute<31) then
PWM1_Set_Duty(minute*8)
end if
if (minute>30) then
PWM1_Set_Duty(255)
end if
end if
if (heure=19) then
if (minute<31) then
calmin = minute*8
calmin1 = 255-calmin
PWM1_Set_Duty(calmin1)
end if
if (minute>30) then
PWM1_Set_Duty(0)
end if
end if
wend
end.
-----