Технический форум по робототехнике.
flyroman » 04 фев 2009, 23:03
Люди добрые помогите пожалуйста настроить UART в Atmega162. Кварц - 18,4320 MHz.
В даташитах (USART Initialization) ниче не понял. Пишу как там , не работает.
Если есть код программы на Си пожалуйста, с рабочими настройками.
И еще если есть то отправку и прием сообщения.
Заранее благодарен! Помогите очень нужно, может даже судьба решается моя
. Помогите.
Даташит, чтобы не искать, у кого нет:
http://depositfiles.com/files/ig7tb6htu
galex1981 » 04 фев 2009, 23:10
В CodeVision есть генератор начальных кодов. Не пробовали?
Добавлено спустя 4 минуты 27 секунд: Вот сгенерированный им код:
Код: Выделить всё • Развернуть /***************************************************** This program was produced by the CodeWizardAVR V2.03.4 Standard Automatic Program Generator © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 04.02.2009 Author : Company : Comments: Chip type : ATmega162 Program type : Application Clock frequency : 18,432000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega162.h> #define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7 #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<OVR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) // USART0 Receiver buffer #define RX_BUFFER_SIZE0 8 char rx_buffer0[RX_BUFFER_SIZE0]; #if RX_BUFFER_SIZE0<256 unsigned char rx_wr_index0,rx_rd_index0,rx_counter0; #else unsigned int rx_wr_index0,rx_rd_index0,rx_counter0; #endif // This flag is set on USART0 Receiver buffer overflow bit rx_buffer_overflow0; // USART0 Receiver interrupt service routine interrupt [USART0_RXC] void usart0_rx_isr(void) { char status,data; status=UCSR0A; data=UDR0; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer0[rx_wr_index0]=data; if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0; if (++rx_counter0 == RX_BUFFER_SIZE0) { rx_counter0=0; rx_buffer_overflow0=1; }; }; } #ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART0 Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter0==0); data=rx_buffer0[rx_rd_index0]; if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0; #asm("cli") --rx_counter0; #asm("sei") return data; } #pragma used- #endif // USART0 Transmitter buffer #define TX_BUFFER_SIZE0 8 char tx_buffer0[TX_BUFFER_SIZE0]; #if TX_BUFFER_SIZE0<256 unsigned char tx_wr_index0,tx_rd_index0,tx_counter0; #else unsigned int tx_wr_index0,tx_rd_index0,tx_counter0; #endif // USART0 Transmitter interrupt service routine interrupt [USART0_TXC] void usart0_tx_isr(void) { if (tx_counter0) { --tx_counter0; UDR0=tx_buffer0[tx_rd_index0]; if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0; }; } #ifndef _DEBUG_TERMINAL_IO_ // Write a character to the USART0 Transmitter buffer #define _ALTERNATE_PUTCHAR_ #pragma used+ void putchar(char c) { while (tx_counter0 == TX_BUFFER_SIZE0); #asm("cli") if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0)) { tx_buffer0[tx_wr_index0]=c; if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0; ++tx_counter0; } else UDR0=c; #asm("sei") } #pragma used- #endif // Standard Input/Output functions #include <stdio.h> // Declare your global variables here void main(void) { // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x00; // Port E initialization // Func2=In Func1=In Func0=In // State2=T State1=T State0=T PORTE=0x00; DDRE=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // Timer/Counter 3 initialization // Clock value: Timer 3 Stopped // Mode: Normal top=FFFFh // Noise Canceler: Off // Input Capture on Falling Edge // OC3A output: Discon. // OC3B output: Discon. // Timer 3 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR3A=0x00; TCCR3B=0x00; TCNT3H=0x00; TCNT3L=0x00; ICR3H=0x00; ICR3L=0x00; OCR3AH=0x00; OCR3AL=0x00; OCR3BH=0x00; OCR3BL=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-15: Off MCUCR=0x00; EMCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; ETIMSK=0x00; // USART0 initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART0 Receiver: On // USART0 Transmitter: On // USART0 Mode: Asynchronous // USART0 Baud Rate: 9600 UCSR0A=0x00; UCSR0B=0xD8; UCSR0C=0x86; UBRR0H=0x00; UBRR0L=0x77; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; // Global enable interrupts #asm("sei") while (1) { // Place your code here }; }
flyroman » 04 фев 2009, 23:14
Спасибо только вот что там лишнее? А генератор не видел))) Буду знать. Спасибо.Добавлено спустя 1 минуту 12 секунд: Есть разница в программе между ATmega162 и ATmega162P?
galex1981 » 04 фев 2009, 23:15
лишнего в данном случае кроме подсказок-комментариев нет, в основном идут инициализации пазличных узлов МК. Это начальный код под твой МК, на основе которого ты можешь делать что хочешь. Функции есть читать и писать символ в UART.
flyroman » 04 фев 2009, 23:19
Спасибо большое, надеюсь заработает. Счас проверить не могу проверю отпишу.
EdGull » 04 фев 2009, 23:51
а кварц не великоват?
galex1981 » 05 фев 2009, 00:03
Слушай Эд, не подумал... Это либо МК будет работать как разогнанный, либо вообще работать не будет...
avr123.nm.ru » 05 фев 2009, 11:09
flyroman писал(а): Люди добрые помогите пожалуйста настроить UART в Atmega162. Кварц - 18,4320 MHz. В даташитах (USART Initialization) ниче не понял. Пишу как там , не работает. Если есть код программы на Си пожалуйста, с рабочими настройками. И еще если есть то отправку и прием сообщения.
Посомтрите задачу-упражнение 5 -
Прием и передача данных на ATmega16 и настройка USART мастером CVAVR -
http://avr123.nm.ru/z5.htm
flyroman » 05 фев 2009, 13:55
EdGull писал(а): а кварц не великоват?
Нет не великоват, схема промышленная, плата заводская.
EdGull » 05 фев 2009, 14:01
да хоть трижды промышленные и заводские...
даташит пробывал читать на предмет максимального кварца у ATmega162?
slavaslx » 06 фев 2009, 15:48
Кварц поменяй на <16M (например 11,0592 Мгц - всегда таким пользуюсь, когда нужен ком) 162-я роботает только до такого значения частоты. из даташита -- • Speed Grades – 0 - 1 MHz for ATmega162V – 0 - 8 MHz for ATmega162L/U – 0 - 16 MHz for ATmega162
avr123.nm.ru » 06 фев 2009, 16:01
slavaslx писал(а): 162-я роботает только до такого значения частоты. из даташита --
Читая даташит надо ПОНИМАТЬ что там написано.
Если есть что сказать, говори... Нечего тут провоцировать на офтопик!!! <EdGull>
flyroman » 10 фев 2009, 02:27
А что можете сказать на это из Даташита 162P?
Duhas » 10 фев 2009, 03:18
я скажу что таблица скорее всего сделана для всех МК... и такие как тиня 2313 штатно держит 20МГц...
EdGull » 10 фев 2009, 08:27
мало того, в свое время была выпущена довольно большая партия мег88 на 24МГц, но это не значит что теперь все меги могут работать таких частотах.