Elektronika.lt
 2025 m. sausio 13 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 2025 01 13, 05:54. Visos datos yra GMT + 2 valandos.
 Forumas » Mikrovaldikliai » ATmega8 ir AVR Studio6 anomalijos
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 12
Pereiti prie 1, 2  Toliau
Pradėti naują temą  Atsakyti į pranešimą Rodyti ankstesnį pranešimą :: Rodyti kitą pranešimą 
 ATmega8 ir AVR Studio6 anomalijos
PranešimasParašytas: 2015 04 17, 00:53 Pranešti apie taisyklių pažeidimą Atsakyti su citata
*Ričardas
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Siųsti el. laišką Apsilankyti vartotojo tinklapyje
Situacija:
Iš ATmega8 10 bit ADC gaunu 235 skaičiuką, kurį vėliau verčiu char masyvu ir nusiunčiu panariui per uartą į UART–USB kaitiklį ir stebiu kompe per terminalą.
Taip neveikia ir terminale gaunu ne "235", tik "35", o "datas" kintamąjį gaunu gerą:
Kodas:

#include <stdio.h>

uint16_t data=0, tempb=0;
char datas[4], temps[4];

tempb=ADCread(0);
data=SPIread();

sprintf(temps,"%d",tempb); //8 bitų int tipo "tempb" konvertuojam į char tipo "temps"
sprintf(datas,"%d",data); //8 bitų int tipo "data" konvertuojam į char tipo "datas"

for (uint8_t i=0; i<4; i++)
      {
         USARTwrite(temps[i]);
      }
      
for (uint8_t i=0; i<4; i++)
      {
         USARTwrite(datas[i]);
      }


O va taip veikia (sukeitus sprintf eilutes vietomis) ir gaunu abu kintamuosius tokius kokius reikia:
Kodas:

#include <stdio.h>

uint16_t data=0, tempb=0;
char datas[4], temps[4];

tempb=ADCread(0);
data=SPIread();

sprintf(datas,"%d",data); //8 bitų int tipo "data" konvertuojam į char tipo "datas"
sprintf(temps,"%d",tempb); //8 bitų int tipo "tempb" konvertuojam į char tipo "temps"

for (uint8_t i=0; i<4; i++)
      {
         USARTwrite(temps[i]);
      }
      
for (uint8_t i=0; i<4; i++)
      {
         USARTwrite(datas[i]);
      }


Kompiliatorius GCC. Bandžiau ir su itoa funkcija versti į char, tas pats... Čia aš durnas ar kažkokia nesamonė čia darosi?

P.S. Pirmu atveju kai neveikia dar siunčiau į terminalą kartu tempb (dvejetainė) vertę ir iš paskos temps (koduota ASCII, char'as) vertę, gaunu:
Kodas:
00000000 11101011 | 00000000 00110011 00110101 00000000


Kas ir duoda 235 dvejetainiu, o po to "NUL 35 NUL".


Paskutinį kartą redagavo *Ričardas, 2015 04 17, 10:05. Redaguota 1 kartą

_________________
Nėra geriau už IBM/Lenovo ThinkPad!
 ATmega8 ir AVR Studio6 anomalijos
PranešimasParašytas: 2015 04 17, 06:27 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
vietoje %d naudok %i
 ATmega8 ir AVR Studio6 anomalijos
PranešimasParašytas: 2015 04 17, 08:25 Pranešti apie taisyklių pažeidimą Atsakyti su citata
*Ričardas
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Siųsti el. laišką Apsilankyti vartotojo tinklapyje
Na reiks pabandyti, kiek pagooglinau ir jūsų patarimas visai tinkamas. Bet nujaučiu nepadės, nes naudojant itoa funkciją nurodau tik pagrindą kuriuo reikia konvertuoti (šiuo atveju 10) ir jokių formato ženklų kaip %d ar %i nenaudoju, tačiau darėsi ta pati nesamonė.
P.S. AVR Studio atnaujinau iki naujausios, nepadėjo.

_________________
Nėra geriau už IBM/Lenovo ThinkPad!
 ATmega8 ir AVR Studio6 anomalijos
PranešimasParašytas: 2015 04 17, 09:38 Pranešti apie taisyklių pažeidimą Atsakyti su citata
darius_p
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Pažiūrėk ne ASCII terminalu o HEX kas ten vaikšto. Arba port monitorium. Dar gali būti UART problemos, arba tai kad printini visa buferį su NULL ir toliau.

*Ričardas rašo:
Čia aš durnas ar kažkokia nesamonė čia darosi? P.S. AVR Studio atnaujinau iki naujausios, nepadėjo.

Žinok įvelti savo klaidą yra 100x didesnė tikimybė nei užsirauti ant kompilerio klaidos. Ypač dirbant su C Very Happy
 ATmega8 ir AVR Studio6 anomalijos
PranešimasParašytas: 2015 04 17, 09:56 Pranešti apie taisyklių pažeidimą Atsakyti su citata
*Ričardas
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Siųsti el. laišką Apsilankyti vartotojo tinklapyje
Nu viršuje parašiau dvejetainiu kas ten vaikšto su RealTerm stebėjau.

_________________
Nėra geriau už IBM/Lenovo ThinkPad!
 ATmega8 ir AVR Studio6 anomalijos
PranešimasParašytas: 2015 04 17, 10:29 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Socrates
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
O tu esi tikras, kad pas tave ten tikrai 235 reiksme ateina? Nes tavo int kintamieji yra 16 bitu ilgio, taigi skaiciai iki 65535 (5 simboliai) plius speju turesi gale NULL, tai viso 6 simboliai, o tu bandai sukisti i 4.

Gali pamegint keleta variantu:
1) uint16_t pakeist i char, bet neaisku ka tavo uzduotos funkcijos SPIread() ir ADCread() grazina?

