Gå til innhold

C kode til og "analysera" pulser..


Anbefalte innlegg

Jeg harett porsjekt på skolen der eg ska laga en "decoder" av signalet fra fjernkontrollen til tv'en(får senere bruk sammen med pc'en)

 

Signalet ser ca. sånn ut:

signal.JPG

 

kossen lage eg ein funskjon i C som venter på at signalet skal komme, og når det kommer, lagre det og sende signalet tilbake, som (forhåpentlig vis) 1'ere og 0'ere?

 

kort forklart: sende tilbake pulsen i string/char/int format..

void main(void)
{
  printf(GetPuls) // sender Koden fra fjernkotrollen til PC'en over RS232/Serieporten
}

 

eg har ingen peiling på dette så eg trenge någen tips og veiledning, eventuelt linker kor eg kan lesa mer om denne type programmer.. thx :w00t:

Endret av Richard87
Lenke til kommentar
Videoannonse
Annonse

jaha.. det fulgte vel med dokumentasjon og en compiler med denne mikrokontrollern på hvordan man programmerer den? du sier at du kan lese av signalet, hva er det du egentlig spør etter da? vi kan ikke vite hvordan vi skal programmere din mikrokontroller når vi ikke aner hva det er for noe en gang? vær litt mer spesifikk

Lenke til kommentar

