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

Czy kod UART dla ATMega128 działa poprawnie z konwerterem FT232BM?

czuga 15 Maj 2005 17:46 1500 5
REKLAMA
  • #1 1495088
    czuga
    Poziom 23  
    Posty: 840
    Pomógł: 45
    Ocena: 38
    Witam wszystkich, mam do Was prosbe, zamiesiclem w zalacznikach zgodnie z ich nazwa pliki z WinAVR, a dokladnie obsluge uarta dla ATMegi128...czy ktos moglby mi powiedziec, czy rzeczywiscie ten kod wszysztko co robi to po podlaczniu do procka zasilania wysyla na port kolejna wartosc...tzn to co jest w petli w main'ie?? Pod spodem zamieszczam sam kod obslugi...
    Moj problem polega na tym ze podlaczam atmege poprzez modul konwertera na FT232BM i za cholere mi nie chce dzialac...jezeli bylbym pewny ze procek dziala prawidlowo, to moge szukac gdzie indziej przyczyn...

    Atmega ma nastepujace paramtery:

    1. rezonator 16MHz i mam ustawione takie fusebity:
    JTAG Interface Enabled
    BootFlash size=4096...
    Boot reset vector...
    Brown-out detection level at VCC=4.0V
    Brown-out detection enabled
    CKOPT fuse
    Ext. Crystal/resonator High Freq; Start-up 16K CK + 4ms

    2. Z LockBits mam ustawione tylko:
    Mode 1 - No memory Lock
    App. Prot. Mode 1 No lock SPM and LPM in App. Section
    Loader prot. mode 1 no lock...

    ...ponizej kod obslugi uarta

    
    #include <avr/io.h>
    #include <stdlib.h>
    
    #define FREQUENY_CPU 		16000000           // MCU clock
    #define CYCLES_PER_US 		((FREQUENY_CPU+500000)/1000000) 	// cpu cycles per microsecond
    #define UART_BAUD    		115200ul     	     // conection speed
    #define UART_CONST    		(FREQUENY_CPU/(16ul*UART_BAUD)-1)
    
    void USART_Init(unsigned int baud){
    	/* Set baud rate */
    	UBRR0H = (unsigned char)(baud >>8);
    	UBRR0L = (unsigned char)baud;
    	
    	/* Enable receiver and transmitter */
    	UCSR0B = (1<<RXEN)|(1<<TXEN);
    	
    	/* Set frame format: 8 data bit, 2 stop bit */
    	UCSR0C = (1<<USBS)|(3<<UCSZ0);
    }
    
    void USART_Transmit(unsigned char data){
    	/* Wait for empty transmit buffer... */
    	while( !(UCSR0A & (1<<UDRE)) )
    		;	
    	/* Put data into buffer, sends the data */
    	UDR0 = data;
    }
    
    unsigned char USART_Receive(void){
    	/* Wait for data to be received... */
    	while( !(UCSR0A & (1<<RXC)) )
    		;		
    	/* Get and return received data from buffer */
    	return UDR0;
    }	
    
    void USART_Flush(void){
    	unsigned char dummy;
    	while ( UCSR0A & (1<<RXC) ) 
    		dummy = UDR0;
    }
    
    int main (void){
       register int i;
    	/* Initialization USART */
    	USART_Init(7); 
    	for(i=0;i<255;i++){
    		USART_Transmit(i); 								
    	}
    	while(1){
    	}
    	return 0;
    }
    


    ...dziekuje za jakakolwiek pomoc...

    pzdr
    Załączniki:
    • uart2_skompilowane.zip (23.81 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • uart2_source.zip (12.45 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 1496518
    czuga
    Poziom 23  
    Posty: 840
    Pomógł: 45
    Ocena: 38
    ..czy nikt nie potrafi tego co napisalem zweryfikowac...czy ogarnela wszystkich niemoc, czytaj lenistwo...;) braklo mi juz końcepcji...nie wiem gdzie mam skopane...

    pzdr
  • REKLAMA
  • #3 1496837
    delibert
    Poziom 13  
    Posty: 37
    Pomógł: 5
    A jesteś pewny że przejściówka FT232 działa? Zewrzyj TX z RX, włącz TeraTerm i zobacz czy bedziesz miał jakieś echo.

    Dodano po 22 [minuty]:

    Cytat:
    /* Set frame format: 8 data bit, 2 stop bit */
    UCSR0C = (1<<USBS)|(3<<UCSZ0);

    A po co Ci 2 bity stopu? Wywal (1<<USBS) lub ustaw UCSR0C = 0x06 i sprawdz czy działa :-)
  • REKLAMA
  • #4 1498328
    czuga
    Poziom 23  
    Posty: 840
    Pomógł: 45
    Ocena: 38
    delibert napisał:
    A jesteś pewny że przejściówka FT232 działa? Zewrzyj TX z RX, włącz TeraTerm i zobacz czy bedziesz miał jakieś echo.

    ...konwerter dziala na pewno, zreszta zrobilem jak napisales i dostaje to to wysylam...
    ...dla mnie najwazniejsze jest to, czy wsad, ktory napisalem dla ATMegi jest poprawny, bp jak on bedzie dobry to bede mogl sobie szukac dalej, a tak sie miotam bez sensu...

    pzdr
  • REKLAMA
  • #5 1500515
    Robot_
    Poziom 18  
    Posty: 277
    Pomógł: 22
    Witam
    ostatnio miałem podobny problem.
    Też funkcja przepisana z noty katalogowej nie chciała działać w funkcji, wywalał rózne krzaki na monitorze przy wysyłaniu.
    Gdy to wpisałem w program działalo.
    W manualu jest przykład
    spróbój dodać następujące rzeczy
    #include <stdio.h>

    int uart_putchar(char c)
    {
    if (c == '\n')
    uart_putchar ('\r');
    loop_until_bit_is_set(UCSR0A, UDRE0);
    UDR0 = c;
    return 0;
    }

    w funkcji main na początku wpisz
    fdevopen (uart_putchar, NULL, 0);

    od tej pory zaczęło działać. spróbuj to przetestować na funkcji printf()
    pozdrawiam.
  • #6 1506492
    czuga
    Poziom 23  
    Posty: 840
    Pomógł: 45
    Ocena: 38
    Dziekuje wszystkim za oddzew...Teamt mozna uznac za zamkniety...problem rozwiazany...

    pzdr
REKLAMA