Ir ao conteúdo

Problema com código MikroC - Propeller Clock


alexandrefdem

Posts recomendados

Postado

E ai galera. Tô tendo problemas na hora de compilar um código que eu semi-escreví(ta todo baseado no código do jorgeeletronico), e ele fica me dando a mensagem:

"too many actual parameters"

em todas as funções 'escrever'

Se alguém puder olhar o código, que saque do MikroC, e me der uma ajuda, agradeço muito.



long int dezena, digito, unidade;
int q ;
long int hora, minuto, seg, numero;
const unsigned char table[11][5] = { {0xC1,0xBE,0xBE,0xBE,0xC1}, // ;"O"
{0xFF,0xDE,0x80,0xFE,0xFF}, //;"1"
{0xDE,0xBC,0xBA,0xB6,0xCE}, //;"2"
{0xBD,0xBE,0xAE,0x96,0xB9}, // ;"3"
{0xF3,0xEB,0xDB,0x80,0xFB}, // ;"4"
{0x8D,0xAE,0xAE,0xAE,0xB1}, // ;"5"
{0xE1,0xD6,0xB6,0xB6,0xF9}, // ;"6"
{0xBF,0xB8,0xB7,0xAF,0x9F}, // ;"7"
{0xC9,0xB6,0xB6,0xB6,0xC9}, // ;"8"
{0xCF,0xB6,0xB6,0xB5,0xC3}, // ;"9"
{0xFF,0xC9,0xC9,0xFF,0xFF}, // ;":"
};

void escrever(numero)
{
dezena = (numero/10);
unidade = (numero-(dezena*10));

for(q=0;q<=5;q++)
{
portb = (table[dezena][q]);
delay_ms(1);

delay_ms(50);
portb=0x00;
delay_ms(50);
}

for(q=0;q<=5;q++)
{
portb = (table[unidade][q]);
delay_ms(1);

delay_ms(50);
portb=0x00;
delay_ms(50);
}
}

void doispontos()
{

for (q=0;q<=5;q++)
{
portb = (table[10][q]) ; //lo mismo con las unidades
delay_us(1);
}
delay_us(500); //pausa entre digitos
portb = 0x00;
delay_us(50); //pausa entre digitos
}


void regras()
{
if(seg=60)
{
seg=0;
}
else if(minuto>59)
{
minuto=0;
}
else if(hora>23)
{
hora=0;
}
}

void seg1()
{
if(seg<60)
{
seg++;
delay_ms(1000);
}
}


void main() {
TRISA=1;
TRISB=0;
PORTB=0X00;
PORTA=0X00;


hora = 12 ;
minuto = 0;
seg = 0;

seg1();
regras();
escrever(hora);
doispontos();
escrever(minuto);
doispontos();
escrever(seg);

}

Postado

Amigao,assim nao vai ficar bom,precisa usar a interrupcao do timer 1 ou 0 pra gerar o tempo para o relogio,use o 1 q é mais preciso.Outra coisa ,o tempo de espaço entre digitos ta muito grande ,sao 500us nao 50 ms.Abraços.

Postado

trisa e trisb sao referencias do mikroC, cara...

O código foi reconhecido mas quando chegou nessas funções ele dá esse erro. De qualquer forma tô baixando agora esse compilador que disse pra testar.

Jorge, eu não tenho muita noção de como usar a função timer no mikro c. E mesmo assim, o problema não ta sendo na zorra da função de tempo, ta sendo pra rodar a função que gera os números

Postado

Tô rodando o google tentando achar o quê é esse bug e não acho nada. Programa bom desse com um debug tão fuleiro...

Qualquer coisa eu pego teu hex mesmo, mas quero tentar "quebrar o código", conhecer o que tô mexendo por inteiro.

Postado

Amigo, você esqueceu de especificar o tipo da variavel que a função escrever recebe.

Compilei o codigo abaixo para o PIC16F628A sem problemas.


int q ;
int hora, minuto, seg, numero;
const unsigned char table[12][6] = { {0xC1,0xBE,0xBE,0xBE,0xC1}, // ;"O"
{0xFF,0xDE,0x80,0xFE,0xFF}, // ;"1"
{0xDE,0xBC,0xBA,0xB6,0xCE}, // ;"2"
{0xBD,0xBE,0xAE,0x96,0xB9}, // ;"3"
{0xF3,0xEB,0xDB,0x80,0xFB}, // ;"4"
{0x8D,0xAE,0xAE,0xAE,0xB1}, // ;"5"
{0xE1,0xD6,0xB6,0xB6,0xF9}, // ;"6"
{0xBF,0xB8,0xB7,0xAF,0x9F}, // ;"7"
{0xC9,0xB6,0xB6,0xB6,0xC9}, // ;"8"
{0xCF,0xB6,0xB6,0xB5,0xC3}, // ;"9"
{0xFF,0xC9,0xC9,0xFF,0xFF}, // ;":"
};

void escrever(int numero)
{
dezena = (numero/10);
unidade = (numero-(dezena*10));

for(q=0;q<=5;q++)
{
portb = (table[dezena][q]);
delay_ms(1);

delay_ms(50);
portb=0x00;
delay_ms(50);
}

for(q=0;q<=5;q++)
{
portb = (table[unidade][q]);
delay_ms(1);

delay_ms(50);
portb=0x00;
delay_ms(50);
}
}

