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

Atmega128 - początkujący - UART0 ma nadawać po przycisku

vadis0781 12 Sty 2010 22:22 1469 2
REKLAMA
  • #1 7527073
    vadis0781
    Poziom 11  
    Witam.
    Próbuje napisać kod , ktory bedzie za pomocą przycisku na PC4 na przemian włączał i wyłączał diodę , a także nadawał stringi na uart0 , lub uart1. Wyłączyłem kompatybilność Atmega103 a także JTAg-a. Fusebity ustawione - CKSEL
    Int. RC Osc. 1 MHz; Start-up time: 6 CK + 0 ms ,

    cos mi nadaje, ale krzaki i znaki zapytania.
    poniżej kod:

    
    #include <avr/io.h>
    #include <util/delay.h>   
    #include <compat/deprecated.h>              
    #include <string.h>
    #include <avr\pgmspace.h>
    
    #define LED_OFF sbi(DDRC,PC0);cbi(PORTC,PC0) // ustawiam bit pc0 na wyjscie na stan wysoki
    #define LED_ON sbi(DDRC,PC0);sbi(PORTC,PC0)  // ustawiam bit pc0 na wyjscie na stan niski
    
    //#define bit5_ON sbi(DDRC,PC5);cbi(PORTC,PC5)  // tak sobie na probe
    
    #define SWITH1_ON cbi(DDRC,PC4);sbi(PORTC,PC4) //ustawiam bit pc4 na wyjscie na stan wysoki
    
    
    
    #define F_CPU		1000000
    #define BAUD_RATE 19200 // prędkość transmisji po RS232
    //#define MYUBRR  (F_CPU/(1ul*BAUD_RATE)-1)// CPU_Hz/8/BAUD-1
    
    #define MYUBRR  (F_CPU/BAUD_RATE*16L)-1// CPU_Hz/8/BAUD-1
    
    
    #define UART0_INITC	(_BV(UCSZ01)|_BV(UCSZ00)) // 8bits, 1stop, no parity
    #define UART1_INITC	(_BV(UCSZ11)|_BV(UCSZ10)) // 8bits, 1stop, no parity
    
    
    void UART_Transmit0(uint8_t data)
    {
    	//while(!(UCSR0A & _BV(UDRE)));	// wait for empty transmit buffer
    	UDR0 = data;
    }
    
    void UART_Transmit1(uint8_t data)
    {
    	//while(!(UCSR1A & _BV(UDRE)));	// wait for empty transmit buffer
    	UDR1 = data;
    }
    
    void UART_PutStringP0(const char* pStr)
    {
    	uint8_t dat;
    
    	while((dat = pgm_read_byte_near(pStr++)) != 0)
    	{
    		UART_Transmit0(dat);
    	}
    }
    
    void UART_PutStringP1(const char* pStr)
    {
    	uint8_t dat;
    
    	while((dat = pgm_read_byte_near(pStr++)) != 0)
    	{
    		UART_Transmit1(dat);
    	}
    }
    
    
    
    
    void uartInit()
    {
    	#ifdef FASTSIM
    	UBRR0L = UBRR1L = 0;
    	UBRR0H = UBRR1H = 0;
    /*	UCSR0A |= _BV(U2X0);
    	UCSR1A |= _BV(U2X1);*/
    #else
    	//UBRR0L = UBRR1L = (uint8_t)(F_CPU/(BAUD_RATE*16L)-1);
    	UBRR0L = UBRR1L = (unsigned char)( MYUBRR);
    	UBRR0H =UBRR1H=  (unsigned char)(MYUBRR >> 8);
    	
    #endif
    	UCSR0B = _BV(RXCIE0) | _BV(RXEN0) | _BV(TXEN0);
    	UCSR1B = _BV(RXCIE1) | _BV(RXEN1) | _BV(TXEN1);
    	UCSR0C = UART0_INITC; // 8bits, 1stop, no parity
    	UCSR1C = UART1_INITC; // 8bits, 1stop, no parity
    }
    
    
    int dioda=0;
    
    int main(void)
    {
    	
    	
    	uartInit();
    	//UART_init(MYUBRR);
    
    
    		UART_PutStringP1("ALA");
    		UART_Transmit1(10);
    	
    
    	sbi(DDRC,0);
      	LED_OFF;
    	SWITH1_ON;
    
    	            while(1)
                    {
        				if(bit_is_clear(PINC,4))
    					{
    						if(dioda==0)
    							{
                    				//cbi(PORTC,0);
    								LED_ON;
                    			    _delay_ms(700);
    								dioda=1;
    								UART_PutStringP1("test");
    
    							}
    						else
    						{
    							//sbi(PORTC,0);
    							LED_OFF;
    							_delay_ms(700);
    							dioda=0;
    							UART_PutStringP1("test 1");
    						}
    					}
    						
        			}
        
    
        return (0);
    }
    


    Procek mam rownież obstawiony w kwarc 16MHz zewn.

    Proszę o wszelkie podpowiedzi - możliwie jasne jak dla laika , dlaczego nie odbieram tego co nadaje z procka. Co jest źle.

    Dodam że nasłuchuje tego na 19200, a sam port usb/rs232 jest ok, poniewaz zamykając maxa232 rx i tx ze sobą mam poprawne echo zawsze.

    Proszę o pomoc
  • REKLAMA
  • #3 7527453
    tmf
    VIP Zasłużony dla elektroda
    No to po kolei:
    1. #define SWITH1_ON cbi(DDRC,PC4);sbi(PORTC,PC4) //ustawiam bit pc4 na wyjscie na stan wysoki
    To raczej zmienia port na wejsciowy z pull upem, a nie wyjsciowy. BTW, powinno raczej byc SWITCH jesli to z angielskiego :)
    2. UART_PutStringP1("ALA");
    Ta funkcja czyta string z FLASH, natomiast w ten sposob przekazujesz wskaznik na string, ale znajdujacy sie w SRAM, wiec czyta smieci. Analogicznie w innych miejscach gdzie jej uzywasz.
REKLAMA