|
|
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:42. 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 1 iš 2 Pereiti prie 1, 2 Toliau |
|
|
|
|
ATmega8 ir AVR Studio6 anomalijos |
Parašytas: 2015 04 17, 00:53 |
|
|
|
Situacija:
Iš ATmega8 10 bit ADC gaunu 235 skaičiuką, kurį vėliau verčiu char masyvu ir nusiunčiu panariui per uartą į UARTUSB 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 |
Parašytas: 2015 04 17, 08:25 |
|
|
|
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 |
Parašytas: 2015 04 17, 09:38 |
|
|
|
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 |
|
|
|
|
|
ATmega8 ir AVR Studio6 anomalijos |
Parašytas: 2015 04 17, 09:56 |
|
|
|
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 |
Parašytas: 2015 04 17, 10:29 |
|
|
|
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 |
Parašytas: 2015 04 17, 11:02 |
|
|
|
*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 |
Parašytas: 2015 04 17, 12:56 |
|
|
|
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 |
Parašytas: 2015 04 17, 14:02 |
|
|
|
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ą. |
|
_________________ Nėra geriau už IBM/Lenovo ThinkPad! |
|
|
|
|
ATmega8 ir AVR Studio6 anomalijos |
Parašytas: 2015 04 17, 21:19 |
|
|
|
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 |
Parašytas: 2015 04 18, 06:55 |
|
|
|
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 |
Parašytas: 2015 04 18, 07:35 |
|
|
|
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 |
Parašytas: 2015 04 18, 07:53 |
|
|
|
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"
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 |
|
|
|
|
|
|
ATmega8 ir AVR Studio6 anomalijos |
Parašytas: 2015 04 18, 08:14 |
|
|
|
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"
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 |
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 |
|
|
|
|
|
|
|
Google paieška forume |
|
|
Naujos temos forume |
|
|
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 |
|
|
|