void doispontos()
{

for (q=0;q<=5;q++)
{
portb = (table[10][q]) ; //lo mismo con las unidades
delay_us(1);
}
delay_us(500); //pausa entre digitos
portb = 0x00;
delay_us(50); //pausa entre digitos
}


void regras()
{
if(seg=60)
{
seg=0;
}
else if(minuto>59)
{
minuto=0;
}
else if(hora>23)
{
hora=0;
}
}

void seg1()
{
if(seg<60)
{
seg++;
delay_ms(1000);
}
}


void main() {
TRISA=1;
TRISB=0;
PORTB=0X00;
PORTA=0X00;


hora = 12 ;
minuto = 0;
seg = 0;

seg1();
regras();
escrever(hora);
doispontos();
escrever(minuto);
doispontos();
escrever(seg);

}
long int dezena, digito, unidade;

Abç.

Postado

Valeu mesmo Shunt. O código rodou. Mas a contagem dos segundos ta interrompendo o segmento do programa, então tenho que usar TIMER. Como o unico timer que tem com o PIC que tô usando é TIMER0, tentei configura-lo pra incrementar os segundos. Mas tô tendo só um erro...


...

void main() {
TRISA=1;
TRISB=0;
PORTB=0X00;
PORTA=0X00;
TMR0=0;
OPTION_REG=0x00000111;
INTCON=0X00000010;
while(1)
{
while(!T0IF);
T0IF=0; <<--------------- Erro 'Assigning to non-lvalue T0IF'
seg++;
if(Seg>59)
{
seg=0;
minuto++;
}
}

...

Postado

Tente assim:


if(INTCON.T0IF){
seg++;
if(Seg >= 60){
seg = 0;
minuto++;
}
INTCON.T0IF = 0;
}
}
void main() {
TRISA = 1;
TRISB = 0;
PORTB = 0x00;
PORTA = 0x00;
TMR0 = 0;
OPTION_REG = 0b00000111;
INTCON = 0b00000010;
while(1)
{

}
}
void interrupt(){

Abç.

Postado

E ai galera, vim aqui mostrar o código teoricamente pronto do propeller clock. é... esse código foi adaptado pra o pic 16f84a, usando timer0. Provavelmente preciso ajustar ainda o timer mas o código em sí ta rodando na simulação.

Valeu pela ajuda de vocês, espero que tudo funcione na prática.

long int dezena, digito, unidade;
int q, increm ;
int hora, minuto, seg, numero;

// Baseado no código desenvolvivo por jorgeeletronico
// Adaptador por mim pra o compilador MikroC

const unsigned char table[12][6] = { {0xC1,0xBE,0xBE,0xBE,0xC1}, // ;"O"
{0xFF,0xDE,0x80,0xFE,0xFF}, // ;"1"
{0xDE,0xBC,0xBA,0xB6,0xCE}, // ;"2"
{0xBD,0xBE,0xAE,0x96,0xB9}, // ;"3"
{0xF3,0xEB,0xDB,0x80,0xFB}, // ;"4"
{0x8D,0xAE,0xAE,0xAE,0xB1}, // ;"5"
{0xE1,0xD6,0xB6,0xB6,0xF9}, // ;"6"
{0xBF,0xB8,0xB7,0xAF,0x9F}, // ;"7"
{0xC9,0xB6,0xB6,0xB6,0xC9}, // ;"8"
{0xCF,0xB6,0xB6,0xB5,0xC3}, // ;"9"
{0xFF,0xC9,0xC9,0xFF,0xFF}, // ;":"
};

void escrever(int numero)
{
dezena = (numero/10);
unidade = (numero-(dezena*10));

for(q=0;q<=5;q++)
{
portb = (table[dezena][q]);
delay_us(1);

delay_us(500);
portb=0x00;
delay_us(500);
}

for(q=0;q<=5;q++)
{
portb = (table[unidade][q]);
delay_Us(1);

delay_us(500);
portb=0x00;
delay_us(500);
}
}

void doispontos()
{

for (q=0;q<=5;q++)
{
portb = (table[10][q]) ; //lo mismo con las unidades
delay_us(1);
}
delay_us(500); //pausa entre digitos
portb = 0x00;
delay_us(500); //pausa entre digitos
}


void regras()
{
if(seg>59)
{
seg=0;
minuto++;
}
else if(minuto>59)
{
minuto=0;
hora++;
}
else if(hora>23)
{
hora=0;
}
}

void interrupt() //Função reservada do MikroC, não chama no Main porque
{ //Roda por fora dele
while(!INTCON.F2);
INTCON.F2=0;
increm++ ;
if(increm == 15){
seg = seg + 1;

}
TMR0=0;
}

void main() {
TRISA = 1; //PortA todas como entrada
TRISB = 0; //PortB todas como saída
PORTB = 0x00; //iniciando em estado zero
PORTA = 0x00;
TMR0 = 0; //Timer 0 ativado
OPTION_REG = 0b00000111; //registrando Prescaller de 256, ativado, com clock interno
INTCON = 0b10100000; //ativando funções do timer0


hora = 12 ; //valores iniciais de tempo
minuto = 0;
seg = 0;

while(1)
{
regras();
escrever(hora);
doispontos();
escrever(minuto);
doispontos();
escrever(seg);
}


}

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...