www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

UART pomoč

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
juref
Član
Član



Pridružen-a: Tor 15 Dec 2009 11:45
Prispevkov: 226
Aktiv.: 1.20
Kraj: Črnomelj

PrispevekObjavljeno: Ned Maj 20, 2012 6:45 pm    Naslov sporočila:  UART pomoč Odgovori s citatom

Pozdravljeni!

Imam problem, ter ga ne vem rešiti zato sem se obrnil na vas. Uporabljam USART knjižnico Peter Fleury za povezavo z računalnikom. V Labview sem izdelal program z katerim bi krmilil PWM na ATMega8. Na AVR pošiljam string podatek, zajemam ga pa z getc() funkcijo katera prejema samo podatke tipa char. Potreboval bi pa podatek tipa integer. Zamislil sem si postopek tako da bi pretvoril prejeti char v strig, z funkcio atol() bi pa string spremenil v long integer.

Ali sem si to prav zamislil?
Prosil bi za vaša mnenja ter nasvete.

Najlepša hvala ter prijeten dan!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
besoft
Član
Član



Pridružen-a: Ned 01 Apr 2012 10:22
Prispevkov: 585
Aktiv.: 3.64
Kraj: Žižki - Prekmurje

PrispevekObjavljeno: Ned Maj 20, 2012 7:05 pm    Naslov sporočila:   Odgovori s citatom

zakaj pa nebi enostavno pretvoril z val() funkcijo?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9407
Aktiv.: 39.69
Kraj: Kranj - struževo

PrispevekObjavljeno: Ned Maj 20, 2012 7:41 pm    Naslov sporočila:   Odgovori s citatom

Če bi rad imel integer, recimo 16 bitov dolg, za to rabiš dva Char podatka (char = 8 bitov).
Torej dva podatka sprejmeš: A=getc(); B=getc();
in narediš integer: M=(A<<8)|B;

A je v tem primeru MSB (zgornjih 8 bitov), B pa LSB (spodnjih 8 bitov).

Za 32-bitno cifro je podobno: A=getc(); B=getc(); C=getc(); D=getc();
in narediš integer: M=(A<<24)|(B<<16)|(C<<8)|D;
Smile

_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
juref
Član
Član



Pridružen-a: Tor 15 Dec 2009 11:45
Prispevkov: 226
Aktiv.: 1.20
Kraj: Črnomelj

PrispevekObjavljeno: Ned Maj 20, 2012 8:16 pm    Naslov sporočila:   Odgovori s citatom

hvala lepa! ampak še vedno ne deluje :S

za test sem napisal naslednji programček
Koda:

.
.
.
char A;
char B;
int M;

main()
{



uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
 

   while(1)
    {
      
      A = uart_getc();   
      B = uart_getc();   
      
      M=(A<<8)|B;
      
      if (M = 1023)   PORTD = 0b00110000;
      if (M = 0)   PORTD = 0b11000000;

    }
    return 0;
}


v labview sem naredil tipko z katero pošljemo strin "0" ali string "1023", v programu pa preverjal če je M enak 1023 se ene lučke prižgejo drugač druge. Program dela z enim znakom, ampak jaz bi to rabil za krmiljenje pwm-ja
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 3.04
Kraj: Ljubljana

PrispevekObjavljeno: Ned Maj 20, 2012 10:20 pm    Naslov sporočila:   Odgovori s citatom

Živjo!

To kar ti je aly napisal bi veljalo če bi pošiljal integer v binarni obliki!
Če pa sem pravilno razumel tvoj post pa pošiljaš kot string.

Torej če pošiljaš string "1234" recimo, je pretvorba zelo enostavna.

Predvidevam da v resnici pošiljaš 5 znakov: '1', '2', '3', '4', '\0'

Vrednost je 1234 je tako 1*1000 + 2*100 + 3*10 + 4

Koda:
int i;
char c;

i = 0;
// recimo da bereš takole (do null terminatorja)
while('\0' != (c = uart_getc()))
{
   //če še nismo na koncu morajo biti prejšnje cifre "pomnožene" z 10
   i = i * 10;

   // '0' ima ascii vrednost 48
   i += c - '0';
}
// i ima sedaj željeno vrednost


Za tvoj primer bo tole mogoče ok, odvisno kaj boš s tem krmilil.
Če lahko potencialno kaj uničiš ker bo pwm "previsok" potem ne bo ok.

Na splošno glede komunikacije:
- vgraditi moraš detekcijo napak (to je skoraj nujno)
- med napravami pošiljaj sporočila (začetek + podatki + kontrolna vsota)
- za to da veš kdaj se začne nov paket uporabi: a) dovolj dolgo "tišino" b) kakšen znak ki se sicer nikoli ne pojavi v podatkih
- paketi naj imajo crc ali podoben mehanizem da ugotoviš če so podatki "verjetno ok"
- če je napaka pri sprejemu pošiljatelju odgovoriš z crc error (ali podobnim obvestilom o napaki)
- podatke nazaj zopet pošiljaj v paketih
- ...

Skratka napake pri prenosih se dogajajo in program naj bo napisan tako da to zazna.

LP, Gregor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 496 dni


Powered by phpBB © 2001, 2005 phpBB Group