Gå til innhold

C kode til og "analysera" pulser..


Anbefalte innlegg

Videoannonse
Annonse

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
Lenke til kommentar

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
Lenke til kommentar

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
Lenke til kommentar

/* 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*/

Lenke til kommentar

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