2) Daryk maskavima:
Kodas:

tempb=ADCread(0) & 0xFF;
data=SPIread() & 0xFF;


3) Jei nieko nesigauna, kintamuosius apsirasyk kaip char ir vietoj priskyrimo nuliams, kietai priskirk tai paciai 235 reiksmei ir atjunk savo funkcijas.

Vienzo itariu, kad tu nori 16 bitu sukist i 8, o sprintf pasimeta... Dar variantas yra leist padaryt ilgesni string'a.
 ATmega8 ir AVR Studio6 anomalijos
PranešimasParašytas: 2015 04 17, 11:02 Pranešti apie taisyklių pažeidimą Atsakyti su citata
darius_p
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
*Ričardas rašo:
Kas ir duoda 235 dvejetainiu, o po to "NUL 35 NUL".


Tai iš kur tas pirmas NULL?? Gal tu sumaišei pirmame poste ir pirmas variantas yra veikiantis, o antras neveikiantis? Tada būtų aišku, kad antras sprintf peržengia buferio ilgį ir nulį įrašo į sekantį buferį.
 ATmega8 ir AVR Studio6 anomalijos
PranešimasParašytas: 2015 04 17, 11:17 Pranešti apie taisyklių pažeidimą Atsakyti su citata
hencia
Patyręs dalyvis
Patyręs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
O koks char pagal nutylėjimą? Unsigned ar signed? Gal padės deklaruojant unsigned char ...
 ATmega8 ir AVR Studio6 anomalijos
PranešimasParašytas: 2015 04 17, 12:56 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Jei man reiktu isvesti dvi reiksmes, tai:
char b[20]; // turi uztekti visiems norimiems isvesti duomenims
uint16_t spd,tmp;
tmp=ADCread(); // cia is esmes nesvarbu ar 16 bit
spd=((uint8_t)SPIread()&0xFF); // cia kad SPIread nesugalvotu nuskaityti 16 bit
sprintf(b,"%i,%i\r\n",tmp,spd); // bent jau prie arduino einantis gcc tikrai nori %i 16/32bit int reiksmems
for(char*p=(char*)&b;*p;p++)USARTwrite(*p);
 ATmega8 ir AVR Studio6 anomalijos
PranešimasParašytas: 2015 04 17, 14:02 Pranešti apie taisyklių pažeidimą Atsakyti su citata
*Ričardas
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Siųsti el. laišką Apsilankyti vartotojo tinklapyje
Labai dėkoju už gausius atsakymus. Reiks dar juos giliau pasiskaityti ir po savaitgalio išmėginti, mat savaitgalį būsiu užimtas.
Nuoširdžiai dėkoju.
Pasidalinsiu rezultatais ir kam bus nuopelnai už efektyvų patarimą. Wink

_________________
Nėra geriau už IBM/Lenovo ThinkPad!
 ATmega8 ir AVR Studio6 anomalijos
PranešimasParašytas: 2015 04 17, 21:19 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AdressUnknown
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
darius_p rašo:
Pažiūrėk ne ASCII terminalu o HEX kas ten vaikšto. Arba port monitorium. Dar gali būti UART problemos, arba tai kad printini visa buferį su NULL ir toliau.

*Ričardas rašo:
Čia aš durnas ar kažkokia nesamonė čia darosi? P.S. AVR Studio atnaujinau iki naujausios, nepadėjo.

Žinok įvelti savo klaidą yra 100x didesnė tikimybė nei užsirauti ant kompilerio klaidos. Ypač dirbant su C :D


Kiek dirbu, esu du kartus užsirovęs ant kompilerio klaidos. Po kelių pataisų paketų viskas susitvarkė. Kalbu apie Microsoft Visual C++ 6.0.
 ATmega8 ir AVR Studio6 anomalijos
PranešimasParašytas: 2015 04 18, 06:55 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ą
Taigi elementaru - neteisingas kintamojo tipas nurodytas.

Vietoje:
Kodas:
char datas[4], temps[4];


turi būti:
Kodas:
unsigned char datas[4], temps[4];


Pagal nutylėjimą char yra signed tipas, tai reiškia maksimali jo reikšmė gali būti 127, todėl ten niekaip negali atsirasti 235. Dėl to blogai veikia itoa ir USARTwrite, kuri ko gero naudoja unsigned char.

