Elektronika.lt
 2024 m. lapkričio 24 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 2024 11 24, 10:51. 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, 22: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, 07:25 Pranešti apie taisyklių pažeidimą Atsakyti su citata
a1girdas
Senbuvis
Senbuvis
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, 09: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, 11: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, 12: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, 12: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, 12: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, 12:37 Pranešti apie taisyklių pažeidimą Atsakyti su citata
gintaras_bar
Patyręs dalyvis
Patyrę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, 20: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

Global electronic components distributor – Allicdata Electronics

Electronic component supply – „Eurodis Electronics“

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

Full feature custom PCB prototype service

GENERAL FINANCING BANKAS

Mokslo festivalis „Erdvėlaivis Žemė

LTV.LT - lietuviškų tinklalapių vitrina

„Konstanta 42“

Technologijos.lt

Buitinė technika ir elektronika internetu žemos kainos – Zuza.lt

www.esaugumas.lt – apsaugok savo kompiuterį!

PriedaiMobiliems.lt – telefonų priedai ir aksesuarai

Draugiškas internetas

FS25 Tractors
Farming Simulator 25 Mods, FS25 Maps, FS25 Trucks
ETS2 Mods
ETS2 Trucks, ETS2 Bus, Euro Truck Simulator 2 Mods
FS22 Tractors
Farming Simulator 22 Mods, FS22 Maps, FS25 Mods
VAT calculator
VAT number check, What is VAT, How much is VAT
LEGO
Mänguköök, mudelautod, nukuvanker
Thermal monocular
Thermal vision camera,
Night vision ar scope,
Night vision spotting scope
FS25 Mods
FS25 Harvesters, FS25 Tractors Mods, FS25 Maps Mods
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija
FS25 Mods
FS25 Maps, FS25 Cheats, FS25 Install Mods
GTA 6 Weapons
GTA 6 Characters, GTA 6 Map, GTA 6 Vehicles
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps
Reklama
‡ 1999– © Elektronika.lt | Autoriaus teisės | Privatumo politika | Atsakomybės ribojimas | Turinys | Reklama | Kontaktai LTV.LT - lietuviškų tinklalapių vitrina
Script hook v, Openiv, Menyoo
gta5mod.net
FS25 Mods, FS25 Tractors, FS25 Maps
fs25mods.lt
Optical filters, UV optics, electro optical crystals
www.eksmaoptics.com
Reklamos paslaugos
SEO sprendimai

www.addad.lt
Elektroninių parduotuvių optimizavimas „Google“ paieškos sistemai
www.seospiders.lt
FS22 mods, Farming simulator 22 mods,
FS22 maps

fs22.com
Reklama


Reklama