Технический форум по робототехнике.
gerb13 » 09 апр 2009, 14:03
Добрый день, прошу помочь, написал маленькую прогу работы uarta на cvavr, при этом передача и прием данных с компьютера без прерывания работают нормально, попытка связи через прерывание почему-то не получилась, микроконтроллер вообще не переходит по вектору прерывания, подскажите в чем это дело, (пробовал через codevizard тоже не получается)
код программы:
Код: Выделить всё • Развернуть //atmega32, fsck=16MHz #include <delay.h> #include <mega32.h> #define RXB8 1 //usart control bits #define TXB8 0 #define UPE 2 #define DOR 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) #define DATA_REGISTER_FULL (1<<DOR) // USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) { char data; PORTB++; //значение после одного входа в прерывание-F-1 data=UDR; //while(!(UCSRA & DATA_REGISTER_EMPTY)); // UDR=data; } void reset_WDT(void) { #asm WDR #endasm } void initialization(void) { UCSRA=0x00;//uart initialization 8data,1stop,no parity, asynchronous, 38400 UCSRB=0x98; UCSRC=0x86; UBRRH=0x00; UBRRL=0x19;//end usart initialization DDRD=0xFF; //port usart and max 485 PORTD=0xFF;//usart on and max 485 transmit DDRB=0xFF; } void main(void) { initialization(); reset_WDT(); #asm("sei")// Global enable interrupts while(!(UCSRA & DATA_REGISTER_EMPTY)); PORTB=0xF; UDR=8; //while(!(UCSRA&DATA_REGISTER_FULL)); while (1) { reset_WDT(); delay_ms(1000); }; }
Вложения
MC+UART.rar
(16.56 КиБ) Скачиваний: 17
avr123.nm.ru » 09 апр 2009, 14:46
Я бы советовал вам посмотреть в VMLAB или в PROTEUS. в задаче 5 пример можно использовать как готовый шаблон с настроеной связью, просто замените код на ваш и смотрите что не так.
http://avr123.nm.ru/z5.htm
gerb13 » 09 апр 2009, 15:31
я пробовал сделать как в вашем примере, пробовал оставить исходный код после codevizard, все тоже самое, не работает почему-то только прерывание, прикрепленный файл и есть протеусовский
avr123.nm.ru » 09 апр 2009, 15:51
А прерывание у вас настроено и включено ? "Прерывания в AVR" это стр 3 курса по AVR
gerb13 » 09 апр 2009, 16:28
вроде бы все правильно- установлены биты 7,4,3 в регистре UCSRB-7-бит разрешения прерывания при окончании приема, а перед началом цикла while- sei-общее разрешение прерывания Если еще что-то нужно устанавливать, прошу подсказать что именно?
avr123.nm.ru » 09 апр 2009, 16:36
Вот код содзданый мастером CVAVR - он обязательно будет работать:
Код: Выделить всё • Развернуть #include <mega32.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) // USART Receiver buffer #define RX_BUFFER_SIZE 8 char rx_buffer[RX_BUFFER_SIZE]; #if RX_BUFFER_SIZE<256 unsigned char rx_wr_index,rx_rd_index,rx_counter; #else unsigned int rx_wr_index,rx_rd_index,rx_counter; #endif // This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow; // USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) { char status,data; status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index]=data; if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; }; }; } #ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter==0); data=rx_buffer[rx_rd_index]; if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; #asm("cli") --rx_counter; #asm("sei") return data; } #pragma used- #endif // Standard Input/Output functions #include <stdio.h> // Declare your global variables here void main(void) { // Declare your local variables here // 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; // 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; // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: Off // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x90; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // Global enable interrupts #asm("sei") while (1) { // Place your code here }; }
gerb13 » 09 апр 2009, 16:52
спасибо за помощь, сейчас тоже решил с чистого листа начать, вроде даже работает:)
avr123.nm.ru » 09 апр 2009, 16:56
У меня ни разу не было чтобы код созданый мастером CVAVR не работал.