Bom dia Claudio!! vou fazer isso!! obrigado!! volto com resultados!! tenha paciência comigo meu amigo, muito leigo ainda!! rsrs
Oi Claudio fiz o que falou mas para compilar aparece um erro e não sei o que é! abaixo vai o código mudado como sugeriu e a configuração do pic12f675!
#include <main.h>
#define _S1 PIN_A0,1
#define _S2 PIN_A1,2
unsigned int1 flag1=0, flag2=0;
#define END_S1 0x00
#define END_S2 0x01
void main()
{
delay_ms(50);
Output_low(S1);
Output_low(S2);
Output_low(S3);
Output_low(S4);
if(read_eeprom(END_S1))Output_high(S1);else Output_low(S1);
if(read_eeprom(END_S2))Output_high(S2);else Output_low(S2);
while(TRUE)
{
if(input(e1)==0 && flag1==0)
{
flag1=1;
Output_toggle(S2);
if(bit_test(_S2))write_eeprom(END_S2,1);else write_eeprom(END_S2,0);
Output_high(S3);
delay_ms(750);
Output_low(S3);
delay_ms(1800);
}
if(input(e2)==0 && flag2==0)
{
flag2=1;
Output_toggle(S1);
if(bit_test(_S1))write_eeprom(END_S1,1);else write_eeprom(END_S1,0);
Output_high(S4);
delay_ms(750);
Output_low(S4);
delay_ms(1500);
}
if(input(e1)==1)flag1=0;
if(input(e2)==1)flag2=0;
}
}
config pic
// Constants used to identify pins in the above are:
#define PIN_A0 40
#define PIN_A1 41
#define PIN_A2 42
#define PIN_A3 43
#define PIN_A4 44
#define PIN_A5 45
e essa é a configuração que fiz no wizard do CCS:
#include <12F675.h>
#device ADC=10
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOBROWNOUT //No brownout reset
#FUSES PROTECT //Code protected from reads
#FUSES CPD //Data EEPROM Code Protected
#use delay(internal=4MHz)
#use FIXED_IO( A_outputs=PIN_A5,PIN_A2,PIN_A1,PIN_A0 )
#define S1 PIN_A0
#define S2 PIN_A1
#define S3 PIN_A2
#define E1 PIN_A3
#define E2 PIN_A4
#define S4 PIN_A5
as mensagens de erros que aparecem no compilador:
*** Error 49 "main.c" Line 33(22,23): Expecting LVALUE such as a variable name or * expression ::
Error 51 "main.c" Line 33(47,51): A numeric expression must appear here
Error 49 "main.c" Line 44(22,23): Expecting LVALUE such as a variable name or * expression ::
*** Error 51 "main.c" Line 44(47,51): A numeric expression must appear here
4 Errors, 0 Warnings.
Build Failed.
Não sei o que fazer rsrsrs
Creio que o primeiro #define está incorreto.
#define _S1 PIN_A0,1
#define _S2 PIN_A1,2
Tente substituir o acima por:
#byte portA = 0x05 //chame GPIO de portA por exemplo.
#define _S1 portA,1
#define _S2 portA,2
ou:
#byte GPIO = 0x05 // não estiver definido nesta forma no arquivo include. Se estiver não precisa desta linha.
#define _S1 GPIO,1
#define _S2 GPIO,2
ou ainda:
#define _S1 0x05,1 // direto com o endereço físico do port
#define _S2 0x05,2
Ola Claudio, agora compilou das duas formas que vc mencionou. Porém continua da mesma forma, ao ligar as duas saidas S1, e S2, estão nivel logico alto, aperto as chaves tacteis funcionam certinho mas não gravam na eeprom, o problema poderia ser por estar usando a função toggle? Como faço a chave bi-estável sem usar a toggle?
Abraço!
Ola Claudio, agora compilou das duas formas que vc mencionou. Porém continua da mesma forma, ao ligar as duas saidas S1, e S2, estão nivel logico alto, aperto as chaves tacteis funcionam certinho mas não gravam na eeprom, o problema poderia ser por estar usando a função toggle? Como faço a chave bi-estável sem usar a toggle?
Abraço!
O problema não é com a função Output_Toggle() com certeza. Você está recuperando o que foi salvo quando inicializa o programa ? As vezes colocamos a rotina para gravar a eeprom e esquecemos de colocar para ler a eeprom e devolver os valores para os registradores devido.
Tente na montagem prática, com o pic rodando o programa, acionar os pinos e depois em seguida, você lê a eeprom com o programador de pic. Se estiver gravando direitinho então o problema está na recuperação pós reset. Pode tentar usar o Proteus (se tem conhecimento de seu uso) para simular o funcionamento e ver as variáveis, ports e eeprom, passo a passo. Mas não adianta me perguntar de Proteus, que não é minha praia.
Rs, certo então somos dois no proteus kkk, fiz escrevi exatamente como sugeriu nos posts anteriores, vou copiar o codigo e mandar de novo pra vc ver se tem algo errado... to quase desistindo já rsrs
#include <main.h>
#byte GPIO= 0x05
#define _S1 GPIO,1
#define _S2 GPIO,2
unsigned int1 flag1=0, flag2=0;
#define END_S1 0x00
#define END_S2 0x01
void main()
{
delay_ms(20);
Output_low(S1);
Output_low(S2);
Output_low(S3);
Output_low(S4);
if(read_eeprom(END_S1))Output_high(S1);else Output_low(S1);
if(read_eeprom(END_S2))Output_high(S2);else Output_low(S2);
while(TRUE)
{
if(input(E1)==0 && flag1==0)
{
flag1=1;
Output_toggle(S2);
if(bit_test(_S2))write_eeprom(END_S2,1);else write_eeprom(END_S2,0);
Output_high(S3);
delay_ms(750);
Output_low(S3);
delay_ms(1800);
}
if(input(E2)==0 && flag2==0)
{
flag2=1;
Output_toggle(S1);
if(bit_test(_S1))write_eeprom(END_S1,1);else write_eeprom(END_S1,0);
Output_high(S4);
delay_ms(750);
Output_low(S4);
delay_ms(1500);
}
if(input(E1)==1)flag1=0;
if(input(E2)==1)flag2=0;
}
}
quer o esquema pra vc montar ele fisicamente pra testar? se puder é claro não quero abusar da sua boa vontade!! está ajudando muito já!
Gostaria de saber se na inicialização você lembrou de desligar o conversor analógico/digital e o comparador analógico?
Algo assim, de forma rápida:
#include <main.h>
#byte GPIO= 0x05
#byte cmcon = 0x19
#byte ansel = 0x9f
#define _S1 GPIO,1
#define _S2 GPIO,2
unsigned int1 flag1=0, flag2=0;
#define END_S1 0x00
#define END_S2 0x01
void main()
{
cmcon=7;//desliga comparador interno do pino
ansel=0;//desativa o conversor AD
delay_ms(20);
Output_low(S1);
Output_low(S2);
Output_low(S3);
Output_low(S4);
if(read_eeprom(END_S1))Output_high(S1);else Output_low(S1);
if(read_eeprom(END_S2))Output_high(S2);else Output_low(S2);
while(TRUE)
{
if(input(E1)==0 && flag1==0)
{
flag1=1;
Output_toggle(S2);
if(bit_test(_S2))write_eeprom(END_S2,1);else write_eeprom(END_S2,0);
Output_high(S3);
delay_ms(750);
Output_low(S3);
delay_ms(1800);
}
if(input(E2)==0 && flag2==0)
{
flag2=1;
Output_toggle(S1);
if(bit_test(_S1))write_eeprom(END_S1,1);else write_eeprom(END_S1,0);
Output_high(S4);
delay_ms(750);
Output_low(S4);
delay_ms(1500);
}
if(input(E1)==1)flag1=0;
if(input(E2)==1)flag2=0;
}
}
Bom dia Claudio, obrigado pela paciência, estava olhando agora a pouco o wizard do CCS e ele mantém o conversor AD o comparador tudo desativado, tem a opção de ativar lá mas não ativei, acredito que estejam por padrão ja desativados, mas mesmo assim incluí os comandos que vc sugeriu e continua o mesmo.
liga a energia as S1, e S2 já estão ativas na primeira energização e quanto atua sobre elas elas apagam, desliga e religa a energia as vezes S1 volta nivel logico alto, mas continua não gravando...tem mais alguma sugestão?
Obrigado
Isto de iniciar com saídas ativas se deve ao fato da eeprom estar com 0xff em todas as posições logo ao gravar o pic. Isto pode ser resolvido colocando a diretiva logo após o arquivo include main.h:
#ROM 0x2100 = {0,0} //grava 0 na posição 0 e 1 e com isto inicializa desligado as saídas na primeira vez que liga
Quanto ao porque não estar gravando ainda não sei. Tem como enviar o arquivo .list gerado após a compilação?
Nele poderei ver o código gerado em assembly, ficando mais fácil pegar algum engano.
Boa tarde Claudio, isso mesmo resolveu o problema de ligar e as saídas estarem em nível lógico alto, segue o list que vc pediu:
CCS PCM C Compiler, Version 5.061, 5967 11-jan-18 16:33
Filename: C:\backup 07-06-2016\projetos novos\PROJETOS MOTEL NOVO GERALDO\controle dos portões\novo controle portões\codigo fonte novo\main.lst
ROM used: 281 words (27%)
Largest free fragment is 743
RAM used: 7 (11%) at main() level
7 (11%) worst case
Stack used: 1 locations
Stack size: 8
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 004
0003: NOP
0004: CALL 3FF
0005: BSF 03.5
0006: MOVWF 10
0007: MOVLW 00
0008: MOVWF 0A
0009: GOTO 01E
.................... #include <main.h>
.................... #include <12F675.h>
.................... //////////// Standard Header file for the PIC12F675 device ////////////////
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// (C) Copyright 1996, 2014 Custom Computer Services ////
.................... //// This source code may only be used by licensed users of the CCS C ////
.................... //// compiler. This source code may only be distributed to other ////
.................... //// licensed users of the CCS C compiler. No other use, reproduction ////
.................... //// or distribution is permitted without written permission. ////
.................... //// Derivative programs created using this software in object code ////
.................... //// form are not restricted in any way. ////
.................... ///////////////////////////////////////////////////////////////////////////
.................... #device PIC12F675
....................
.................... #list
....................
.................... #device ADC=10
....................
.................... #FUSES NOMCLR //Master Clear pin used for I/O
.................... #FUSES NOBROWNOUT //No brownout reset
.................... #FUSES PROTECT //Code protected from reads
.................... #FUSES CPD //Data EEPROM Code Protected
....................
.................... #use delay(internal=4MHz)
000A: MOVLW 26
000B: MOVWF 04
000C: MOVF 00,W
000D: BTFSC 03.2
000E: GOTO 01D
000F: MOVLW 01
0010: MOVWF 21
0011: CLRF 20
0012: DECFSZ 20,F
0013: GOTO 012
0014: DECFSZ 21,F
0015: GOTO 011
0016: MOVLW 4A
0017: MOVWF 20
0018: DECFSZ 20,F
0019: GOTO 018
001A: GOTO 01B
001B: DECFSZ 00,F
001C: GOTO 00F
001D: RETURN
.................... #use FIXED_IO( A_outputs=PIN_A5,PIN_A2,PIN_A1,PIN_A0 )
.................... #define S1 PIN_A0
.................... #define S2 PIN_A1
.................... #define S3 PIN_A2
.................... #define E1 PIN_A3
.................... #define E2 PIN_A4
.................... #define S4 PIN_A5
....................
....................
....................
.................... #ROM 0x2100 = {0,0}
....................
.................... #byte portA= 0x05
.................... #byte cmcon= 0x19
.................... #byte ansel= 0x9f
.................... #define _S1 portA,1
.................... #define _S2 portA,2
.................... unsigned int1 flag1=0, flag2=0;
.................... #define END_S1 0x00
.................... #define END_S2 0x01
....................
.................... void main()
001E: MOVF 03,W
001F: ANDLW 1F
0020: MOVWF 03
0021: BCF 24.0
0022: BCF 24.1
0023: BCF 1F.6
0024: BSF 03.5
0025: BCF 1F.0
0026: BCF 1F.1
0027: BCF 1F.2
0028: BCF 1F.3
0029: MOVLW 07
002A: BCF 03.5
002B: MOVWF 19
.................... {
.................... cmcon=7;// desliga comparador interno
002C: MOVLW 07
002D: MOVWF 19
.................... ansel=0;// desativa o conversor AD
002E: BSF 03.5
002F: CLRF 1F
.................... delay_ms(20);
0030: MOVLW 14
0031: BCF 03.5
0032: MOVWF 26
0033: CALL 00A
.................... Output_low(S1);
0034: MOVLW D8
0035: BSF 03.5
0036: MOVWF 05
0037: BCF 03.5
0038: BCF 05.0
.................... Output_low(S2);
0039: BSF 03.5
003A: MOVWF 05
003B: BCF 03.5
003C: BCF 05.1
.................... Output_low(S3);
003D: BSF 03.5
003E: MOVWF 05
003F: BCF 03.5
0040: BCF 05.2
.................... Output_low(S4);
0041: BSF 03.5
0042: MOVWF 05
0043: BCF 03.5
0044: BCF 05.5
....................
.................... if(read_eeprom(END_S1))Output_high(S1);else Output_low(S1);
0045: BSF 03.5
0046: CLRF 1B
0047: BCF 1C.7
0048: BSF 1C.0
0049: MOVF 1A,W
004A: BTFSC 03.2
004B: GOTO 052
004C: MOVLW D8
004D: MOVWF 05
004E: BCF 03.5
004F: BSF 05.0
0050: GOTO 056
0051: BSF 03.5
0052: MOVLW D8
0053: MOVWF 05
0054: BCF 03.5
0055: BCF 05.0
.................... if(read_eeprom(END_S2))Output_high(S2);else Output_low(S2);
0056: MOVLW 01
0057: BSF 03.5
0058: MOVWF 1B
0059: BCF 1C.7
005A: BSF 1C.0
005B: MOVF 1A,W
005C: BTFSC 03.2
005D: GOTO 064
005E: MOVLW D8
005F: MOVWF 05
0060: BCF 03.5
0061: BSF 05.1
0062: GOTO 068
0063: BSF 03.5
0064: MOVLW D8
0065: MOVWF 05
0066: BCF 03.5
0067: BCF 05.1
....................
....................
....................
....................
.................... while(TRUE)
.................... {
....................
....................
....................
.................... if(input(E1)==0 && flag1==0)
0068: MOVLW D8
0069: BSF 03.5
006A: MOVWF 05
006B: BCF 03.5
006C: BTFSC 05.3
006D: GOTO 0BA
006E: BTFSC 24.0
006F: GOTO 0BA
.................... {
.................... flag1=1;
0070: BSF 24.0
.................... Output_toggle(S2);
0071: MOVLW D8
0072: BSF 03.5
0073: MOVWF 05
0074: MOVLW 02
0075: BCF 03.5
0076: XORWF 05,F
.................... if(bit_test(_S2))write_eeprom(END_S2,1);else write_eeprom(END_S2,0);
0077: BTFSS 05.2
0078: GOTO 08E
0079: MOVF 0B,W
007A: MOVWF 20
007B: BCF 0B.7
007C: MOVLW 01
007D: BSF 03.5
007E: MOVWF 1B
007F: MOVWF 1A
0080: BCF 1C.7
0081: BSF 1C.2
0082: MOVLW 55
0083: MOVWF 1D
0084: MOVLW AA
0085: MOVWF 1D
0086: BSF 1C.1
0087: BTFSC 1C.1
0088: GOTO 087
0089: BCF 1C.2
008A: BCF 03.5
008B: MOVF 20,W
008C: IORWF 0B,F
008D: GOTO 0A2
008E: MOVF 0B,W
008F: MOVWF 20
0090: BCF 0B.7
0091: MOVLW 01
0092: BSF 03.5
0093: MOVWF 1B
0094: CLRF 1A
0095: BCF 1C.7
0096: BSF 1C.2
0097: MOVLW 55
0098: MOVWF 1D
0099: MOVLW AA
009A: MOVWF 1D
009B: BSF 1C.1
009C: BTFSC 1C.1
009D: GOTO 09C
009E: BCF 1C.2
009F: BCF 03.5
00A0: MOVF 20,W
00A1: IORWF 0B,F
.................... Output_high(S3);
00A2: MOVLW D8
00A3: BSF 03.5
00A4: MOVWF 05
00A5: BCF 03.5
00A6: BSF 05.2
.................... delay_ms(750);
00A7: MOVLW 03
00A8: MOVWF 25
00A9: MOVLW FA
00AA: MOVWF 26
00AB: CALL 00A
00AC: DECFSZ 25,F
00AD: GOTO 0A9
.................... Output_low(S3);
00AE: MOVLW D8
00AF: BSF 03.5
00B0: MOVWF 05
00B1: BCF 03.5
00B2: BCF 05.2
.................... delay_ms(1800);
00B3: MOVLW 08
00B4: MOVWF 25
00B5: MOVLW E1
00B6: MOVWF 26
00B7: CALL 00A
00B8: DECFSZ 25,F
00B9: GOTO 0B5
.................... }
....................
.................... if(input(E2)==0 && flag2==0)
00BA: MOVLW D8
00BB: BSF 03.5
00BC: MOVWF 05
00BD: BCF 03.5
00BE: BTFSC 05.4
00BF: GOTO 10B
00C0: BTFSC 24.1
00C1: GOTO 10B
.................... {
.................... flag2=1;
00C2: BSF 24.1
.................... Output_toggle(S1);
00C3: MOVLW D8
00C4: BSF 03.5
00C5: MOVWF 05
00C6: MOVLW 01
00C7: BCF 03.5
00C8: XORWF 05,F
.................... if(bit_test(_S1))write_eeprom(END_S1,1);else write_eeprom(END_S1,0);
00C9: BTFSS 05.1
00CA: GOTO 0E0
00CB: MOVF 0B,W
00CC: MOVWF 20
00CD: BCF 0B.7
00CE: BSF 03.5
00CF: CLRF 1B
00D0: MOVLW 01
00D1: MOVWF 1A
00D2: BCF 1C.7
00D3: BSF 1C.2
00D4: MOVLW 55
00D5: MOVWF 1D
00D6: MOVLW AA
00D7: MOVWF 1D
00D8: BSF 1C.1
00D9: BTFSC 1C.1
00DA: GOTO 0D9
00DB: BCF 1C.2
00DC: BCF 03.5
00DD: MOVF 20,W
00DE: IORWF 0B,F
00DF: GOTO 0F3
00E0: MOVF 0B,W
00E1: MOVWF 20
00E2: BCF 0B.7
00E3: BSF 03.5
00E4: CLRF 1B
00E5: CLRF 1A
00E6: BCF 1C.7
00E7: BSF 1C.2
00E8: MOVLW 55
00E9: MOVWF 1D
00EA: MOVLW AA
00EB: MOVWF 1D
00EC: BSF 1C.1
00ED: BTFSC 1C.1
00EE: GOTO 0ED
00EF: BCF 1C.2
00F0: BCF 03.5
00F1: MOVF 20,W
00F2: IORWF 0B,F
.................... Output_high(S4);
00F3: MOVLW D8
00F4: BSF 03.5
00F5: MOVWF 05
00F6: BCF 03.5
00F7: BSF 05.5
.................... delay_ms(750);
00F8: MOVLW 03
00F9: MOVWF 25
00FA: MOVLW FA
00FB: MOVWF 26
00FC: CALL 00A
00FD: DECFSZ 25,F
00FE: GOTO 0FA
.................... Output_low(S4);
00FF: MOVLW D8
0100: BSF 03.5
0101: MOVWF 05
0102: BCF 03.5
0103: BCF 05.5
.................... delay_ms(1500);
0104: MOVLW 06
0105: MOVWF 25
0106: MOVLW FA
0107: MOVWF 26
0108: CALL 00A
0109: DECFSZ 25,F
010A: GOTO 106
.................... }
....................
.................... if(input(E1)==1)flag1=0;
010B: MOVLW D8
010C: BSF 03.5
010D: MOVWF 05
010E: BCF 03.5
010F: BTFSC 05.3
0110: BCF 24.0
.................... if(input(E2)==1)flag2=0;
0111: MOVLW D8
0112: BSF 03.5
0113: MOVWF 05
0114: BCF 03.5
0115: BTFSC 05.4
0116: BCF 24.1
0117: GOTO 068
....................
.................... }
....................
.................... }
....................
0118: SLEEP
Configuration Fuses:
Word 1: 1004 INTRC_IO NOWDT PUT NOMCLR NOBROWNOUT PROTECT CPD
ROM data:
002100: 0000 0000
Obrigado.
Olhando o código ve-se que o _S1 (espelho) não está batendo com o S1.
Veja:
.................... if(bit_test(_S2))write_eeprom(END_S2,1);else write_eeprom(END_S2,0);
0077: BTFSS 05.2 <-----5.2 ou pino 5
0078: GOTO 08E
0079: MOVF 0B,W
007A: MOVWF 20
.................... if(bit_test(_S1))write_eeprom(END_S1,1);else write_eeprom(END_S1,0);
00C9: BTFSS 05.1 //<------- _s1= 5.1 pino 4
00CA: GOTO 0E0
00CB: MOVF 0B,W
............
quando liga:
.................... Output_low(S1);
0034: MOVLW D8
0035: BSF 03.5
0036: MOVWF 05
0037: BCF 03.5
0038: BCF 05.0 <---- 5.0 pino 5
.................... Output_low(S2);
0039: BSF 03.5
003A: MOVWF 05
003B: BCF 03.5
003C: BCF 05.1<-----5.1 pino 4
motivo:
definição:
#define S1 PIN_A0 //correto
#define S2 PIN_A1//correto
#define _S1 portA,1 //incorreto
#define _S2 portA,2//incorreto
mude para:
#define _S1 portA,0// ou Pin_A0
#define _S2 portA,1// ou Pin_A1
Verifique se vai funcionar corrigindo isto.
BINGOOOOO!!!... Funcionou!! Obrigado Claudio!!! muito obrigado pela paciência!!! eu tenho alguns receptores 433 que não passaram no teste de qualidade das empresas mas testei alguns e funcionam!! se precisar de alguns me avise que mando pra vc ou mesmo alguém do forum!!
Abraço!!