numair_noor
Member level 2
hi, i m new to atmega 16 programming. i want to send an ascii character say 'B' when an interrupt comes on the PORTB^2. WHICH IS WORKING PROPERLY. AND WHEN A CHARACTER IS RECEIVED SERIALLY,AN INTERRUPT INVOKES, PORTA^0 TO BE = 1 FOR SOME TIME (FOR EXAMPLE 1 SECOND) AND THEN AGAIN PORTA^0 = 0 (AFTER 1 SECOND). CYCLE CONTINUEUS...
PLEASE HELP ME WITH THE FOLLOWING CODE:
(I AM USING AVR STUDIO 5)
---------- Post added at 22:28 ---------- Previous post was at 22:24 ----------
I forgot to mention that the problem is, when ever first time atmega16 receives a character serially, it keeps on giving 1 on porta^0. Which i want to control...(on it for 1 second)
PLEASE HELP ME WITH THE FOLLOWING CODE:
(I AM USING AVR STUDIO 5)
Code C - [expand] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 #include <avr/io.h> #include <avr/interrupt.h> void usart_init(void); void usart_init (void) { UCSRB= (1<<RXEN)| (1<<TXEN) |(1<<RXCIE) ; //ENABLE RECEIVER,TRANSMITTER AND RECEIVE INTERRUPT UCSRC= (1 << UCSZ1)|(1 << UCSZ0)|(1 << URSEL); //USE 8 BIT DATA TRANSFER AND ONE START ONE STOP BITS WITH 9600 BAUDRATE UBRRL=0x33; } int main(void) { while(1) //continue the following process {//cli(); DDRA=0xFF; //PORT A IS OUTPUT //UDR=0x00; //PORTA=0x00; usart_init(); //while (!(UCSRA & (1<<RXC))); //WAIT UNTIL USART DATA REGISTER IS EMPTY AND TRANSMIT 'g' GICR=(1<<INT2); //ENABLE EXTERNAL INTERRUPT 2 ON PORT B^2 MCUCSR=(1<<ISC2); //whenever the interrupt 2 is high to low(negative edge triggered) sei(); } } ISR(INT2_vect) { usart_send('B'); //JUMP TO VOID USART_SEND TO SEND THE ASCII CHRACTER B //for(unsigned int i=0;i<=300;i++); } void usart_send (unsigned char g) { //while(!(UCSRA & (1<<UDRE))); UDR=g; //PUT CHRACTER B IN USART DATA REGISTER TO TRANSMITT //PORTA=0x01; } ISR(USART_RXC_vect) //RECEIVE INTERRUPT { unsigned int C,d; d=UDR; //d=0; //cli(); for(C=0;C<=60000;C++) { PORTA=0x01; //FOR SOME TIME MAKE PORTA^0 TO BE 1 , AND THEN RESET IT.(HERE IS SOME PROBLEM I GUESS) } //break; //PORTA=0x00; //return 0; }
---------- Post added at 22:28 ---------- Previous post was at 22:24 ----------
I forgot to mention that the problem is, when ever first time atmega16 receives a character serially, it keeps on giving 1 on porta^0. Which i want to control...(on it for 1 second)
Last edited by a moderator: