Sari la conținut
ELFORUM - Forumul electronistilor

Comunicare seriala Atmega8


Vizitator

Postări Recomandate

Buna seara,va rog am urgent nevoie de ajutor.Trebuie sa programez un atmega8 care sa comunice pe interfata seriala cu un PC,mai exact,primesc un semnal de la un circuit cu senzor pir(3.6mV),pe pinul ICP1 si trebuie sa l transmit pe portul serial la o aplicaatie labview.Aplicatia o am,dar nu stiu sa programez defel si sunt in foarte mare criza de timp.Va rog daca m-ati putea ajuta...as fi recunoscator.atasez si schema. Va multumesc pentru timp si va sunt recunoscator daca ma puteti ajuta.

Link spre comentariu
  • Răspunsuri 5
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • nana

    2

  • srdjan

    1

  • stefan_k

    1

Top autori în acest subiect

Daca prin "ajutor" si "nu stiu sa programez defel" intelegeti sa va scrie altcineva softul ... atunci poate mai bine ati incerca la "Bazar/Servicii".Desi e drept ca fiind directionat spre Atmel, aici aveti un pic mai multa audienta. Poate gasiti pe cineva interesat.Mai ales ca tocmai e vorbea despre costul orei de programare :rade:

Link spre comentariu

te intereseaza in mod deosebit "Input Capture Unit" - pag. 83 din datasheet-ul lui atmega8 dar poti sa te apuci linistit sa studiezi de la "16-bit Timer/Counter1" - pag. 73 si "USART" pagina 133nu e asa greu si vei primi ajutoare dar daca pentru tine e urgent nu inseamna ca trebuie sa facem noi treaba ta. vino si tu cu o contributie si te ajutamPS: poseteaza codul ce l-ai scris pana acum...

Link spre comentariu

Exzista 2 variante de executie ale acestui proiect adica pui un cod care l-ai facut tu si stii despre ce ai scris acolo nu ca ai gasit pe net vre=o chestie si habar nu ai cu ce se maninca MCU-urile(avand in vedere ca tu nu stii nici cum se programeaza cam asta inclin sa cred) atunci te ajutam iti mai indicam unde poate ai gresit daca dai mai multe detali despre poriect. si varianta 2 ne spui ce ai de facut cum si ce parametri terebe sa execute controllerul adica ce semnal ai de intrare si ce pachet de date vrei la iesirea seriala si atunci lasi codu si programarea in seama specialistilor dar bine inteles contra cost.eu iti dau un simplu indiciu 1 ICP se foloseste pentru masurarea duratei impulsurilor intre 2 evenimente ale semnalului (frecv) sau ca decalnsator pentu un numarator

Link spre comentariu
  • 2 săptămâni mai târziu...

[#include #include #define data PB0#define UART_BAUD_RATE 9600#define F_OSC 4000000#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_OSC)/((UART_BAUD_RATE)*16l)-1)void USARTInit(uint8_t UART_BAUD_CALC){ //Set Baud rate UBRRL = UART_BAUD_CALC; UBRRH = (UART_BAUD_CALC >>8); /*Set Frame Format >> Asynchronous mode >> No Parity >> 1 StopBit >> char size 8 */ UCSRC=(1<

Link spre comentariu
  • 4 săptămâni mai târziu...

Find un topic despre comunicatie seriala am sa postez si eu aici sper sa ma scuze initiatorul acestui thread.

 

Problema se pune in felul urmator eu incerc sa folosesc un atmega128 si portul USART0 pe care am activate intreruperile RXCIE0 astfel in cat in momentul in care primesc caracterul 'a' sa transmita un sir de caractere intr-un format, iar daca am caracterul 'b' sa imi trimita in alt format.

 

Problema este ca in momentul in care receptioneaza prima oara un caracter 'a' sau 'b' mie imi trimite in continuu acelasi sir de caractere eu avand nevoie doar odata sa imi transmita acel sir.

Am incercat sa dezactivez intreruperea in timpul executari rutinei de intreupere dar nici o sansa. imi apare in continuu urmatorul mesaj de la simulator Writing to UDR0 while transmiting operation is in progress. Data will be ignored.

void UART0_Init(void){							// Baud Rate = 9600UBRR0L=0x67;UBRR0H=0x00;	// Set frame format: 8data, 1stop bitUCSR0C=	(0<<USBS0)|(1<<UCSZ00)|(1<<UCSZ01); // Enable receiver and transmitterUCSR0B=(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);   UCSR0A=0x00;}ISR(USART0_RX_vect){j++;i=i+3;char data;UDR0=data;while(!(UCSR0A&(1<<UDRE0)));// asteapta pana se goleste bufferulif(data=='a') //mesaj date fara date sonare //$fara,X,Y,O,vit,dist,azim,Roll,pich,temp,lumin*; printf("$FARA%d,%d,%d,%0.2f,%d,%d,%d,%0.2f,%d*",j,100+j,(j+10)%360,(j+1)/4,j+300,j+24,j+75,(j+12)/5,j+99);if(data=='b') //(S1,S2,S3,S4,S5,Sld,Sls,Lumina,Azim,Pich,Roll,Temp%f,Vit%f,Distanta,Theta)printf("$SON%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%0.2f,%0.2f,%d,%d*",i+130,i+50,i+60,i+35,i+70,i+100,i+33,i-1,i+3,i+30,i+45,(double)(i+30)/4,(double)(i+10)/10,i+100,i+10);}
!! sa rezolvat trebuia sa pun o conditie ca sa astept sa se goleasca bufferul circular de date astfel incat flagu UDRE0 sa devina 0;

cat de cretine pot sa fie unele solutii si cautam sa le rezolvam cat mai complicat :da

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări