logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega8 +ISR(USART_RXC_vect )+problem

5657jz 27 Gru 2010 21:03 3568 4
REKLAMA
  • #1 8920906
    5657jz
    Poziom 14  
    Początek zabawy, i bliski jestem stwierdzenia, że to nie dla mnie.
    A więc, albo ktoś podpowie, albo pogryzę tego procka.
    Problem jest następujący: Po przerwaniu, program zapala leda i wychodzi z pętli WHILE (zaczyna main()) czyli mój LED zgaszony.
    Lub bez przerwania, prog. wchodzi do petli WHILE opuszcza ją i zaczyna od main(). czyli na terminalu widzę powtazajacy się napis *tytul
    Szczegóły w kodzie. Może Ktoś przetestuje ?
    #include <io.h>
    #include "UART.h"
    #include <signal.h>
    #include <delay.h>
    #include <interrupt.h>
    #include <util/atomic.h>
    
     
    
    unsigned char volatile odebr_zn='0';
    unsigned char volatile data;
    unsigned char znak;
    const int *tytul="Uzycie terminala do zmniany stanu LEDa";
    const int *odbior="Odebrano znak ==>";
    char i;
    /**********Wyslij znak na RS232*********************************************/
    
    void USART_TXR_znak( unsigned char znak )
    {
    	 while ( !( UCSRA & (1<<UDRE)) )
         ;
         UDR = znak;
    }
    /**********Wyslij text na RS232********************************************/
    
    void USART_TXR_text( unsigned char *text )
    
    {
        char ile_zn;
    	ile_zn=(strlen(text)-1);
     	   for (i=0;i<=ile_zn;i++)
    			{
     			while ( !( UCSRA & (1<<UDRE)) )
       			 ;
       	   	    UDR = *(text+i);
    			}
    	i=0;
    	przen_linie();
    }
    /*********  Opóźniene  ***************************************************/
    
    static void delay(uint16_t us) 
    {
        while ( us ) us--;   //1ms-> us=8000
    }
    /*******Inicjalizacja OUT/IN PIN*******************************************/
    void PIN_init(void)
    { 
         /*       aktywne stanem niskim,          */
      	DDR(LED_PORT)|=_BV(LED_ZIEL)|_BV(LED_CZER);
    	PORT(LED_PORT)|=_BV(LED_ZIEL)|_BV(LED_CZER);
         /*       aktywne stanem niskim,                                                             */
    	DDR(MENU_PORT)|=_BV(TXD)|_BV(MENU)|_BV(MENU_PLUS)|_BV(MENU_MINUS)|_BV(MENU_ENTER)|_BV(OUT_CO); //  0xDE;
    	PORT(MENU_PORT)=0xDA;
    }
    
    /*******Inicjalizacja******************************************************/
    
    void UART_init(unsigned int ubrr) 
    {
      /* 9600 bit/s */
      UBRRH = (unsigned char)(ubrr>>8);
      UBRRL = (unsigned char)ubrr;       // 51 -> 8000000
      /* ISR(koniec odbioru),ISR(zakonczenie nadawania RxD=>ON, RxT=>ON */
      UCSRB = _BV(TXCIE)|_BV(RXCIE)|_BV(RXEN)|_BV(TXEN);
      /* 8-bit dane, 2-bit stopu, brak bitu parzystosci */
      UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);            
    }
    /********Przerwanie od buffora Odbiorczego RS232****************************/
    
    ISR(USART_RXC_vect )  //SIG_UART_RECV 
    {
    	odebr_zn='1';
    	data=UDR;
    }
    /*********Przeniesienie do następnej lini***********************************/
    
     void przen_linie(void)
    {
     				 USART_TXR_znak(0x0A);
    				 USART_TXR_znak(0x0D);
    }
    /********MAIN()*************************************************************/
    
    
    int main(void)
    {
    PIN_init();           
    UART_init(MY_UBRR);		
    USART_TXR_text(tytul);
    SREG|=_BV(I);
    
    	while(1)
    	{
    				
    			if (odebr_zn=='1')
    			{
    				//ATOMIC_BLOCK (ATOMIC_FORCEON)
    				//{
    					USART_TXR_text(odbior);
    					USART_TXR_znak(data);
    			 		przen_linie();
    
    					switch(data) 
    					{
    						case '1': 	// wyłacz LEDa
    		   					  PORT(LED_PORT)|=_BV(LED_ZIEL);
    							  break;
    						case '2': 	// włacz LEDa
    			    	          PORT(LED_PORT)&=~(_BV(LED_ZIEL));
    							  break;
    						case '3':	// 
    							  PORT(LED_PORT)|=_BV(LED_CZER);
    							  break;
    						case '4': 
    							  PORT(LED_PORT)&=~(_BV(LED_CZER));	
    							  break;
    						default:
    							;
    					} //end switch
    				odebr_zn=0;
    				data=0x00;
    				//} //end ATOMIC
    			} //end if odebr_zn
    	} //end while(1)
    } //end main
    


    #include <avr/io.h>
    
    
    
    #define F_CPU 8000000uL				// czestotliwosc oscylatora
    #define BAUD 9600					// szybkosc transmisji
    #define MY_UBRR F_CPU/16/BAUD-1    	// wartosc-preskaler sterujący szybkoscia transmisji
    
    #define LED_PORT        PORTB   
    #define LED_ZIEL        6		// nr pinu LEDA
    #define LED_CZER        7		// nr pinu LEDA	
    #define PWM				1		// Sterowanie serwa
    #define Wolne_B0		0		// (ICP1)
    #define WOLNE_B2		2		// (OC1B)
    
    #define MENU_PORT		PORTD
    #define RXD				0       // ON
    #define TXD         	1 		// ON
    #define MENU			3
    #define MENU_PLUS		4
    #define MENU_MINUS		6
    #define MENU_ENTER		7
    #define OUT_CO	     	2		// wlacznik czujnika CO
    #define T1				5		// pomiar czestotliwosci
    
    #define ADC_PORT		PORTC
    #define IN_ADC			3		// czujnik fazy
    #define OUT_BUZ			2		// BUZZER
    #define WIRE			1		// magistrala 1WIRE
    #define ADC				0		// LM35 pomiar temperatury
    #define WOLNE_C4      	4		// (SDA)
    #define WOLNE_C5		5		// (SCL)
    #define RESET   		6		// RESET
    
    #define I               7		// Nr flagi globalnych przerwan
    
    #define PIN(x) (*(&x - 2))  /* address of data direction register of port x */
    #define DDR(x) (*(&x - 1))  /* address of input register of port x          */
    #define PORT(x) (*(&x ))
    
    
  • REKLAMA
  • #2 8921415
    sulfur
    Poziom 24  
    /* ISR(koniec odbioru),ISR(zakonczenie nadawania RxD=>ON, RxT=>ON */ 
      UCSRB = _BV(TXCIE)|_BV(RXCIE)|_BV(RXEN)|_BV(TXEN);
    Proszę coś z tym zrobić.
  • REKLAMA
  • #3 8921674
    5657jz
    Poziom 14  
    Kolego "sulfur", niestety nie wiem, co mogę zrobić ?!
    Możesz coś bliżej???
  • REKLAMA
  • Pomocny post
    #4 8921897
    sulfur
    Poziom 24  
    Np usunąć włączanie przerwania od nadawania albo dodać taką obsługę w programie. Inaczej program leci w krzaki. Swoją drogą, jak daje radę wysłać cały tytuł to i tak jest niezły. Ja na podstawie analizy dałbym mu jedną literkę.
  • #5 8921994
    5657jz
    Poziom 14  
    sulfur-Jesteś Wielki
    Usuniecie przerwania _BV(TXCIE)|_ -rozwiazało problem. Śmiga jak założono. Dzieki.
REKLAMA