Autor Tema: TIEMPO MINIMO PARA DISPARAR UN TRIAC  (Leído 5033 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado andyros

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 70
TIEMPO MINIMO PARA DISPARAR UN TRIAC
« en: 29 de Agosto de 2004, 16:51:00 »
Hola,  voy a intentar hacer un dimmer y necesito saber el tiempo minimo para disparar el triac en cada semiciclo, el triac que voy a utilizar es el bta 16 -700b , aqui os dejo la direccion de la hoja de datos , yo le he echado un vistazo pero no me entero de nada, asi que si podeis echarme una mano estare agradecido.

http://www.st.com/stonline/books/pdf/docs/7471.pdf

UN SALUDO

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: TIEMPO MINIMO PARA DISPARAR UN TRIAC
« Respuesta #1 en: 29 de Agosto de 2004, 23:23:00 »
Andyros, ¿qué es un dimmer?

Desconectado andyros

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 70
RE: TIEMPO MINIMO PARA DISPARAR UN TRIAC
« Respuesta #2 en: 30 de Agosto de 2004, 04:10:00 »
Hola Nocturno, si no me equivoco un dimmer es un regulador de intensidad, vamos , el tipico programita que hace  que se apague y se encienda una bombilla progresivamente,  lo quiero meter en el juego de luces de navidad, ya lo queria meter el año pasado pero no llegue a tiempo, es mas, coloque mi luces a mitad de diciembre a ver si empezando ahora hacemos un programa decente con el pic   .
Y por eso quiero saber exactamente el tiempo minimo de excitacion del triac en cada semiperiodo, para poder controlar el tiempo restante.

Os explico un poco mi idea, la red tiene 50 Hz es decir la señal alterna sube pasa por cero  baja y vuelve a pasar por cero, 50 veces por segundo , entonces cada periodo dura 1/50 = 0"02 segundos es decir 20ms, y un semiperiodo 10 ms con este es con el que trabajaremos,  este semiperiodo lo quiero dividir entre 256 menos el tiempo de excitacion .

Al triac le podemos decir cuando conducira pero una vez iniciado,  no parara hasta el siguiente paso por cero.

Un ejemplo,  si conseguimos controlar el tiempo y hacemos que empieze a conducir desde la mitad del semiperiodo lograremos que la bombilla se ilumine al 50 %, es decir empieza el semiperiodo esperamos 5 ms y excitamos al triac y en el siguiente paso por cero se apaga con esto obtenemos una iluminacion del 50% y jugando con el tiempo tendremos las restantes.

El detector de paso por cero mas o menos creo que lo tengo claro, mediante una interrupcion detectare el paso por cero y el programa a rular .
Bueno,  todo esto lo he sacado de lo que he ido leyendo y de la ayuda de un amigo y de momento es lo que tengo pensado,  es facil que se me haya pasado algun detalle asi que espero vuestra colaboracion .


UN SALUDO

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: TIEMPO MINIMO PARA DISPARAR UN TRIAC
« Respuesta #3 en: 30 de Agosto de 2004, 06:48:00 »
Lo quieres hacer con o sin micro??
Sin micro la cosa es muy sencilla. Con 4 componentes puedes (aunque mejor uno con 7 componentes). Triac, diac, dos condensadores, dos resistencias y un potenciaómetro. Es el típico circuito que llevan este tipo de interruptores en las luces de las casas.

Si lo quieres con micro, por el foro hay un ejemplo de uno hecho en basic. Yo lo tengo en mi pc por si das con él.

Saludos!
Saludos desde Huelva (ESPAÑA)

Desconectado andyros

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 70
RE: TIEMPO MINIMO PARA DISPARAR UN TRIAC
« Respuesta #4 en: 31 de Agosto de 2004, 07:25:00 »
Hola Cucaracha , lo quiero hacer con el pic 16f84a ( a ver si un dia de estos empiezo con el pic 16f88 que nuestro viejo amigo se ha quedado desfasado, pero la verdad, cuesta un poco dar el paso ) por que quiero que el pic vaya cambiando el tiempo progresivamente el solito.

Para aislar el circuito tengo pensado ponerle el moc 3020 que no posse un detector de paso por cero y asi que el pic controle  la excitacion del triac.

Cucaracha yo trabajo en ensamblador , podrias decirme ¿ cuanto tiempo esta en alto la salida que excita al triac en ese programa ? .


Un saludo

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: TIEMPO MINIMO PARA DISPARAR UN TRIAC
« Respuesta #5 en: 31 de Agosto de 2004, 08:45:00 »
Te envío por privado ese circuito, porque de basic no tengo ni papa.

O mejor... Lo encontré por el foro. Así si alguien más lo quiere ya sabe donde localizarlo:
http://miarroba.com/foros/ver.php?temaid=621018&foroid=8826


Saludos!!
Saludos desde Huelva (ESPAÑA)

Desconectado andyros

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 70
RE: TIEMPO MINIMO PARA DISPARAR UN TRIAC
« Respuesta #6 en: 31 de Agosto de 2004, 09:57:00 »
Hola, pues yo tampoco entiendo nada , lo unico que parece claro es que entre el nivel alto y bajo pone esto   PAUSEUS 100   pero no se exactamente cuanto es, a ver si alguien que trabaje en este sistema nos lo puede explicar .

UN SALUDO

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: TIEMPO MINIMO PARA DISPARAR UN TRIAC
« Respuesta #7 en: 01 de Septiembre de 2004, 06:16:00 »
La instruccion PAUSEUS 100 es un delay de 100 microsegundos.
Llevado a assembler con reloj de 4 Mhz esto puedes hacerlo con 100 nop"s  !!
Je..je.. parece absurdo no ??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado andyros

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 70
RE: TIEMPO MINIMO PARA DISPARAR UN TRIAC
« Respuesta #8 en: 01 de Septiembre de 2004, 08:00:00 »
Hola , he estado mirando unos ejemplos y cada uno pone un delay diferente el ultimo que he visto hacia un delay de 225, otro 5 microsegundos,  asi que creo que al final me tocara probar, y en la hoja de datos sigo sin encontrar esta informacion.

MGLSOFT , tengo una rutina de delay  ,  asi que de los 100 nop queda descartado  .

Gracias por vuestra ayuda

UN SALUDO

Desconectado juno303

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 103
RE: TIEMPO MINIMO PARA DISPARAR UN TRIAC
« Respuesta #9 en: 04 de Septiembre de 2004, 18:57:00 »
usa el detector de cruce por cero, cuando sea cero, tu rutina se va a cargar, larga el pulso, y espera que el detector de cruce por cero ya no sea cero, significa que ya esta conduciendo, bueno, ese es el tiempo.  

Ahora, quisiera preguntar a alguien que tenga experiencia con triacs, que puede hacer que un triac se queme ??? Tuve varias experiencias, algunos quedan en corto otros abiertos, que puede ser ? Sobrecarga no creo ya que probe con un triac de 10 veces la carga que soporta. Uso el dimmer comun sin micro.

SALUDOS

Desconectado fuente

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 573
RE: TIEMPO MINIMO PARA DISPARAR UN TRIAC
« Respuesta #10 en: 05 de Septiembre de 2004, 05:08:00 »
Juno, mira a ver el tipo de carga que le pones.

Los triacs se comportan bastante mal con cargas inductivas y capacitivas.

Hace un año, más o menos, Elektor publicó un dimmer con mando a distancia mediante un At89c2051, intentaré buscarlo. El problema es que utilizaba un optotriac que todavía no he conseguido localizar en las tiendas.

Desconectado Ignite

  • PIC16
  • ***
  • Mensajes: 107
RE: TIEMPO MINIMO PARA DISPARAR UN TRIAC
« Respuesta #11 en: 05 de Septiembre de 2004, 07:08:00 »
Hi!!!!!
La verdad es ke no tengo mucha idea de triacs, pero si no recuerdo mal para poder disparar un triac simplemente tienes que superar un umbral de corriente para que se quede enganchado. Debido a esto no tendría que existir un retardo entre que se detecta el paso por cero y que se pueda activar el triac?

Saludos.

Desconectado Doninicano

  • PIC10
  • *
  • Mensajes: 1
RE: TIEMPO MINIMO PARA DISPARAR UN TRIAC
« Respuesta #12 en: 06 de Septiembre de 2004, 00:12:00 »
Hola que tal

        Aqui tienes un programa para un pic12c508 .
no quiso ser adjuntado. mandame tu email.


MPLAB-C "C" COMPILER V1.21 Released PAGE 1
#pragma option v;
#include <12C508.h>
#ifndef _12C508_H
/*
PIC12C508 Standard Header File, Version 1.02
(c) Copyright 1996 Microchip Technology, Inc., Byte Craft Limited
RAM locations reserved for temporary variables: 0x07
*/
#pragma option +l;
#endif
/********************************************************/
/* DIMMER.C */
/* */
/* Lamp dimmer for the 12C508. */
/* This program uses the internal 4MHz oscillator */
/* To drive TRIAC, the output is taken high */
/* or put in high-impeadance(open drain) to release it*/
/* */
/* NOTE: This program is designed to work with a 60Hz */
/* line frequency, it must be modified if used */
/* on a 50Hz AC line. */
/* */
/* GPIO<0> = Dim button */
/* GPIO<1> = No Connect */
/* GPIO<2> = Output to TRIAC */
/* GPIO<3> = Bright Button */
/* GPIO<4> = Zero Crossing sense input */
/* GPIO<5> = No Connect */
/********************************************************/
0007 #define Brtbut GPIO.0 //Brighten button
0008 #define Output GPIO.2 //Output to TRIAC
0009 #define Dimbut GPIO.3 //Dim button
000A #define LineInput GPIO.4 //AC line zero crossing sense
void Buttoncheck(void); //Button check routine
0008 0009 unsigned int PercentOn, Maxdim ; //Global variables
000A 000B 000C unsigned int TestCheck, Outcount, TestCount;
000D unsigned int DelayCnt;
000E 000F unsigned int LastBoth, FirstPass;
0010 unsigned int Count;
007E 0001 const Maxbrt = 0xFD, NotInTest = 3;
void main()
{
0001 0CD0 MOVLW D0h PercentOn = 0xD0; //On Period
0002 0028 MOVWF 08
0003 0C70 MOVLW 70h Maxdim = 0x70; //Value of Maximum dimming
0004 0029 MOVWF 09
0005 006A CLRF 0A TestCheck = 0; //Test mode check counter
0006 006B CLRF 0B Outcount = 0; //Counter for test mode exit
0007 006C CLRF 0C TestCount = 0; //Test mode counter
0008 0C03 MOVLW 03h DelayCnt = NotInTest; //Delay count
0009 002D MOVWF 0D
000A 006E CLRF 0E LastBoth = 0; //Both buttons pressed last time flag
000B 0C01 MOVLW 01h FirstPass = 1; //Indicate power-up
000C 002F MOVWF 0F
000D 0070 CLRF 10 Count = 0; //General counter
000E 0070 CLRF 10 for(Count = 0; Count < 60; Count++) //Allow power supply
to stabilize
000F 0C3C MOVLW 3Ch
0010 0090 SUBWF 10,W
0011 0603 BTFSC 03,0
0012 0A1A GOTO 001Ah
{0013 0686 BTFSC 06,4 while(LineInput == 1);
0014 0A13 GOTO 0013h
0015 0786 BTFSS 06,4 while(LineInput == 0);
0016 0A15 GOTO 0015h
0017 0004 CLRWDT CLRWDT;
}
0018 02B0 INCF 10
0019 0A0F GOTO 000Fh
WREG = 0x85;
001A 0C85 MOVLW 85h #asm ( OPTION);
001B 0002 OPTION
WREG = 0x1D;
001C 0C1D MOVLW 1Dh #asm ( TRIS GPIO);
001D 0006 TRIS PORTB
// __OPTION(0x85); //1:64 tmr0 prescaler, pullups enabled
// __TRIS(0x1D,GPIO); //Set up I/O
001E 0C04 MOVLW 04h GPIO = 0x04; //Set TRIAC output latch high
001F 0026 MOVWF 06
while(LineInput == 1) //Synch to line phase
0020 0786 BTFSS 06,4
0021 0A24 GOTO 0024h
0022 0004 CLRWDT CLRWDT;
0023 0A20 GOTO 0020h
0024 0208 MOVF 08,W TMR0 = PercentOn; //Get Delay time
0025 0021 MOVWF 01
0026 0C03 MOVLW 03h while(TMR0 >= 3 && LineInput == 0) //Delay to enter main
at proper point
0027 0081 SUBWF 01,W
0028 0703 BTFSS 03,0
0029 0A2E GOTO 002Eh
002A 0686 BTFSC 06,4
002B 0A2E GOTO 002Eh
002C CLRWDT;
002C 0004 CLRWDT
002D 0A26 GOTO 0026h
while(1) //Stay in this loop
{
002E 0070 CLRF 10
002F Count = 0;
while (Count++ < DelayCnt) //Check for button press every
DelayCnt zero crossings
002F 0210 MOVF 10,W {
0030 02B0 INCF 10
0031 008D SUBWF 0D,W
0032 0743 BTFSS 03,2
0033 0703 BTFSS 03,0
0034 0AA5 GOTO 00A5h
0035 if(LineInput == 1) //Check for AC line already high
0035 0786 BTFSS 06,4 {
0036 0A40 GOTO 0040h
0037 0C05 MOVLW 05h Maxdim += 5; //If so, increment Maxdim
0038 01E9 ADDWF 09
0039 0686 BTFSC 06,4 while(LineInput == 1); // and re-sync with line
003A 0A39 GOTO 0039h
003B 0686 BTFSC 06,4 while(LineInput == 0)
003C 0A3F GOTO 003Fh
003D CLRWDT;
003D 0004 CLRWDT
003E 0A3B GOTO 003Bh
}
003F 0A4A GOTO 004Ah else
{
0040 0686 BTFSC 06,4 while(LineInput == 0) //Wait for zero crossing
0041 0A44 GOTO 0044h
0042 CLRWDT;
0042 0004 CLRWDT
0044 0201 MOVF 01,W Maxdim = PercentOn - TMR0 + 2; //Compensate full dim
value for line
0045 0088 SUBWF 08,W
0046 0027 MOVWF 07
0047 0C02 MOVLW 02h
0048 01C7 ADDWF 07,W
0049 0029 MOVWF 09
// frequency vs osc. speed
}
004A 0C01 MOVLW 01h if(FirstPass == 1) //If first pass, go to full dim
004B 008F SUBWF 0F,W
004C 0743 BTFSS 03,2
004D 0A51 GOTO 0051h
004E {
004E 006F CLRF 0F FirstPass = 0;
004F 0209 MOVF 09,W PercentOn = Maxdim;
0050 0028 MOVWF 08
}
0051 0209 MOVF 09,W if(PercentOn < Maxdim) //If maxdim moved, fix brightness
0052 0088 SUBWF 08,W
0053 0743 BTFSS 03,2
0054 0603 BTFSC 03,0
0055 0A58 GOTO 0058h
0056 0209 MOVF 09,W PercentOn = Maxdim;
0057 0028 MOVWF 08
0058 0208 MOVF 08,W TMR0 = PercentOn; //Get delay time
0059 0021 MOVWF 01
005A 0C03 MOVLW 03h while(TMR0 >= 3 && LineInput == 1) //Delay TRIAC turn on
(wait for Counter rollover)
005B 0081 SUBWF 01,W
005C 0703 BTFSS 03,0
005D 0A62 GOTO 0062h
005E 0786 BTFSS 06,4
005F 0A62 GOTO 0062h
0060 CLRWDT;
0060 0004 CLRWDT
0061 0A5A GOTO 005Ah
0062 0C04 MOVLW 04h GPIO = 0x04; //Set TRIAC output latch high
0063 0026 MOVWF 06
WREG = 0x19;
0064 0C19 MOVLW 19h #asm ( TRIS GPIO);
0065 0006 TRIS PORTB
// __TRIS(0x19,GPIO); //Fire Triac
0066 0000 NOP NOP; //Delay for TRIAC fire pulse
0067 0000 NOP NOP;
0068 0000 NOP NOP;
0069 0000 NOP NOP;
006A 0000 NOP NOP;
006B 0000 NOP NOP;
006C 0000 NOP NOP;
WREG = 0x1D;
006D 0C1D MOVLW 1Dh #asm ( TRIS GPIO);
006E 0006 TRIS PORTB
// __TRIS(0x1D,GPIO); //Release TRIAC fire signal
006F 0004 CLRWDT CLRWDT;
0070 0686 BTFSC 06,4 if(LineInput == 0) //Check for AC line already low
0071 0A7B GOTO 007Bh
0072 {
0072 0C05 MOVLW 05h Maxdim += 5; //If so, increment Maxdim
0073 01E9 ADDWF 09
0074 0786 BTFSS 06,4 while(LineInput == 0); // and re-sync with line
0075 0A74 GOTO 0074h
while(LineInput == 1)
0077 0A7A GOTO 007Ah
0078 0004 CLRWDT CLRWDT;
0079 0A76 GOTO 0076h
}
007A 0A85 GOTO 0085h else
{
while(LineInput==1) //Wait for zero crossing
007B 0786 BTFSS 06,4
007C 0A7F GOTO 007Fh
007D 0004 CLRWDT CLRWDT;
007E 0A7B GOTO 007Bh
007F 0201 MOVF 01,W Maxdim = PercentOn - TMR0 + 2; //Compensate full dim value for
line
0080 0088 SUBWF 08,W
0081 0027 MOVWF 07
0082 0C02 MOVLW 02h
0083 01C7 ADDWF 07,W
0084 0029 MOVWF 09
// frequency vs osc. speed
}
0085 0209 MOVF 09,W if(PercentOn < Maxdim) //If maxdim moved, fix brightness
0086 0088 SUBWF 08,W
0087 0743 BTFSS 03,2
0088 0603 BTFSC 03,0
0089 0A8C GOTO 008Ch
008A 0209 MOVF 09,W PercentOn = Maxdim;
008B 0028 MOVWF 08
008C 0208 MOVF 08,W TMR0 = PercentOn; //Get Delay time
008D 0021 MOVWF 01
008E 0C03 MOVLW 03h while(TMR0 >= 3 && LineInput == 0) //Delay TRIAC turn on
008F 0081 SUBWF 01,W
0090 0703 BTFSS 03,0
0091 0A96 GOTO 0096h
0092 0686 BTFSC 06,4
0093 0A96 GOTO 0096h
0094 CLRWDT;
0094 0004 CLRWDT
0095 0A8E GOTO 008Eh
0096 0C04 MOVLW 04h GPIO = 0x04; //Set TRIAC output latch high
0097 0026 MOVWF 06
WREG = 0x19;
0098 0C19 MOVLW 19h #asm ( TRIS GPIO);
0099 0006 TRIS PORTB
// __TRIS(0x19,GPIO); //Fire TRIAC
009A 0000 NOP NOP; //Delay for TRIAC fire pulse
009B 0000 NOP NOP;
009C 0000 NOP NOP;
009D 0000 NOP NOP;
009E 0000 NOP NOP;
009F 0000 NOP NOP;
00A0 0000 NOP NOP;
WREG = 0x1D;
00A1 0C1D MOVLW 1Dh #asm ( TRIS GPIO);
00A2 0006 TRIS PORTB
// __TRIS(0x1D,GPIO); //Release TRIAC fire signal
00A3 0004 CLRWDT CLRWDT;
00A4 0A2F GOTO 002Fh }
00A5 09A8 CALL 00A8h Buttoncheck(); //Check for button press
00A6 0A2E GOTO 002Eh }
00A7 0800 RETLW 00h }
/********************************************************/
/* ButtonCheck */
/* */
/* This subroutine checks for presses on the BRT and DIM*/
/* buttons and increments or decrements PercentOn. */
/* */
/* If both buttons are pressed and the lamp */
/* is not off, it is turned off, if off, it is set to */
/* to max bright. */
/* */
/* In addition, a test function is built in. If both */
/* buttons are pressed, the dim let go and then pressed */
/* again, test mode is entered. If dim is pressed */
/* (alone), the program goes to normal operation at max */
/* dim. The test mode brightens to full bright, dims to*/
/* full dim, flashes full bright twice, and repeats. */
/********************************************************/
void Buttoncheck()
{
00A8 0000 NOP NOP; //Bugfix for MPLABC V1.10
00A9 0C03 MOVLW 03h if(TestCheck == 3) //Check test mode flag
00AA 008A SUBWF 0A,W
00AB 0743 BTFSS 03,2
00AC 0B1B GOTO 011Bh
00AD {
00AD 0C02 MOVLW 02h DelayCnt = 2; //Reset the delay count
00AE 002D MOVWF 0D
00AF 0706 BTFSS 06,0 if(Brtbut && !Dimbut) //If Dimbutton pressed, exit test mode
00B0 0AB7 GOTO 00B7h
00B1 0666 BTFSC 06,3
00B2 0AB7 GOTO 00B7h
00B3 {
00B3 006A CLRF 0A TestCheck = 0; //Clear Test mode flag
00B4 0C05 MOVLW 05h DelayCnt = 5;
00B5 002D MOVWF 0D
00B6 0800 RETLW 00h return;
}
00B7 022C MOVF 0C if(TestCount == 0) //Ramp up to full dim
00B8 0743 BTFSS 03,2
00B9 0AC5 GOTO 00C5h
00BA {
00BA 02A8 INCF 08 if(++PercentOn > Maxbrt) //Check for full bright
00BB 0CFD MOVLW FDh
00BC 0088 SUBWF 08,W
00BD 0743 BTFSS 03,2
00BE 0703 BTFSS 03,0
00BF 0AC4 GOTO 00C4h
00C0 {
00C0 0CFD MOVLW FDh PercentOn = Maxbrt;
00C1 0028 MOVWF 08
00C2 02AC INCF 0C ++TestCount;
00C3 0800 RETLW 00h return;
}
else
00C4 0800 RETLW 00h return;
}
00C5 0C01 MOVLW 01h if(TestCount == 1) //Ramp down to full dim
00C6 008C SUBWF 0C,W
00C7 0743 BTFSS 03,2
00C8 0AD5 GOTO 00D5h
00C9 {
00C9 00E8 DECF 08 if(--PercentOn <= Maxdim) //Check for full dim
00CA 0208 MOVF 08,W
00CB 0089 SUBWF 09,W
00CC 0643 BTFSC 03,2
00CD 0AD0 GOTO 00D0h
00CE 0703 BTFSS 03,0
00CF 0AD4 GOTO 00D4h
00D0 {
00D0 0CFD MOVLW FDh PercentOn = Maxbrt;
00D1 0028 MOVWF 08
00D2 02AC INCF 0C ++TestCount;
00D3 0800 RETLW 00h return;
}
else
00D4 0800 RETLW 00h return;
}
00D5 020C MOVF 0C,W while(TestCount++ < 5) //Delay
00D6 02AC INCF 0C
00D7 0027 MOVWF 07
00D8 0C05 MOVLW 05h
00D9 0087 SUBWF 07,W
00DA 0703 BTFSS 03,0
00DB return;
00DB 0800 RETLW 00h
while(TestCount++ < 10) //Turn off for a short period
00DC 020C MOVF 0C,W {
00DD 02AC INCF 0C
00DE 0027 MOVWF 07
00DF 0C0A MOVLW 0Ah
00E0 0087 SUBWF 07,W
00E1 0603 BTFSC 03,0
00E2 0AE6 GOTO 00E6h
00E3 PercentOn = Maxdim;
00E3 0209 MOVF 09,W
00E4 0028 MOVWF 08
00E5 0800 RETLW 00h return;
}
while(TestCount++ < 15) //Turn On for a short period
00E6 020C MOVF 0C,W {
00E7 02AC INCF 0C
00E8 0027 MOVWF 07
00E9 0C0F MOVLW 0Fh
00EA 0087 SUBWF 07,W
00EB 0603 BTFSC 03,0
00EC 0AF0 GOTO 00F0h
00ED PercentOn = Maxbrt;
00ED 0CFD MOVLW FDh
00EE 0028 MOVWF 08
00EF 0800 RETLW 00h return;
}
while(TestCount++ < 20) //Turn off for a short period
00F0 020C MOVF 0C,W {
00F1 02AC INCF 0C
00F2 0027 MOVWF 07
00F3 0C14 MOVLW 14h
00F4 0087 SUBWF 07,W
00F5 0603 BTFSC 03,0
00F6 0AFA GOTO 00FAh
00F7 PercentOn = Maxdim;
00F7 0209 MOVF 09,W
00F8 0028 MOVWF 08
00F9 0800 RETLW 00h return;
}
while(TestCount++ < 25) //Turn on for a short period
00FA 020C MOVF 0C,W {
00FB 02AC INCF 0C
00FC 0027 MOVWF 07
00FD 0C19 MOVLW 19h
00FE 0087 SUBWF 07,W
00FF 0603 BTFSC 03,0
0100 0B04 GOTO 0104h
0101 PercentOn = Maxbrt;
0101 0CFD MOVLW FDh
0102 0028 MOVWF 08
0103 0800 RETLW 00h return;
}0104 020C MOVF 0C,W {
0105 02AC INCF 0C
0106 0027 MOVWF 07
0107 0C1E MOVLW 1Eh
0108 0087 SUBWF 07,W
0109 0603 BTFSC 03,0
010A 0B0E GOTO 010Eh
010B PercentOn = Maxdim;
010B 0209 MOVF 09,W
010C 0028 MOVWF 08
010D 0800 RETLW 00h return;
}
010E 0209 MOVF 09,W PercentOn = Maxdim;
010F 0028 MOVWF 08
0110 006C CLRF 0C TestCount = 0; //Reset to beggining of test sequence
0111 02AB INCF 0B if(++Outcount == 255) //Run 255 cycles of test mode
0112 0CFF MOVLW FFh
0113 008B SUBWF 0B,W
0114 0743 BTFSS 03,2
0115 0B1A GOTO 011Ah
0116 {
0116 006A CLRF 0A TestCheck = 0; //Clear Test mode flag
0117 0C03 MOVLW 03h DelayCnt = NotInTest;
0118 002D MOVWF 0D
0119 006B CLRF 0B Outcount = 0;
}
011A 0800 RETLW 00h return;
}
011B 022A MOVF 0A if(TestCheck) //If Test mode not entered quickly,
011C 0643 BTFSC 03,2
011D 0B27 GOTO 0127h
011E if(++Outcount == 0x60) // quit checking
011E 02AB INCF 0B {
011F 0C60 MOVLW 60h
0120 008B SUBWF 0B,W
0121 0743 BTFSS 03,2
0122 0B27 GOTO 0127h
0123 0C03 MOVLW 03h DelayCnt = NotInTest;
0124 002D MOVWF 0D
0125 006B CLRF 0B Outcount = 0;
0126 006A CLRF 0A TestCheck = 0;
}
0127 022A MOVF 0A if(!TestCheck && !Brtbut && !Dimbut) //Check bright & dim
at same time
0128 0743 BTFSS 03,2
0129 0B30 GOTO 0130h
012A 0606 BTFSC 06,0
012B 0B30 GOTO 0130h
012C 0666 BTFSC 06,3
012D 0B30 GOTO 0130h
012E 0C01 MOVLW 01h TestCheck = 1; //If both pressed, set to look for next combo
012F 002A MOVWF 0A
0130 0C01 MOVLW 01h if(TestCheck == 1 && !Brtbut && Dimbut) //Check for only bright
button pressed
0131 008A SUBWF 0A,W
0132 0743 BTFSS 03,2
0133 0B3A GOTO 013Ah
0134 0606 BTFSC 06,0
0135 0B3A GOTO 013Ah
0136 0766 BTFSS 06,3
0137 0B3A GOTO 013Ah
0138 0C02 MOVLW 02h TestCheck = 2; //If pressed, set to look for next combo
0139 002A MOVWF 0A
013A 0C02 MOVLW 02h if(TestCheck == 2 && !Brtbut && !Dimbut) //Check for both
pressed again
013B 008A SUBWF 0A,W
013C 0743 BTFSS 03,2
013D 0B48 GOTO 0148h
013E 0606 BTFSC 06,0
013F 0B48 GOTO 0148h
0140 0666 BTFSC 06,3
0141 0B48 GOTO 0148h
0142 {
0142 0C03 MOVLW 03h TestCheck = 3; //Enable test mode
0143 002A MOVWF 0A
0144 006C CLRF 0C TestCount = 0;
0145 0209 MOVF 09,W PercentOn = Maxdim;
0146 0028 MOVWF 08
0147 006B CLRF 0B Outcount = 0;
}
0148 0666 BTFSC 06,3 if(!Dimbut && !Brtbut) //If both pressed
0149 0B5B GOTO 015Bh
014A 0606 BTFSC 06,0
014B 0B5B GOTO 015Bh
014C {
014C 022E MOVF 0E if(LastBoth == 0) //Don"t flash if held
014D 0743 BTFSS 03,2
014E 0B5A GOTO 015Ah
014F {
014F 0C01 MOVLW 01h LastBoth = 1;
0150 002E MOVWF 0E
0151 0208 MOVF 08,W if(PercentOn == Maxdim) //If full off...
0152 0089 SUBWF 09,W
0153 0743 BTFSS 03,2
0154 0B58 GOTO 0158h
0155 0CFD MOVLW FDh PercentOn = Maxbrt; // turn full on...
0156 0028 MOVWF 08
0157 0B5A GOTO 015Ah else
0158 0209 MOVF 09,W PercentOn = Maxdim; // otherwise turn off
0159 0028 MOVWF 08
}
}
015A 0B5C GOTO 015Ch else
015B 006E CLRF 0E LastBoth = 0;
015C 0606 BTFSC 06,0 if(!Brtbut && Dimbut) //Check for brighten cmd
015D 0B60 GOTO 0160h
015E 0666 BTFSC 06,3
015F 02A8 INCF 08 PercentOn ++;
0160 0706 BTFSS 06,0 if(Brtbut && !Dimbut) //Check for dim cmd
0161 0B64 GOTO 0164h
0162 0766 BTFSS 06,3
0163 00E8 DECF 08 PercentOn --;
0164 0CFD MOVLW FDh if(PercentOn > Maxbrt) //If greater than full bright
0165 0088 SUBWF 08,W
0166 0743 BTFSS 03,2
0167 0703 BTFSS 03,0
0168 0B6B GOTO 016Bh
0169 0CFD MOVLW FDh PercentOn = Maxbrt;
016A 0028 MOVWF 08
016B 0209 MOVF 09,W if(PercentOn < Maxdim) //If less than full dim
016C 0088 SUBWF 08,W
016D 0743 BTFSS 03,2
016E 0603 BTFSC 03,0
016F 0B72 GOTO 0172h
0170 0209 MOVF 09,W PercentOn = Maxdim;
0171 0028 MOVWF 08
0172 0800 RETLW 00h }
0000 0A01 GOTO 0001h
ROM USAGE MAP
0000 to 0172
Total ROM used 0173
Errors : 0
Warnings : 0

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: TIEMPO MINIMO PARA DISPARAR UN TRIAC
« Respuesta #13 en: 06 de Septiembre de 2004, 00:44:00 »
Para que quede más limpio que te parece, si pegas únicamente el fuente en C?

Para que el código te aparezca tabulado pégalo entre los dos codes que salen cuando pulsas el caracter # de arriba y le dás a aceptar.

Un saludo