O tokių dalykų kaip printf, sprintf su 8 bitų mikrovaldikliu reikėtų vengti. Vietos atmintyje užima daug, bet naudos labai mažai. Geriau naudot itoa, ltoa ir t.t.
 ATmega8 ir AVR Studio6 anomalijos
PranešimasParašytas: 2015 04 18, 07:35 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
gintaras_bar rašo:
Taigi elementaru - neteisingas kintamojo tipas nurodytas.

Vietoje:
Kodas:
char datas[4], temps[4];


turi būti:
Kodas:
unsigned char datas[4], temps[4];


Pagal nutylėjimą char yra signed tipas, tai reiškia maksimali jo reikšmė gali būti 127, todėl ten niekaip negali atsirasti 235. Dėl to blogai veikia itoa ir USARTwrite, kuri ko gero naudoja unsigned char.

O tokių dalykų kaip printf, sprintf su 8 bitų mikrovaldikliu reikėtų vengti. Vietos atmintyje užima daug, bet naudos labai mažai. Geriau naudot itoa, ltoa ir t.t.

IMHO, ne cia beda:
int sprintf(char *__s, const char *__fmt, ...);
cia labiau beda, kaip jau rase auksciau, del \0 uz masyvo ribu.
o del vietos siais laikais nereikia jaudintis, flash pakankamai, o knistis su itoa() ne tik nepatogu, bet tam tikrais atvejais dar ir nereikalingu pasekmiu atsiranda.
itoa() atsiperka kai flash labai mazai ir nereikia sinchronizuotai isvedineti fiksuoto formato eiluciu.
 ATmega8 ir AVR Studio6 anomalijos
PranešimasParašytas: 2015 04 18, 07:53 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ą
AlgisL rašo:
IMHO, ne cia beda:
int sprintf(char *__s, const char *__fmt, ...);
cia labiau beda, kaip jau rase auksciau, del \0 uz masyvo ribu.
o del vietos siais laikais nereikia jaudintis, flash pakankamai, o knistis su itoa() ne tik nepatogu, bet tam tikrais atvejais dar ir nereikalingu pasekmiu atsiranda.
itoa() atsiperka kai flash labai mazai ir nereikia sinchronizuotai isvedineti fiksuoto formato eiluciu.
Tokius patarimus "savo bobutei papasakok" Smile
Mėgėjiškam pasižaidimui tai taip, galima penkis kart "didesnį" mikrovaldiklį naudoti ir nesukti galvos dėl vietos atmintyje. Bet jei prietaisas užleistas į masinę gamybą, kur kiekvienas centas yra skaičiuojamas, "vaizdelis" visai kitas: 100000vnt. x 1ct = 1000€ .
Su itoa() KNISASI nebent visokie "arduinščikai", kurie be Arduino bijo net žingsnį į šoną žengti. Normalūs sistemų inžinieriai itoa(), strcut(), strcpy() ir t.t. NAUDOJA ir vargo nemato Smile
 ATmega8 ir AVR Studio6 anomalijos
PranešimasParašytas: 2015 04 18, 08:14 Pranešti apie taisyklių pažeidimą Atsakyti su citata
AlgisL
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
gintaras_bar rašo:
AlgisL rašo:
IMHO, ne cia beda:
int sprintf(char *__s, const char *__fmt, ...);
cia labiau beda, kaip jau rase auksciau, del \0 uz masyvo ribu.
o del vietos siais laikais nereikia jaudintis, flash pakankamai, o knistis su itoa() ne tik nepatogu, bet tam tikrais atvejais dar ir nereikalingu pasekmiu atsiranda.
itoa() atsiperka kai flash labai mazai ir nereikia sinchronizuotai isvedineti fiksuoto formato eiluciu.
Tokius patarimus "savo bobutei papasakok" Smile
Mėgėjiškam pasižaidimui tai taip, galima penkis kart "didesnį" mikrovaldiklį naudoti ir nesukti galvos dėl vietos atmintyje. Bet jei prietaisas užleistas į masinę gamybą, kur kiekvienas centas yra skaičiuojamas, "vaizdelis" visai kitas: 100000vnt. x 1ct = 1000€ .
Su itoa() KNISASI nebent visokie "arduinščikai", kurie be Arduino bijo net žingsnį į šoną žengti. Normalūs sistemų inžinieriai itoa(), strcut(), strcpy() ir t.t. NAUDOJA ir vargo nemato Smile

Kam tas strxxx() jei normalus inzinieriai gali ir savo analogus darbui su buferiu pasidaryti, kad strcpy nereiktu?
Ir labai idomiai atrodo LT gamintojas, kuris visa pasauli aprupina kazkokia tai iranga, bet algas gali moketi tik minimumo lygio Wink
Pradėti naują temą  Atsakyti į pranešimą Pereiti prie 1, 2  Toliau
 
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

Sveiki ir ekologiški maisto produktai

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
ATS Trailers
American Truck Simulator Mods, ATS Trucks, ATS 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