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

USART PIC18F2620, MAX232 – niskie napięcie Tx, śmieci na terminalu RS232

tiniak 17 Mar 2008 17:06 2207 23
REKLAMA
  • #1 4919890
    tiniak
    Poziom 10  
    Posty: 31
    Witam

    Mam problem z wysyłaniem przez USARTa w uC PIC18F2620.
    Podłączyłem uC poprzez max232 do złącza rs232 w komputerze. Próbuje wysłac znaki, jednak na terminalu pojawiają mi się same śmieci. Podłączyłem oscyloskop do wyjścia Tx w PICu i na oscyloskopie pokazuje mi się to co próbuje wysyłać do kompa. Sygnały odbierane na oscyloskopie sa rzędu 2V. Napiecie zasilania PICa wynosi 5V. Czy te sygnały nie są za niskie i czy to może być powód błędnego odbioru? Jak sobie z tym poradzic?
    Układ z max232 zbudowałem zgodnie z datasheetem i podłączyłem go bezpośredni do pinów w PICu Tx i Rx. Może coś jeszcze powinno się znależć pomiędzy PICem a MAXem?
    Parametry transmisji są następujące: 9600, brak bitu parzystości, jeden bit stopu. Terminal ustawiłem identycznie.

    Wielkie dzięki za wszelkie wskazówki.

    Pozdrawiam
  • REKLAMA
  • #2 4919956
    piti___
    Poziom 23  
    Posty: 623
    Pomógł: 67
    Ocena: 9
    Podłączyłeś mase PC i układu mikrokontrolera ?
  • REKLAMA
  • #3 4919991
    tiniak
    Poziom 10  
    Posty: 31
    Masy PC i uC są połączone.
  • #4 4920002
    piti___
    Poziom 23  
    Posty: 623
    Pomógł: 67
    Ocena: 9
    Napięcia powinny być zbliżone do Vcc. Zobacz czy nie masz gdzieś odwrotnie wlutowanych kondensatorów do przetwornicy.
  • #5 4920056
    tiniak
    Poziom 10  
    Posty: 31
    Sprawdziłem, wszystko wygląda OK. Czy kondensatory 1uF są wystarczające?
  • #6 4920078
    piti___
    Poziom 23  
    Posty: 623
    Pomógł: 67
    Ocena: 9
    To zależy od przetwornicy, niektóre wymagają 0,1uF. Sprawdz w datasheet dla tego konkretnego maxa. Jak masz maxa w podstawce to go wyjmij i sprawdz jakie teraz masz przebiegi (2V czy 5V) na TX procesora.

    Sprawdz czy na 100% masz masy podłączone, spotkałem się z dziwnymi gniazdami DB-9 opisanymi odwrotnie pin1 to pin5 itd.
  • REKLAMA
  • #7 4920106
    tiniak
    Poziom 10  
    Posty: 31
    Sprawdziłem, mój wymaga kondensatorów 1uF, a max nie jest w podstawce.
  • #8 4941573
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    2V to dość dziwne, czy napięcie to jest też bez układu max232 w podstawce? Poszukaj zwarć na płytce, jakiś resztek pasty itp. Czy procesor ma podłączone wszystkie nóżki zasilające?
  • #9 4976730
    tiniak
    Poziom 10  
    Posty: 31
    Bez maxa jest tak samo, zwarc zadnych nie znalazłem, a zasilanie jest podłczone do każdej nóżki.

    Dodano po 2 [godziny] 16 [minuty]:

    Może ktoś mógłby spojrzeć na mój schemacik. Może jest jakiś widoczny błąd.
    Jest to tylko część cyfrowa mojego układu.
    Do procka podłączone są LEDY, guziki oraz złączka ICSP do programowania.

    Napięcie VCC=VCC1=5V.
    W złączce DB9 połącone są jeszcze ze soba następujące piny:
    4 - 6
    7 - 8
    oraz 5 do masy tej samej co na płytce.

    Wielkie dzięki za wskazówki.
    Załączniki:
    • schemat.rar (15.85 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #10 4980436
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    Schemat wygląda OK, nie wiem tylko czy eagle połączył zasilanie max232, ale powinien mimo że piny są niewidoczne. Pokarz jeszcze program procesora.
  • #11 4980650
    tiniak
    Poziom 10  
    Posty: 31
    Niewidoczne zasilanie i masa maxa232 są podłączone.
    A tak jest zaprogramowany moj PIC (probuje wysłac narazie pojedynczy znak):

    #include <p18f2620.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <adc.h>
    #include <usart.h>
    #include <pconfig.h>
    #include <portb.h>
    #include <delays.h>
    
    #pragma config WDT = OFF		//Watch Dog Timer disable
    //#pragma config OSC = XT			//External Oscillator
    #pragma config OSC = INTIO67	//Internal Oscillator	
    #pragma config MCLRE = ON		//Master Clear pin enabled
    #pragma config BOREN = OFF		//Brown Out Reset disable
    #pragma config BORV = 2			//Brown Out Voltage = 2V
    #pragma config LVP = OFF		//Low Voltage Programming disable
    #pragma config PWRT = OFF		//Power Up Timer disable
    #pragma config IESO = OFF		//Internal External Switch Over mode enabled
    #pragma config WDTPS = 128		//Watch Dog Timer uses 1:128 Postscale 
    #pragma config PBADEN = OFF		//PORTB pins are configured as digital input channels on RESET 
    #pragma config FCMEN = ON		//Fail-safe clock monitor enabled
    #pragma config STVREN = ON		//Stack full/underflow will cause reset
    #pragma config LPT1OSC = OFF	//T1 Oscillator disable
    #pragma config CCP2MX = PORTC	//CCP2 Muxed with RC1
    #pragma config DEBUG = OFF		//Background Debugger Enable
    #pragma config XINST = OFF		//Extended Instruction Set disable
    #pragma config CP0 = OFF		//Code Protection Block 0 Disable
    #pragma config CP1 = OFF		//Code Protection Block 1 Disable
    #pragma config CP2 = OFF		//Code Protection Block 2 Disable
    #pragma config CP3 = OFF		//Code Protection Block 3 Disable
    #pragma config CPB = OFF		//Boot Block Code Protection Disable
    #pragma config CPD = OFF		//Data EEPROM Code Protection Disable
    #pragma config WRT0 = OFF		//Write Protection Block 0 Disable
    #pragma config WRT1 = OFF		//Write Protection Block 1 Disable
    #pragma config WRT2 = OFF		//Write Protection Block 2 Disable
    #pragma config WRT3 = OFF		//Write Protection Block 3 Disable
    #pragma config WRTB = OFF		//Boot Block Write Protection Disable
    #pragma config WRTC = OFF		//Configuration Register Write Protection Disable
    #pragma config WRTD = OFF		//Data EEPROM Write Protection Disable
    #pragma config EBTR0 = OFF		//Table Read Protection Block 0 Disable
    #pragma config EBTR1 = OFF		//Table Read Protection Block 1 Disable
    #pragma config EBTR2 = OFF		//Table Read Protection Block 2 Disable
    #pragma config EBTR3 = OFF		//Table Read Protection Block 3 Disable
    #pragma config EBTRB = OFF		//Boot Block Table Read Protection Disable
     
    #define FOSC 4000000
    #define BAUDRATE 9600
     
    #define SPBRG_V1  (FOSC / BAUDRATE)
    #define SPBRG_V2  SPBRG_V1/16
    #define SPBRG  (SPBRG_V2 - 1)
    # if (SPBRG > 30)
      #error Calculated SPBRG value is out of range
    #elif (SPBRG < 20)
      #error Calculated SPBRG value is out of range
    #endif 
    
    void InitializePorts(void);							// Inicializacja portów
    void InitializeUSART(void);	 						// Inicializacja USARTa 
    void InitializeOSC(void);							// Inicjalizacja OSC
    void usart_send(int value);							// Funkcja do wysyłania za pomocą TXREG
    
    
    #pragma code
    void main(void)
    {
    		Delay10TCYx(5);			// Delay for 50TCY
    	InitializePorts();
    	InitializeOSC();
    	InitializeUSART();
     		Delay10TCYx(5); 		// Delay for 50TCY
    
    	while(1)
    	{
    //		while(!OSCCONbits.IOFS);
    			Delay10TCYx(1);
        	        usart_send('U');							
    	   		Delay1KTCYx(1);
    //		while(!OSCCONbits.IOFS);
    			Delay10TCYx(1);
    		usart_send( 0 );
    			Delay1KTCYx(1);
    	}
    
    CloseUSART();					// Zamkniecie portu
    
    }								//Koniec main'a 
    
    void InitializePorts(void)
    {
    	TRISA = 0x01;		//RA0 is analog input channel
    	LATA = 0;			//Reset Port A
    	TRISB = 0xE3;		//Set pins RB2 RB3 RB4 as an output and the rest as an input
    	LATB = 0;			//Reset Port B
    	TRISC = 0x00;		//Set all pins as an output 
    	LATC = 0;			//Reset Port C
    	PORTE = 1;
    }
    
    void InitializeOSC(void)
    {
    	OSCCONbits.IRCF2 = 1; 					// 4 MHz
    	OSCCONbits.IRCF1 = 1;
    	OSCCONbits.IRCF0 = 0;
     
    //	OSCTUNE |= (2 & 0x1f); 
    	OSCTUNEbits.TUN4 = 0; 					// Ustawiamy bity tuningujace czestotliwosc
    	OSCTUNEbits.TUN3 = 0;
    	OSCTUNEbits.TUN2 = 0;
    	OSCTUNEbits.TUN1 = 0;
    	OSCTUNEbits.TUN0 = 0;
    
    	while(!OSCCONbits.OSTS);				// Czekamy, az oscylator zacznie chodzic
    	while(!OSCCONbits.IOFS);				// Sprawdzamy czy jest satbilny
    } 
    
    void InitializeUSART(void)
    {
    	RCSTAbits.SPEN = 1;					// Configure RX and TX pins as serial port pins
    //	TRISC |= 0xC0;						// In order to configure RC6 and RC7 as an USART
    	TRISCbits.TRISC7 = 1; 
    	TRISCbits.TRISC6 = 1;
    
    	TXSTAbits.TXEN = 1;					// Transmit enable
    	TXSTAbits.SENDB = 0;				// Sync break transmission completed
    	
    	RCSTAbits.RX9 = 0;					// 8-bit reception
    	RCSTAbits.CREN = 1;					// Enables receiver
    
    	OpenUSART( USART_TX_INT_OFF &		// przerwania tx
    			   USART_RX_INT_OFF & 		// przerwania rx
    			   USART_ASYNCH_MODE & 		// asynchroniczny tryb
    			   USART_EIGHT_BIT & 		// 8 bit transmisja
    			   USART_CONT_RX & 			// ciagle odbieranie, wlaczony odbiornik
    			   USART_BRGH_LOW, 			// low baud rate
    			   SPBRG);					// SPBRG - liczba ustala szybkosc portu 
    //			   25);						// wg wzoru v = Fosc/(16*(SPBRG+1))	
    			    				
    	baudUSART( BAUD_IDLE_CLK_HIGH &		// Clock idle state is a high level
    			   BAUD_16_BIT_RATE &		// 16-bit baud generation rate
    //			   BAUD_8_BIT_RATE &		// 8-bit baud generation rate
    			   BAUD_WAKEUP_ON &			// RX pin not monitored
    			   BAUD_AUTO_OFF);			// Auto baud rate measurement disabled
    }
    
    void usart_send(int value)
    {
        TXREG = value;    								// Wpisuje wartosc do rejestru USARTa
    		Delay10TCYx(1);								
        while((PIR1 & (1<<4)) == 0)						// Czekaj az bedzie ustawiony TXIF 
         ;
    }
  • Pomocny post
    #12 4980930
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    Kod wygląda OK, ale sprawdź:
    1. pin portu C, przestaw tris na 0 i wystaw jedynkę, jeśli tam będzie 5V to ok, jeśli nie, to szukaj błędu w płytce, montażu etc. (ew być może procesor ma uszkodzony port)
    2. napisz własną pełną inicjalizację portu (niewiele zostało do dopisania), bo w swoim programie mieszasz między swoim kodem a kodem z biblioteki.
  • #13 4981185
    tiniak
    Poziom 10  
    Posty: 31
    Sprawdziłem piny portu C i jest OK (po wystawieniu 1 na któryś z pinów jest na nim 5V).
    A co do tej inicjalizacji to chodzi o funkcję InitializeUSART, zeby ją napisac za pomocą komend ustawiających konkretne bity w rejestrach (np. TXSTAbits.TXEN = 1; itd.), TAK?? Bo niewiem czy dobrze zrozumiałem.

    Dodano po 2 [godziny] 29 [minuty]:

    Zmieniłem funkcje InitializeUSART i napisałem całą bez korzystania z bibliotek i w końcu się udało, zadziałało.
    Jeszcze moze nie do końca idealnie, ponieważ czasami zmienia jakiś pojedyńczy znak, ale z tym nie powinno być problemu.

    Bardzo dziękuję za poswięcony mi czas!!

    Pozdrawiam,
  • #14 4982907
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    tiniak napisał:
    Zmieniłem funkcje InitializeUSART i napisałem całą bez korzystania z bibliotek i w końcu się udało, zadziałało.
    To teraz możesz kombinować dalej, spróbuj użyć InitializeUSART a potem włączyć oddzielnie nadajnik.
    tiniak napisał:
    Jeszcze moze nie do końca idealnie, ponieważ czasami zmienia jakiś pojedyńczy znak, ale z tym nie powinno być problemu.
    Nie wiem ile masz tych błędów, bo ja używam tych procesorów nawet z wbudowanym generatorem RC i ilość błędów jest niezauważalna. Czasami w terminalu pojawiają mi się błędy jeśli przesyłam ciągły strumień znaków (bez przerw) a nastąpi jakiś błąd transmisji wywołany np rozłączeniem i złączeniem kabli. Wtedy do "najbliższej" przerwy w transmisji wszystkie znaki są uszkodzone, wygląda że to specyfika układu UART w PC jest taka że jak ma dużo znaków to błędnie się synchronizuje z bitem startu. Jeśli masz dużo błędów to sprawdź czy dobrze policzyłeś rejestr prędkości transmisji względem kwarcu, ew możesz spróbować go skorygować +/- 1 dla lepszych wyników.
  • #15 4982968
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    co do zaokraglania wartosci BRG. tutaj takie przykladowe makro. coprawda jest dla PIC24, ale mysle, ze da rade go prosto przerobic na inne procesory, a moze i niewiele trzeba bedzie zmieniac. obslugiwane jest w nim wlasnie owe zaokraglanie, tak aby blad byl jak najmniejszy

    
    #define BAUDRATE    115200      // desired baudrate
    #define HIGH_SPEED	0			// high or low speed?
    
    //===============================================================================
    // BRG register value calculation
    //===============================================================================
    
    // in high speed mode the FCY is divided by 4, in low speed mode - by 16
    #if HIGH_SPEED
        #define DIVISOR 4
    #else
        #define DIVISOR 16
    #endif
    
    // for proper rounding up or down
    #if ((FCY%(DIVISOR*BAUDRATE)) > BAUDRATE/2)
        #define TUNE    0
    #else
        #define TUNE    1
    #endif
    
    #define BRGVAL      (FCY/(DIVISOR*BAUDRATE)-TUNE)
    


    0x41 0x56 0x45!!
  • #16 4985831
    tiniak
    Poziom 10  
    Posty: 31
    W jaki sposób przesyła się znaki takie jak:
    CR(Carriage Return)
    LF(Line Feed)
    ??
    Wpisywalem do rejestru TXREG postać hexa, lub binarną ale zamiast powrotu karetki lub nowej linii smieci mi sie pokazywaly.

    I dodatkowo zawsze mam problem z 1 znakiem wysylanym przeze mnie, albo jest jakis inny, albo wogóle go nie ma. Jaka może być przyczyna? Może w rejestrze TXREG coś się znajduje zanim zaczynam transmisje i mi potem zmienia wysyłany pierwszy znak? Może można wyczyścić ten rejestr przed transmisją, pytanie tylko jak?
  • REKLAMA
  • #17 4986336
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    znaki takie wysyla sie dokladnie tak jak mowisz. u mnie dzialalo na PIC24, musi byc u ciebie cos pokrecone.

    
        m_uart_put_char 0x0D            ; carriage return
        m_uart_put_char 0x0A            ; line feed
    


    m_uart_put_char to po prostu wpisanie wartosci do rejestru.

    0x41 0x56 0x45!!
  • #18 4987219
    tiniak
    Poziom 10  
    Posty: 31
    Tak wszystko ustawiam i próbuje wysyłać.
    #define FOSC 1000000
    #define BAUDRATE 9600
     
    #pragma code
    void main(void)
    {
    		Delay10TCYx(5);			// Delay for 50TCY
    	InitializePorts();
    	InitializeUSART();
    	InitializeOSC();
     		Delay10TCYx(5); 		// Delay for 50TCY
    
    	TXSTAbits.TXEN = 1;			// Enable transmission
    		Delay10TCYx(5);
    
    	        usart_send('A');		
    		usart_send('T');		
    		usart_send('&');	
    		usart_send('F');		
    		usart_send('*');	
    	        usart_send(0x0D);
                    usart_send(0x0A);
    	
             while(1)
    	{
    		;
    	}
    
    CloseUSART();					// Zamkniecie portu
    }								//Koniec main'a 
    
    void InitializePorts(void)
    {
    	TRISA = 0x01;		//RA0 is analog input channel
    	LATA = 0;			//Reset Port A
    	TRISB = 0xE3;		//Set pins RB2 RB3 RB4 as an output and the rest as an input
    	LATB = 0;			//Reset Port B
    	TRISC = 0x00;		//Set all pins as an output 
    	LATC = 0;			//Reset Port C
    	PORTE = 1;
    }
    
    void InitializeOSC(void)
    {
    	OSCCONbits.IRCF2 = 1; 					// 1 MHz
    	OSCCONbits.IRCF1 = 0;
    	OSCCONbits.IRCF0 = 0;
     
    //	OSCTUNE |= (2 & 0x1f); 
    	OSCTUNEbits.TUN4 = 0; 					// Ustawiamy bity tuningujace czestotliwosc
    	OSCTUNEbits.TUN3 = 0;
    	OSCTUNEbits.TUN2 = 0;
    	OSCTUNEbits.TUN1 = 0;
    	OSCTUNEbits.TUN0 = 0;
    
    	while(!OSCCONbits.OSTS);				// Czekamy, az oscylator zacznie chodzic
    	while(!OSCCONbits.IOFS);				// Sprawdzamy czy jest satbilny
    } 
    
    void InitializeUSART(void)
    {
    	RCSTAbits.SPEN = 1;					// Configure RX and TX pins as serial port pins
    //	TRISC |= 0xC0;						// In order to configure RC6 and RC7 as an USART
    	TRISCbits.TRISC7 = 1; 
    	TRISCbits.TRISC6 = 1;
    
    	SPBRG = 0x19;						// Select appropriate baud rate
    										// SPBRG - liczba ustala szybkosc portu 
    										// wg wzoru v = Fosc/(4*(SPBRG+1))
    	TXSTAbits.BRGH = 1;					// Low speed
    	BAUDCONbits.BRG16 = 1;				// 16-bit baud generation rate
    	BAUDCONbits.ABDEN = 0;				// Auto baud rate measurement disabled
    	TXSTAbits.SYNC = 0;					// Asynchronous mode
    	TXSTAbits.TX9 = 0;					// 8-bit transmission
    	TXSTAbits.SENDB = 0;				// Sync break transmission completed
    //	TXSTAbits.TXEN = 1;					// Transmit enable
    
    	RCSTAbits.RX9 = 0;					// 8-bit reception
    	RCSTAbits.CREN = 1;					// Enables receiver
    }
    
    void usart_send(int value)
    {
    	while(!OSCCONbits.IOFS);
    		Delay10TCYx(1);
        TXREG = value;    								// Wpisuje wartosc do rejestru USARTa
    		Delay10TCYx(1);								
    	while((PIR1 & (1<<4)) == 0)						// Czekaj az bedzie ustawiony TXIF 
    		;
    	DelaySEC(1);
    }
    


    Może macie jakieś propozycje co zmienić, żeby nie było tych błędów podczas wysyłania.
    Literka "A" zawsze jest źle wysyłana, co ciekawe, nawet jeśli jakaś literka "A" jest gdzieś w środku to też jest wysyłany jakiś inny znak. Nie działają także komendy CR i LF. Pozostałe znaki "T", "&", "F", "*" idą dobrze.
    :|
  • #19 4987268
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    Spróbuj dodać minimalne opóźnienie pomiędzy kolejnymi znakami a potem je zwiększać, jeśli transmisja będzie błędna to znaczy że coś jest z prędkością, parzystością, ilością bitów, jeśli będzie dobra, to masz problem z całym strumieniem znaków i musisz dołożyć to minimalne opóźnienie przed wysłanie. Co do samego wysłania do wystarczy wpisywać do TXREG, a procesor zajmie się resztą, oczywiście konieczne jest testowanie bitu flagowego czy poprzedni znak jest wysłany, ale to miałeś w swoim programie.
  • #20 4989450
    piti___
    Poziom 23  
    Posty: 623
    Pomógł: 67
    Ocena: 9
    W datasheet od procesora sa dokladnie podane wartosci rejestrow dla różnych częstotliwości oscylatora i różnych prędkości. W tabelach tych podane są również procentowe błędy prędkości transmisji przy każdej konfiguracji. Polecam tam zajrzec. Gdzieś czytałem że procentowy błąd baudrate powienien byc poniżej chyba 5%.
  • #21 4991375
    diag
    Poziom 29  
    Posty: 1401
    Pomógł: 45
    Ocena: 206
    Skoro kasujesz wartości rejestru kalibracji oscylatora to jakiej prędkości się spodziewasz?
  • #22 4992392
    tiniak
    Poziom 10  
    Posty: 31
    Cytat:
    W datasheet od procesora sa dokladnie podane wartosci rejestrow dla różnych częstotliwości oscylatora i różnych prędkości. W tabelach tych podane są również procentowe błędy prędkości transmisji przy każdej konfiguracji. Polecam tam zajrzec. Gdzieś czytałem że procentowy błąd baudrate powienien byc poniżej chyba 5%.

    Wiem, zaglądałem do nich. Przy moich ustawieniach błąd wynosi 0.16% według tych tabelek, a więc powinno być OK.

    Cytat:
    Skoro kasujesz wartości rejestru kalibracji oscylatora to jakiej prędkości się spodziewasz?

    Mógłbyś napisać gdzie to się dzieje, ponieważ nie bardzo rozumiem.
    Dzięki wielkie.
  • #23 4997402
    piti___
    Poziom 23  
    Posty: 623
    Pomógł: 67
    Ocena: 9
    Kasujesz rejestry w funkcji InitializeOSC();
    
    OSCTUNEbits.TUN4 = 0;                // Ustawiamy bity tuningujace czestotliwosc 
       OSCTUNEbits.TUN3 = 0; 
       OSCTUNEbits.TUN2 = 0; 
       OSCTUNEbits.TUN1 = 0; 
       OSCTUNEbits.TUN0 = 0;
    


    Nigdy nie kalibrowałem czestotliwosci wewnętrznego oscylatora w picach i transmisja na nim działała prawidłowo.
  • #24 5007628
    tiniak
    Poziom 10  
    Posty: 31
    Nareszcie działa wszystko bez zarzutów. Także znaki CR i LF działają. Program praktycznie ten sam, a powodem pojawiających się błędów była chyba bateria :). Była już trochę zmęczona i dawała troche ponad 7V. Wymieniałem ją na nową 9V i zadziałało. Jedna rzecz mnie interesuje: skoro używam stabilizatorów na 5V(7805) to czy bateria troche zużyta już się nie nadaje? Za stabilizatorem było ~ 4,2V. Jak tak, to chyba musze pomyśleć nad jakimiś zmianami w moim układzie, bo bateria starcza na bardzo krótko:/.

    P.S. Dzieki wszystkim za pomoc w rozwiązaniu mojego problemu.
    Pozdrawiam

