dimanche 18 août 2013

timer1 pic 16f876 qui bloque

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.





via Forum FS Generation http://forums.futura-sciences.com/electronique/611436-timer1-pic-16f876-bloque.html

Aucun commentaire:

Enregistrer un commentaire