Gå til innhold

C kode til og "analysera" pulser..


Anbefalte innlegg

Skrevet

nope, eg vett bare at det e ett vist anntall nuller MELLOM hvert signal, dvs la oss si at det er en konstant

MinBredde = 10

mellom hvert signal, MEN hvert signal starter på en 1'er..

Videoannonse
Annonse
Skrevet (endret)

ok.. men liksom, hvor får du printf fra? skulle ikke dette sendes tilbake til serialporten?

hvis du kan bruke printf kan du jo bare ta det som klette skrev helt i starten?

sorry, men jeg tror du er ganske på bærtur med den koden der.. du blir nok nødt til å lese hvordan man programmerer den mikrokontrollern, og jeg tror du også må finne ut akkurat hva du vil.. for jeg klarer ikke helt å skjønne det.

Endret av saboi
Skrevet (endret)

printf er skrevet/forklart(whatever) i ein av header-filene, og i komfigurasjonen i CodeVision...

 

btw, Puls blir oppdatert av seg selv...

Endret av Richard87
Skrevet

joja. men hvorfor bruker du printf? hvor blir det skrevet ut da liksom? jeg trodde meningen var å sende det tilbake til serialporten og skrive det ut der..

Skrevet (endret)

eg fårstod _veldig_ lite av den koden der:( eg lage mest programmer i VB, og e stort sett n00b i C/++, poenget e at funksjonen ska sammla opp hele serien og SÅ sende den videre for og analysering... f.eks

000100101011011000000000010010101101100000000000000010010101101100000

etc så sender funksjonen "100101011011"

altså en loop som venter på den første 1'ere, og så printe ut hele serien når det er komt f.-eks 10 0'erdvs, den er nødt og være minst 10tegn bakfor, tror eg...?

 

[EDIT]

unsigned int signal[100];

void firstp(void)
/*****************************************************
Chip type           : AT90S8515
Clock frequency     : 4.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 128
*****************************************************/

#include <90s8515.h>
#include <stdio.h>
#include <delay.h>
#define Puls PORTA.0
#define Mellom 10
         
unsigned int signal[100];
    
char decode(void)
{
  unsigned int value;
  int teller;
  for (teller=0;teller>100;teller++)
  {
     value=value +signal[teller];
  }
  switch (value)
  {
     case 0:return "A";break;
     case 1:return "B";break;
     case 2:return "C";break;
     default:return 0;break;         
  }       
}
void firstp(void)
{ 
  int finnished;
  int tell;
  signal[0]=1;
  while (Puls!=1);
  while (finnished == 0)
  {
     int count;
     count++;
     while (Puls!=signal[count-1]);
     signal[count]=Puls;
     //sjekk om signalet er over..
     for (tell = 0; tell<Mellom;tell++)
     {
        if (signal[count-tell]==1) break;
        else finnished=1;
     }     
  }
}

void main2(void)
{ 
  while (1)
  {  
     char ret;
     while (Puls==0);
     firstp();
     //ok, formatet e klart...
     ret = decode();      
     printf(ret);
  }
}   

void main(void)
{

PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

UCR=0x18;
UBRR=0x19;

ACSR=0x80;
main2();
}

ok, eg har "tenkt" litt, tror du denne koden vil virke?( eg har ikkje peiling)

Endret av Richard87
Skrevet (endret)

tror ikke den vil virke så bra nei..

 

dette er en funksjon som leser signalet helt til den leser 10 0'er, da stopper den

den fyller opp en array signal som du ser

short signal[100] = { 0 };
void get_signal(int num, short start, short* sig)
{
static int signal_slutt = 0, k = -1;
if(num > 10) {
 signal_slutt = 1;
 sig[k - 10] = -1;
}
while(signal_slutt == 0) {
 if(Puls == 0) {
 	if(start == 0) {
   k = 0;
   get_signal(0, 0, sig);
 	}
 	k++;
 	get_signal(++num, 1, sig);
 }
 else {
 	sig[++k] = 1;
 	start = 1;
 }
 num = 0;
}
}

get_signal(0, 0, sig);

 

edit, sånn bare fiksa koden så den setter -1 i arrayen der signalet slutta

Endret av saboi
Skrevet

sånn fixa koden litt.

det koden gjør er bare å kalle seg selv (rekursjon) hver gang Puls er 0. den teller hvor mange ganger den kaller seg selv, ved hjelp av num som er parameteret. hvis num er over 10 så stopper den

Skrevet (endret)

og i teorien ska eg bare utføra:

while (1)
{
  printf(get_signal());
}

så blir signalet hele tiden printed ut?

 

[EDIT](sorry for bumping, glømte meg...)

Endret av Richard87
Skrevet

/* Ikke alle av de følgende brukes. De som ikke brukes er tenkt bruk av read_pulse funksjonen */
#define polls_per_pulse = 4 /* for sikker sampling */
#define pulse_length = 100  /* hvor lenge en puls varer i forhold til klokka på kontrolleren */
#define poll_interval (pulse_length/polls_per_pulse) /*hvor ofte signalet polles */
#define time_out_pulses 10 /* antall nuller mellom hvert signal */

#define test_main

#ifdef test_main
#include <stdio.h>

const int test_pulses[] = {0,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,0,1,0};

int i=0;
int read_pulse(){ /* kode for lese pulser fra hardware */
if (i<sizeof test_pulses/sizeof(int)) i++;
return test_pulses[i-1];
}

void send_code(int signal){ /*kode for å sende dekodet signal til whatever */
printf("%X\n",signal);
return;
}
#endif  /*test_main*/

void main_loop(){
int quit;  /* settes ulik null for å avslutte loop */
int pulse; /* 0/1 */
int signal; /*dekodet signal */
int zeroes; /*hjelpevariabel*/

quit=0;
signal = 0;
while (!quit){
 pulse = read_pulse();
 if (pulse==0){
 	zeroes+=1;
 	if (zeroes==time_out_pulses){
   if (signal) send_code(signal);
   signal=0;
 	}
 }
 else {
 	signal = signal << (1+zeroes);
 	signal += pulse;
 	zeroes=0;
 }
}
return;
}

#ifdef test_main
int main(){
main_loop();
}
#endif /*test_main*/

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...