Elektronika.lt
 2019 m. gegužės 21 d. Projektas | Reklama | Žinokite | Klausimai | Prisidėkite | Atsiliepimai | Kontaktai
Paieška portale
EN Facebook RSS

 Kas naujo  Katalogas  Parduotuvės  Forumas  Tinklaraščiai
 Pirmas puslapisSąrašas
 Forumas / + pokalbiai
 - Paieška forume
 - D.U.K. / Forumo taisyklės
 - Narių sąrašas
 - Registruotis
 - Prisijungti

Elektronika.lt portalo forumas

Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo. Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.

Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius, kurie nesilaiko forumo taisyklių. Pastebėjus nusižengimus, prašome pranešti.

Dabar yra 2019 05 21, 22:07. Visos datos yra GMT + 2 valandos.
 Forumas » Mikrovaldikliai » atmega16 char to integer
Jūs negalite rašyti naujų pranešimų į šį forumą
Jūs negalite atsakinėti į pranešimus šiame forume
Jūs negalite redaguoti savo pranešimų šiame forume
Jūs negalite ištrinti savo pranešimų šiame forume
Jūs negalite dalyvauti apklausose šiame forume
 
  
Puslapis 11
Pradėti naują temą  Atsakyti į pranešimą Rodyti ankstesnį pranešimą :: Rodyti kitą pranešimą 
 atmega16 char to integer
PranešimasParašytas: 2017 10 25, 23:11 Pranešti apie taisyklių pažeidimą Atsakyti su citata
pcwortex
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Sveiki,
reikia truputi pagalbos gaunu iš uart skaičių į atmegą 16, naudoju nuskaityti šį kodą

Kodas:
volatile unsigned char msg[20];
volatile unsigned char i=0;


Kodas:
ISR(USART_RXC_vect)
{i=0;
if(strlen(msg)<= sizeof(msg))
   {
      msg[i++]=UDR;
      
   //   msg[i] = 0;

   }
USART_siuntimas(msg);
}


tuo pačiu pasitikrinu ką gaunu "USART_siuntimas(msg);". Atrodo viskas gerai, bet noriu dar padaryti išėjimą, bandau šitaip

Kodas:
while(1)
   {
skaicius=atoi(msg);
DDRA=skaicius;
_delay_ms(20);   
   }


bet gaunas taip, kad veikia nuo 0 iki 9, jeigu gaunu į uart skaičiu pvz 15, tai man duos tik PA0=1, PA1=0, PA2=1; žodžiu tik paskutinį skaičių, tai kaip padaryti, kad duotų visą 15 bitais

_________________
Diplomas tik etikete ant konservų dėžutes. O kas slepiasi dėžutėje neaišku.
 atmega16 char to integer
PranešimasParašytas: 2017 10 26, 08:25 Pranešti apie taisyklių pažeidimą Atsakyti su citata
a1girdas
Patyręs dalyvis
Patyręs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
taip neveiks, aišku, bet mintis tokia:

msg_1=msg(i);
skaicius(i)=atoi(msg_1);
i++;


ir nepamiršk skirtingose ekrano vietose rodyt kiekvieną
 atmega16 char to integer
PranešimasParašytas: 2017 10 26, 10:48 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
isvedinet gali hex formatu, tada bus pakankamai nesunku suprasti ka isveda ir uzims tik du simbolius.
Kodas:

#define RX_ERRORS ( ( 1 << FE ) | ( 1 << DOR ) | ( 1 << PE ) )
// volatile // cia nereikia volatile
unsigned char msg[20];
volatile unsigned char msg_index = 0;
volatile unsigned char rx_error = 0;

ISR( USART_RXC_vect ) {
  unsigned char data = UDR; // tai reikia atlikti visada
  unsigned char status = UCSRA & RX_ERRORS; // gal yra rysio klaidu
  if ( !status ) {
     rx_error = status;
     // tolimesni zingsiai apdorojant klaidas
  } else
  if ( sizeof( msg ) ) > msg_index )
    msg[ msg_index++ ] = data;
}

USART_tx_char( unsigned char data ) {
   while ( USCRA & ( 1 << UDRE ) );
   UDR = data;
}

USART_tx_msg( unsigned char *msg ) {
  while ( *msg ) {
    while ( USCRA & ( 1 << UDRE ) );
    UDR = *msg++;
  }
}

USART_tx_hex( unsigned char data ) {
  unsigned char tmp = data >> 4;
  if ( 10 > tmp ) USART_tx_char( '0' + tmp );
  tmp = data & 0x0F;
  if ( 10 > tmp ) USART_tx_char( '0' + tmp );
  USART_tx_char( 'A' - '0' + tmp );
}