problemet e koden, kossen kan eg laga ett program/kode/funskjon i C som venter på et signal(om Puls = 0 eller 1)og lagre denne kodenog sende den tilbake. (vanskeligt of forklare:( ) bare en endeløs loop som venter på et signal, når den får et signal(dvs Pusl variabelen forandrer seg fra 0 til 1 og mottsatt) og som tar opp signalet, og når signalet er over sende tilbake til stedet hvor den ble påkalt...

 

Jeg trenger ganske enkelt hjelp til og lage en funskjon som venter til en variabel Puls forandrer seg fra 0 til 1 og så ta opp signalet og så sende det tilbake...

 

[EDIT] Det jeg skal programere er en Atmel 8515 mikrokontroller med C som jeg skriver og programmerer i CodeVision...

Endret av Richard87
Lenke til kommentar

men hvilken platform er du på? er det mikrokontrollern som er kobla til serialporten?

du fikk helt sikkert med dokumentasjon på den mikrokontrollern.. og når du sier " problemet e koden, kossen kan eg laga ett program/kode/funskjon i C som venter på et signal(om Puls = 0 eller 1)og lagre denne kodenog sende den tilbake." så går det ikke. C vet ikke noe om hardware eller operativsystem.. det er derfor det er platformspesifikt og hvis du ikke gir mer informasjon er det umulig å hjelpe deg.

Lenke til kommentar

"plattformen" kan kjøre vanlig C, men jeg kan ikke hive med for mange headere fordi jeg har dårlig plass, jeg kan selfølgelig og programmere den i Assembly etc, forskjellen på denne plattformen og Win32 er windows.h o.l.l.

 

klette var inne på noe, men jeg trenger litt mer avansert kode for og samle sammen et signal(1'ere og 0'ere), Signalet er ganske enkelt en variabel Puls som forandrer seg i forhold til inngangen, thats it

Lenke til kommentar

jeg tror ikke du helt skjønner hva jeg mener..

HVILKEN PLATFORM ER DU PÅ? windows? linux? bsd?

og er mikrokontrollern kobla til serialporten? isåfall, må du programmere den også for at den skal kunne sende et signal til serialporten? for da må du jo programmere 2 programmer.. et for mikrokontrollern som sender signalet til serialporten, og et til windows/linux/bsd/whatever som leser serialporten

Lenke til kommentar

ok, eg fatte, eg compile på windows xp, så brenne eg det på microkontrolleren, allt det andre har eg kontroll på, kommunikasjonen på rs323 har eg satt opp etc, det einaste eg har problem e algorithmen som skal lesa av pulsen("decoding") og senna ann te programmet mitt

 

[EDIT] PC'delen e ikkje ett problem, der bruke eg VB..

Endret av Richard87
Lenke til kommentar

aha

vel, det kommer som sagt helt an på mikrokontrollern, men fikk du med dokumentasjon på den? og har du dokumentasjon på CodeVision? se i dokumentasjonen hvordan man lager en interrupt. som sagt, helt umulig for oss å hjelpe deg siden det ikke er standard C. og hva mener du med en algoritme for å dekode pulsen? den kommer vel ikke kryptert inn? den kommer vel bare som en serie med 1 og 0? uansett, "algoritmen" i dette tilfellet er hvordan du setter opp en interrupt for hver gang du får et signal, og så kode for å sende det signalet videre til serialporten, men igjen, det står i dokumentasjonen.

Lenke til kommentar

hehe,ok, problemet e at i CodeVision Evaluation v. kan eg ikkje bruka interupts, så eg må lesa inn pulsen heila tiå og analysera ann katid serien e over, og ka ti ann starte igjenn:( eg kan bruka Timere, men eg e ikkje heilt sikker på kossen det fuingere... har du någen ideer?

Lenke til kommentar

kjøp codevision eller så har gcc sikkert noe avr-greier.

men som sagt, jeg har aldri programmert en atmel8515 så jeg aner ikke åssen den fungerer. men jeg har programmert en laserpenn og da fikk jeg med en veldig fin "default" kode, som var helt basic, så kunne du forandre den som du selv ville, men det har du kanskje ikke fått med på den der? søk på google etter eksempelkoder til den mikrokontrollern din, kanskje lettere å lese de enn dokumentasjonen/specen.

men er det så veldig vanskelig å polle signalet hele tida? er ikke helt sikker på hva slags Timere du snakker om, men les litt mer om de? å polle er ikke akkurat rocket science

Lenke til kommentar

eg forstår, men eg tror ikkje det e vanskelig og få te det signal greiene, men eg ane ikkje kor eg ska starta..:( som sag, så hva Klette inne på någe, men eg ane ikkje ka eg ska gjør videre for og sjekka om der e et signal eller om det ikkje e ett signal..

Lenke til kommentar

eg tror du ennå har missforstått meg:( det eg ska gjør e og annalysera bit møsteret som heila tiå forandre seg på variabelen "Puls"(egentlig PORTA.0) og sjekka bitmønsteret og viss det er et "valid" bit mønster å skal den sende det tilbake som en vanlig funsjon

int Code(void)
{
   blablabla;
   return "koden";
}

og så tar resten av programmet seg av hva som skal sendes ut...

enne eller annen loop, problemet er kossen denne loop'en skal se ut...

Lenke til kommentar

åja, men da er det ikke noe sak.. vel, hva er variablen puls? int char etc?

hva er et valid bitmønster?

 

har jeg forstått deg riktig hvis du har kode som tar seg av å lese signalet og putte det i variablen Puls og du har kode som kan sende data til serialporten?

hvis du har det, kan du paste all koden du har her, så blir det litt lettere..

Endret av saboi
Lenke til kommentar

ok, variabelen Puls er bare enten 0 eller 1 avhengig av PORTA.0 sin verdi(+5v = 1, 0v = 0)

 

et valid bitmønster er vis du såg på (den ganske patetiske) tegningen så kommer det en rekke 0'ere, så en serie med 0'ere og 1'ere, og så igjenn en serie med 0'ere, altisammenvariabelt, unntat minimums lengden på antall 0'ere etter et "valid bit-mønster", det jeg vil trekke ut er ganske enkelt den serien med bit's som komm inn mellom rekker på 0'ere... (hvis du fårstår hva jeg mener...)

 

BTW, her e koden eg har skreve te nå, eg tvile sterkt på at det virke, men kansje du ser litt bedre ka eg meine då...:

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

unsigned int positive(void)
{
  unsigned int count;
  count=0;
  while(Puls==1)count++;
  return count;
}

unsigned int negative(void)
{
  unsigned int count;
  count=0;
  while(Puls==0)count++;
  return count;
}     

void waitfor(void)
{
  while(Puls==0){};
}        

unsigned int GetPuls()
{  
  int count;  
  int count2;
  unsigned int ret;
  int x;
  waitfor();      
  while (count2 > 10)
  {  
     x++;             
     if (Puls==1){count=positive();}
     else { count=negative();}
     count2=count;
  }
  return 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;

while (1)
     {
     // Place your code here 
     unsigned int ret;
     ret=GetPuls;
     if (ret!=0)printf(ret);
     };
}

jj

Endret av Richard87
Lenke til kommentar

vet du størrelsen på hvert signal? er hvert signal like stort? vet du hvor mange 0'er det kommer mellom hvert signal eller varierer det også? hvis størrelsen på hvert signal varierer og antall 0'er mellom hvert signal varierer, hvordan vet du da at det er et nytt signal? ved første 1? men hvordan vet du da at et signal slutter når det treffer 0?

 

hvor mange byte er typen int på den mikrokontrollern, og er en byte 8 bits på den?

 

edit, jeg skjønner ikke helt hvordan du har tenkt deg fram til den koden der.. blir Puls automagisk oppdatert av seg selv til 0 og 1 etterhvert som den får signaler?

Endret av saboi
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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...