|
|
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:22. 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
|
|
|
|
|
atmega16 char to integer |
Parašytas: 2017 10 25, 22:11 |
|
|
|
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 |
Parašytas: 2017 10 26, 07:25 |
|
|
|
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 |
Parašytas: 2017 10 26, 09:48 |
|
|
|
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 |
Parašytas: 2017 10 26, 11:05 |
|
|
|
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 |
Parašytas: 2017 10 26, 12:04 |
|
|
|
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 |
Parašytas: 2017 10 26, 12:10 |
|
|
|
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 |
Parašytas: 2017 10 26, 12:16 |
|
|
|
išsisprendžiau tereikejo dar vienos eilutės
|
|
_________________ Diplomas tik etikete ant konservų dėžutes. O kas slepiasi dėžutėje neaišku. |
|
|
|
|
|
atmega16 char to integer |
Parašytas: 2017 10 26, 12:37 |
|
|
|
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 |
Parašytas: 2017 10 26, 20:28 |
|
|
|
gintaras_bar ačiū už patarimus |
|
_________________ Diplomas tik etikete ant konservų dėžutes. O kas slepiasi dėžutėje neaišku. |
|
|
|
|
|
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 |
|
|
|