USART_tx_dec( unsigned char data ) {
  unsigned char non0 = 0, tmp = data / 100;
  if ( 0 < tmp ) USART_tx_char( non0 = '0' + tmp );
  data %= 100; tmp = data / 10;
  if ( 0 < tmp || non0 ) USART_tx_char( non0 = '0' + tmp );
  USART_tx_char( '0' + data % 10 );
}

void main( void ) {
  unsigned char old_index = msg_index;
  for(;;) {
    if ( old_index != msg_index ) {
      USART_tx_char( ' ' );
//      USART_tx_char( '0' ); USART_tx_char( 'x' );
      USART_tx_hex( msg[ old_index++ ] );
//      USART_tx_dec( msg[ old_index++ ] );
      cli();
      if ( old_index > msg_index )  old_index = msg_index = 0;
      sei();
    }
  }
}
 atmega16 char to integer
PranešimasParašytas: 2017 10 26, 12:05 Pranešti apie taisyklių pažeidimą Atsakyti su citata
pcwortex
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Na nuo ryto vargstu, kažkaip su tais masyvais nesusiduręs per daugiausiai. Na dabar bandau siusti prie skaičiaus galo pridėjęs ženklą "/" pvz 5/,6/..45/.. ir taip toliau. Na kiek suprantu nuskaitinėja po vieną ženklą, tai paračiau šitaip
Kodas:
   ISR(USART_RXC_vect)
{
i=0;
msg[i] = UDR;

if(msg[i]=='/')
   {         
      USART_siuntimas(skaic);   
      sk=0;         
   }
else
   {
   skaic[sk]=msg[i];
   sk++;   
   }
   
}

msg[i] nėra ženklas "/", tai data skaičių turi talpinti į masyvą, kai atsiranda ženklas "/", tada pradeda pildyti iš naujo masyvą, bet gaunasi kažkokia nesamonė

_________________
Diplomas tik etikete ant konservų dėžutes. O kas slepiasi dėžutėje neaišku.
 atmega16 char to integer
PranešimasParašytas: 2017 10 26, 13:04 Pranešti apie taisyklių pažeidimą Atsakyti su citata
minex
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
neaišku kas per funkcija UART_siuntimas, gal ji neteisingai naudoja tą masyvą, gal skaičius siunti ascii, kas realiai yra +30 dec.
Mažai informacijos, sakyk konkrečiai iš kur siuntį į mcu, kaip siunti, ką UARt_siuntiams daro ar kur matai kad nesamonė gaunasi, ir kas per nesąmonė.
 atmega16 char to integer
PranešimasParašytas: 2017 10 26, 13:10 Pranešti apie taisyklių pažeidimą Atsakyti su citata
pcwortex
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
As noriu gauti skaičių per UART pasidaryti jį integer ir jį toliau apdoroti, tai va užstrigau su dviženkliais skaičiais, o vienaženklais veikia viskas gerai.
Usart siuntimas, tai veikia gerai, nes aš dar pasitikrinu uždegdamas portus
Kodas:
skaicius=atoi(skaic);
DDRA=skaicius;

tai bitai atitinka, ka man uart siunčia

_________________
Diplomas tik etikete ant konservų dėžutes. O kas slepiasi dėžutėje neaišku.
 atmega16 char to integer
PranešimasParašytas: 2017 10 26, 13:16 Pranešti apie taisyklių pažeidimą Atsakyti su citata
pcwortex
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
išsisprendžiau tereikejo dar vienos eilutės
Kodas:
msg[i]=NULL;

_________________
Diplomas tik etikete ant konservų dėžutes. O kas slepiasi dėžutėje neaišku.
 atmega16 char to integer
PranešimasParašytas: 2017 10 26, 13:37 Pranešti apie taisyklių pažeidimą Atsakyti su citata
gintaras_bar
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
pcwortex rašo:
Na nuo ryto vargstu, kažkaip su tais masyvais nesusiduręs per daugiausiai. Na dabar bandau siusti prie skaičiaus galo pridėjęs ženklą "/" pvz 5/,6/..45/..

Gerbiamieji, kas jus moko programuoti? Pertraukimo apdorojimo paprogramė turi būti kuo trumpesnė. Idealiu atveju nuskaitė duomenis, išstatė požymį, kad yra nauji duomenys, ir viskas! O ne taip, kad pertraukimo apdorojimo paprogramėje surašo visą "tolmudą", vos ne pusę programos kodo. Ir, žinoma, jokių kitų paprogramių iššaukinėjimo!