Podsumowanie tematu

✨ Problem dotyczył transmisji USART w mikrokontrolerze PIC18F2620 podłączonym przez układ MAX232 do portu RS232 komputera, gdzie na terminalu pojawiały się nieczytelne znaki ("śmieci"). Pomiar oscyloskopowy sygnału Tx z PIC wykazał napięcie około 2V, co budziło podejrzenia o zbyt niskim poziomie sygnału. Sprawdzono poprawność połączeń masy między PC a mikrokontrolerem oraz zgodność kondensatorów do przetwornicy napięcia w układzie MAX232 (zalecane 1µF zgodnie z datasheet). Bez układu MAX232 napięcie Tx również wynosiło około 2V, co wskazywało na problem po stronie mikrokontrolera lub płytki. Schemat i połączenia były poprawne, a zasilanie 5V podłączone do wszystkich nóżek procesora.

Kluczowym rozwiązaniem okazało się napisanie własnej, pełnej inicjalizacji USART bez korzystania z bibliotek, co poprawiło stabilność transmisji i wyeliminowało błędy w przesyłanych znakach. Dodatkowo zalecano sprawdzenie i ewentualne dostosowanie rejestru prędkości transmisji (baud rate) zgodnie z częstotliwością oscylatora, aby minimalizować błędy transmisji. Wysyłanie znaków specjalnych CR (0x0D) i LF (0x0A) wymagało wpisania ich bezpośrednio do rejestru TXREG.

Ostatecznie problemem okazała się słaba bateria zasilająca układ, która dostarczała napięcie poniżej wymaganego poziomu po stabilizatorze 7805 (około 4,2V zamiast 5V). Wymiana baterii na nową 9V rozwiązała problem i transmisja działała poprawnie bez błędów. Zasugerowano, że zużyta bateria nie jest odpowiednia do zasilania układu z stabilizatorem 5V, co wpływa na jakość sygnału Tx i poprawność transmisji USART.

Podsumowując, przyczyną problemów z transmisją USART w PIC18F2620 z MAX232 były: niewłaściwe napięcie zasilania (zużyta bateria), konieczność własnej inicjalizacji USART oraz prawidłowe ustawienie parametrów transmisji i połączeń masy.
Wygenerowane przez model językowy.
REKLAMA