 |

|
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 04 30, 13:38. Visos datos yra GMT + 2 valandos.
|
|
|
 |
Forumas » Mikrovaldikliai » AVR USART
|
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 |
|
 |
AVR USART |
Parašytas: 2010 04 14, 22:09 |
|
|
|
Sveiki. Mano problema yra string'u "atpazinimas". Tai yra noriu kad mikrovaldiklis galetu atpazinti priimtas eilutes, o ne tik pavienius simbolius. Tam naudoju cikla for , keliu i masyva, bet nebeiseina. Kiek ziurejau tai net vieno simbolio i masyva neikelia. Mikrovaldiklis Atmega16, 4MHZ. Butu malonu sulaukt pagalbos
int USARTReadChar()
{
while(!(UCSRA & (1<<RXC)))
{
}
return UDR;
}
int main(void)
{
DDRD=255;
while(1){
unsigned int data=USARTReadChar();
unsigned int a[3];
unsigned int i;
for(i=0;i<3;i++){
a[i]=data;
}
if(a[0]==1 && a[1]==2 && a[2]==3){
PORTD=255;
}
} |
|
|
|
|
 |
 |
AVR USART |
Parašytas: 2010 04 15, 05:04 |
|
|
|
Kodas: |
unsigned char USARTReadChar(void)
{
// laukiam kol baitas priimtas
while((UCSRA&(1<<RXC)) == 0);
//grazinam ka gavom
return UDR;
}
int main(void)
{
DDRD=255;
while(1)
{
unsigned char a[3];
unsigned int i;
for(i=0;i<3;i++)
{
a[i]=USARTReadChar;
}
if(a[0]==1 && a[1]==2 && a[2]==3)
{
PORTD=255;
}
} |
Bet geriau naudok:
ISR(USART_RXC_vect)
{
// Cia kodas kuri nori vykdyti kai per UART gaunami duomenis(RX).
}
pvz:
Nepamirsk uart nustatymuose nustatyti:
UCSRB=(1<<RXEN)|(1<<RXCIE);
pvz:
Kodas: |
ISR(USART_RXC_vect)
{
unsigned char data;
data=USARTReadChar();
if(data==(1))
PORTC |= (1 << 0); //LED ijungta
}
int main(void)
{
USART_Init();
while(1)
{
}
return 0;
} |
|
|
|
|
|
 |
 |
AVR USART |
Parašytas: 2010 04 15, 16:58 |
|
|
|
pamiršai
ir netikslinga ISR`e tikrint flagą, kai ISRas ir taip to flago yra pakviečiamas. jei nori suklijuoti masyvą, tai daryk už ISR, išsaugodamas UDR priimtą reikšmę kokiam nors kintamajame ir main`e jį apdorodamas.
jei naudoji winavr, kad ISR veiktų turi primesti:
Kodas: |
#include <interrupt.h> |
HIdef
tavo kodas įkelia data į visus a[]. o data priima tik kartą. |
|
|
|
|
 |
 |
AVR USART |
Parašytas: 2010 04 15, 19:06 |
|
|
|
R2D2 rašo: |
pamiršai
ir netikslinga ISR`e tikrint flagą, kai ISRas ir taip to flago yra pakviečiamas. jei nori suklijuoti masyvą, tai daryk už ISR, išsaugodamas UDR priimtą reikšmę kokiam nors kintamajame ir main`e jį apdorodamas.
jei naudoji winavr, kad ISR veiktų turi primesti:
Kodas: |
#include <interrupt.h> |
HIdef
tavo kodas įkelia data į visus a[]. o data priima tik kartą. |
O kaip padaryt kad data priimtu ne tik karta? jo terminale kai rasai simboli, tai jo nerodo, tiesiog issiuncia ir viskas, eilutes neparasysi ir paspaudes enter nenusiusi.. kaip tai galima butu padaryt? |
|
|
|
|
 |
AVR USART |
Parašytas: 2010 04 15, 20:39 |
|
|
|
jei hyper terminale, tai pridėk nustatymuose echo.
kad nuolatos nuskaitytų, tai kaip markaz rašė. |
|
|
|
|
 |
AVR USART |
Parašytas: 2010 04 16, 19:38 |
|
|
|
dekui uz pagalba gaila tik kad niekas neveikia, atvirksciai irasius ta Markaz programa pakimba mikrovaldiklis, uzgesta prie TX ir RX prijungti diodai ir viskas tada ponyprog jo nemato, nei skaito nei raso nk, ir kol rr pc nepadarai tol kitos programos irasyti neimanoma. Turit minciu? |
|
|
|
|
 |
AVR USART |
Parašytas: 2010 04 16, 20:22 |
|
|
|
hyper terminalas (HT) užblokuoja com portą ir ponyprog negauna jo valdymo. HT disconnect ar pan. reik nuspaust ir veiks.
o atmega pakimba nes kažką ne taip parašei. |
|
|
|
|
 |
AVR USART |
Parašytas: 2010 04 16, 20:33 |
|
|
|
del to viskas tvarkoj. Irasau markaz programa, nugesta diodai, tada einu i HT, bandau siust duomenis (siuo atveju rasyt 1 , 2 , 3) , bet parases nieko nesidaro, neisijungia diodai. Ir va kai po sito isjungiu HT, einu i ponyprog perasinet softo, tada jau ponyprog buna "atsijunges", dingsta rysys... Nzn negi tai del tos programos? Naudoju AVR Studio4 , sukompiliuoja be eroru ir be warning'u, viskas lyg ir tvarkoj... Tiesa buvo klaidele sioj vietoj:
for(i=0;i<3;i++)
{
a[i]=USARTReadChar;
}
, as ja istaisiau i
for(i=0;i<3;i++)
{
a[i]=USARTReadChar();
} |
|
|
|
|
 |
AVR USART |
Parašytas: 2010 04 16, 22:36 |
|
|
|
šiaip 1!='1'
tu HT spausdini '1', o tikrini ar ten 1. google: ascii table
dėl com, o ką ponyprog rašo, kokią klaidą? kažkas dar naudoja com portą matyt |
|
|
|
|
 |
AVR USART |
Parašytas: 2010 04 16, 23:09 |
|
|
|
paprastai tokie dalykai daromi rasant i buferi simboliu eilute. Vieno pertraukimo nuo Usart RX metu irasomas vienas simbolis i buferi ir sekama, kad buferis nepersikrautu... Pagrindiniame cikle daroma buferio analize ir desifruojama info buferyje... |
|
_________________ Nieko taip lengvai nedaliname, kaip patarimus... |
|
|
|
 |
AVR USART |
Parašytas: 2010 04 18, 13:28 |
|
|
|
caca rašo: |
paprastai tokie dalykai daromi rasant i buferi simboliu eilute. Vieno pertraukimo nuo Usart RX metu irasomas vienas simbolis i buferi ir sekama, kad buferis nepersikrautu... Pagrindiniame cikle daroma buferio analize ir desifruojama info buferyje... |
Jeigu aš šitą žinočiau, tai turbūt neuždavinėčiau tokių klausimų? ... |
|
|
|
|
 |
 |
AVR USART |
Parašytas: 2010 04 18, 15:04 |
|
|
|
Kodas: |
//**************************************************
//******** IAR, AVR, 4MHz, USART br19200 ***********
//**************************************************
#define ENABLE_BIT_DEFINITIONS
#include <ioavr.h>
#include <intrinsics.h>
#include <string.h>
//
#define sbi(PORT,BIT) (PORT |= (1<<BIT))
#define cbi(PORT,BIT) (PORT &= ~(1<<BIT))
#define bitas(PIN,BIT) (PIN &(1 << BIT))
//
char usart_data[8];
//*************************************************
void usart_send(char *tp){
unsigned char i;
i = 0;
while(tp[i] != 0){
while(1){
if(bitas(UCSRA,UDRE)){
UDR = tp[i];
i++;
break;
}
}
}
}
//*************************************************
unsigned char usart_read(void){
unsigned char i;
TCNT0 = 0;
sbi(TIFR,TOV0);
i = 0;
while(1){
if(bitas(TIFR,TOV0)){ //jei praejus 16ms negauna nauju duomenu
return 0; //reiskia duomenys atsiusti
}
if(bitas(UCSRA,RXC)){
usart_data[i] = UDR;
TCNT0 = 0;
i++;
}
if(i == 8) return 1; //klaida persipilde usart_data mas.
}
}
//*************************************************
void usart_init(void){
UBRRH = 0;
UBRRL = 12; //br19200
UCSRB = 0x18;
UCSRC = 0x86;
}
//*************************************************
void main( void ){
unsigned char i;
DDRC = 0xFF;
TCCR0 = 0x04;
usart_init();
usart_send("USART Test\n");
while(1){
if(bitas(UCSRA,RXC)){
i = usart_read();
if(i == 0){ //jei viskas gerai tikrina kas atsiusta
i = strncmp(usart_data, "123",3);
if(i == 0){
PORTC = 255;
}
i = strncmp(usart_data, "456",3);
if(i == 0){
PORTC = 0;
}
}else{ //jei blogai
PORTC = 0xAA; //rodo klaida;
}
for(i=0; i<8; i++){
usart_data[i] = '0'; //isvalo usar_data masyva
}
}
}
}
|
avr usart video  |
|
|
|
|
 |
 |
AVR USART |
Parašytas: 2010 04 19, 18:51 |
|
|
|
dekoju uz pagalba : ) Dar viena klausima turiu,tarkim gaunu duomenis kurie susideda ne is vienos eilutes, o is keliu, tarkim is dvieju eiluciu (jos gaunamas be pertrauku). Kaip mikrovaldiklis interpretuoja tai? Kaip tas dvi gautas eilutes apdorot? Tai yra pirma eilute susidet i viena masyva, o antra - i antra? Bandziau visokiu variantu, bet nebeiseina. Va turbut akivaizdziausias pvz:
if(i == 0){ //jei viskas gerai tikrina kas atsiusta
//iesko tam tikru simboliu, kurie yra ne pirmojoj gautoj eilutei, o butent antroj
char *ptr = strstr(usart_data, "dingo");
if(ptr != NULL){
PORTD = 255;
USart_Send_String(ptr);
}
Taigi pvz nusiuntus sias dvi eilutes,
mano batai buvo du
vienas dingo nerandu
zodzio "dingo" jau neranda.
P.S. masyvo dydi padariau atitinkama
P.S. dar karta primenu sios eilutes siunciamos i mC nesustojant
Isvados: Reikia pirmaja gauta zinute issidet i viena masyva, antra eilute - i antra. Kitokiu variantu nesugalvojau, bet jei kas zinot tai siulykit. Aciu uz pagalba : ) |
|
|
|
|
 |
 |
AVR USART |
Parašytas: 2010 04 19, 19:39 |
|
|
|
Is esmes tai tos dvi eilutes turetu atrodyt taip?
mano batai buvo du \n vienas dingo nerandu
Pagal mano bandymus tai taip nera, nes tada tikrai rastu zodi esanti uz \n , ta prasme kitoj eilutej. |
|
|
|
|
 |
AVR USART |
Parašytas: 2010 04 19, 20:52 |
|
|
|
pasiunti tokią eilutę (jei imanoma) 'mano batai buvo du\nvienas dingo nerandu\n'
Kodas: |
char usart_data_1[16];
char usart_data_2[16];
//*************************************************
void usart_read(void){
unsigned char i;
i = 0;
while(usart_data_1[i] != '\n'){ //"mano batai buvo du\n"
if(bitas(UCSRA,RXC)){
usart_data_1[i] = UDR;
i++;
}
}
i = 0;
while(usart_data_2[i] != '\n'){//"vienas dingo nerandu\n"
if(bitas(UCSRA,RXC)){
usart_data_2[i] = UDR;
i++;
}
}
}
|
[/url] |
|
|
|
|
|
 |
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 |
 |
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 |
 |
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
 |
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
 |
Football Training Kit
Football Training Equipment,
Football Skills,
Football Training |
|

|
 |