Fórum

Ajuda com um progra...
 
Notifications
Clear all

Ajuda com um programa

29 Posts
2 Users
0 Likes
42.9 K Leituras
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

Bom dia Claudio!! vou fazer isso!! obrigado!! volto com resultados!! tenha paciência comigo meu amigo, muito leigo ainda!! rsrs


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

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


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

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

 


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

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!


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

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!


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

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.


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

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;

}

}


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

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á!


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

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;

}

}

 O CCS C Compiler tem uma função para desabilitar o comparador e  outra o conversor AD. Por não  lembrar fiz dessa forma direta. Pesquise o ajuda do CCS C que encontrará estas funções caso queira conhece-las.

   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

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

 


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

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.


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

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


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

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.


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

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!!


   
ReplyQuote
Page 2 / 2
Back To Top