با سلام
من برای ارتباط سریالم میخوام از یوزارت1 میکروی مگا128 استفاده کنم. میدونم که نمیشه از توابع کتابخانه stdio.h برای این منظور استفاده کرد.
روی یوزارت0 هم برنامه و همه چیز درست جواب میده. ولی یوزارت 1 رو نه
روی یوزارت1 هم تایع putchar1 درست جواب میده ولی getchar1 حتی یه کاراکتر و هم درست دریافت نمیکنه
ممنون میشم راهنماییم کنید
یک سوال دیگه هم دارم از وقفه ی کدویزارد استفاده کردم. این تابع getchar1 همونجوری که اسمش میگه کاراکتر میگیره فقط و باید این کاراکترها ادغام بشند ؟
من به خاطر وجود سنسور sht11 مجبورم حداکثر روی فرکانس 3مگ بمونم و همین سرعت انتقال دیتا رو پایین میاره و مجبور شدم همه ی داده هام رو توی یه رشته ادغام کنم و فقط یه رشته ارسال بشه. اگر از getchar استفاده کنم یعنی تاخیر خیلییی زیاد. درسته ؟ :surprised:
راه حلی براش نیست ؟
کد داخلی توابع puts و scanf چی هستن؟ نمیشه دستی نوشتشون ؟
و این هم توابع خود کدویزارد که نمایش داده ی ارسال شده در تابع getchar1 قرار دارد.
من برای ارتباط سریالم میخوام از یوزارت1 میکروی مگا128 استفاده کنم. میدونم که نمیشه از توابع کتابخانه stdio.h برای این منظور استفاده کرد.
روی یوزارت0 هم برنامه و همه چیز درست جواب میده. ولی یوزارت 1 رو نه
روی یوزارت1 هم تایع putchar1 درست جواب میده ولی getchar1 حتی یه کاراکتر و هم درست دریافت نمیکنه
ممنون میشم راهنماییم کنید
یک سوال دیگه هم دارم از وقفه ی کدویزارد استفاده کردم. این تابع getchar1 همونجوری که اسمش میگه کاراکتر میگیره فقط و باید این کاراکترها ادغام بشند ؟
من به خاطر وجود سنسور sht11 مجبورم حداکثر روی فرکانس 3مگ بمونم و همین سرعت انتقال دیتا رو پایین میاره و مجبور شدم همه ی داده هام رو توی یه رشته ادغام کنم و فقط یه رشته ارسال بشه. اگر از getchar استفاده کنم یعنی تاخیر خیلییی زیاد. درسته ؟ :surprised:
راه حلی براش نیست ؟
کد داخلی توابع puts و scanf چی هستن؟ نمیشه دستی نوشتشون ؟
کد:
void Send_Packet(void) { UCSR1B=0x48; // TXCIE & TXEN == 1 PORTD.4 =1; // Transfer Enable delay_ms(100); putchar1(Packet); } void Get_Sample(void) { UCSR1B=0x90; // RXCIE & RXEN == 1 PORTD.4 =0; // Reciever Enable delay_ms(100); getchar1(); }
کد:
// USART1 Receiver interrupt service routine interrupt [USART1_RXC] void usart1_rx_isr(void) { char status,data; status=UCSR1A; data=UDR1; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer1[rx_wr_index1++]=data; #if RX_BUFFER_SIZE1 == 256 // special case for receiver buffer size=256 if (++rx_counter1 == 0) rx_buffer_overflow1=1; #else if (rx_wr_index1 == RX_BUFFER_SIZE1) rx_wr_index1=0; if (++rx_counter1 == RX_BUFFER_SIZE1) { rx_counter1=0; rx_buffer_overflow1=1; } #endif } } // Get a character from the USART1 Receiver buffer #pragma used+ char str[10]; char getchar1(void) { char data; while (rx_counter1==0); data=rx_buffer1[rx_rd_index1++]; #if RX_BUFFER_SIZE1 != 256 if (rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0; #endif #asm("cli") --rx_counter1; #asm("sei") itoa(data,str); glcd_outtextxy(40,100,str); glcd_clear(); return data; } #pragma used- // USART1 Transmitter buffer #define TX_BUFFER_SIZE1 32 char tx_buffer1[TX_BUFFER_SIZE1]; #if TX_BUFFER_SIZE1 <= 256 unsigned char tx_wr_index1,tx_rd_index1,tx_counter1; #else unsigned int tx_wr_index1,tx_rd_index1,tx_counter1; #endif // USART1 Transmitter interrupt service routine interrupt [USART1_TXC] void usart1_tx_isr(void) { if (tx_counter1) { --tx_counter1; UDR1=tx_buffer1[tx_rd_index1++]; #if TX_BUFFER_SIZE1 != 256 if (tx_rd_index1 == TX_BUFFER_SIZE1) tx_rd_index1=0; #endif } } // Write a character to the USART1 Transmitter buffer #pragma used+ void putchar1(char c) { while (tx_counter1 == TX_BUFFER_SIZE1); #asm("cli") if (tx_counter1 || ((UCSR1A & DATA_REGISTER_EMPTY)==0)) { tx_buffer1[tx_wr_index1++]=c; #if TX_BUFFER_SIZE1 != 256 if (tx_wr_index1 == TX_BUFFER_SIZE1) tx_wr_index1=0; #endif ++tx_counter1; } else UDR1=c; delay_ms(800); #asm("sei") } #pragma used-
دیدگاه