Pvz.:
Kodas:
   
// globalūs kintamieji
volatile unsigned char rx_data=0;
volatile unsigned char new_rx_data=0;
...

// pertraukimo apdorojimas
ISR(USART_RXC_vect)
{
   rx_data=UDR;
   new_rx_data=1;
}
...

// pagrindinė programa
int main(void)
{
      while(1)
      {
         if(new_rx_data)
         {
            // gesinam naujų duomenų požymį
            new_rx_data=0;
            // atliekam manipuliacijas su gautais duomenim
            ...
            
         }
      }
      
   return 0;
}



Kodas:
i=0;
msg[i] = UDR;
// O kam čia tas indeksas "i", jei reikia tik vieną duomenų baitą priimti?
// užteks:
volatile unsigned char msg=0;

o tada jau:

msg = UDR;

if(msg=='/')
   {         
      USART_siuntimas(skaic);   
      // nežinau, kas toje paprogramėje vyksta, bet "skaic" yra adresas,
      //tai korektiškas parametro perdavimas turėtų būti toks:
      USART_siuntimas((void*)&skaic);
      sk=0;         
   }
else
   {
      skaic[sk++]=msg; 
   }
 atmega16 char to integer
PranešimasParašytas: 2017 10 26, 21:28 Pranešti apie taisyklių pažeidimą Atsakyti su citata
pcwortex
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
gintaras_bar ačiū už patarimus

_________________
Diplomas tik etikete ant konservų dėžutes. O kas slepiasi dėžutėje neaišku.
Pradėti naują temą  Atsakyti į pranešimą
 
Forumo sistema: phpBB
 „Google“ paieška forume
 Kas naujesnio?
 Naujos temos forume

LTV.LT - lietuviškų tinklalapių vitrina

TMS ELECTRONICS
TMS ELECTRONICS

www.rslietuva.com – nemokamas elektronikos komponentų pristatymas

www.matuok.lt - Interneto spartos matavimo sistema

Lietuvos mokinių neformaliojo švietimo centras

LOKMITA – įvairi matavimo, testavimo, analizės ir litavimo produkcija

Technologijos.lt

Mokslo festivalis „Erdvėlaivis Žemė

www.esaugumas.lt – apsaugok savo kompiuterį!

„EParašas“ – elektroninio parašo mokymo sistema

CRM sistema – „Hanna CRM“

PriedaiMobiliems.lt – telefonų priedai ir aksesuarai

MRO Supply

FS 19 Tractor mods
Farming Simulator 19 Mods, FS 19 Maps, How to install
ATS mods
ATS trailer mods, ATS truck mods, ATS map mods
FS 19 Tractors
Farming Simulator 19 Mods, FS 19 Maps, FS 19 Trucks
FS19 Maps, FS19 Trucks
Farming Simulator 2019 Mods, FS19 Tractors
FS 19 Tractors
Farming Simulator 19 Mods, FS19 Combine, FS19 Maps
FS19 Combines
Farming Simulator 19 Mods, FS19 Trucks, FS 19 Mods
Periodontologija
Endodontija mikroskopu, implantacija, protezavimas
Mobilieji telefonai
Mobilieji telefonai internetu, telefonų dėklai, telefonų priedai
Reklama
‡ 1999– © Elektronika.lt | Autoriaus teisės | Privatumo politika | Atsakomybės ribojimas | Turinys | Reklama | Kontaktai LTV.LT - lietuviškų tinklalapių vitrina
Farming Simulator 2017 Mods, FS 17 Mods
ls2017.com
„TV programa“ – tiksli
televizijos programa

www.tvprograma.lt
Lietuvos mokinių neformaliojo švietimo centras
www.lmnsc.lt
Lietuvių kalba informacinėse technologijose
www.likit.lt
Svarstyklės – čia, matuokliai, laboratorinė įranga
www.moris.lt
Farming Simulator 2019 Mods, LS19 Mods, FS19 Mods
fs19.net
Ets2 mods, ats mods, fs19 mods
allmods.net
Farming Simulator 2019 Mods, FS 19 Maps, FS 19 Mods
www.fs2017mod.com
Optical filters, UV optics, electro optical crystals
www.eksmaoptics.com
LTV.LT – geriausių lietuviškų tinklalapių katalogas
www.ltv.lt/technologijos/
FS 2019 Mods, FS 2017 Mods, FS 2015 Mods
www.farming2015mods.com
Mokslo populiarinimo projektas „Mokslas verslui ir visuomenei“
www.mokslasplius.lt
Reklama


Reklama