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

[ATtiny2313][C] Połączenie z RS-232 - program

robalpl 10 Sie 2009 23:52 2264 11
  • #1 6879180
    robalpl
    Poziom 10  
    To mój pierwszy post także witam wszystkich.

    Od niedawna zacząłem się trochę interesować mikrokontrolerami oraz elektroniką. Ostatnio zmontowałem mały układzik RS-232 <-> MAX232 <-> ATtiny2313 + dioda podłączona do portu D (pin 5).
    Połączyłem się z układem poprzez HiperTerminal a następnie próbowałem przesłać pojedyncze znaki. Po naciśnięciu klawisza dioda miała za zadanie zgasnąć, po kolejnym zaświecić i tak na przemian. Jednak nie wiem czemu program nie działa poprawnie. Efekt jego działania jest następujący: po naciśnięciu klawisza dioda gaśnie i od razu się zapala (może to być spowodowane wysyłaniem 2bajtów na raz?).

    Poniżej przedstawiam kod programu - transmisja 2400, w UBRR wartość 25 (dla 1MHz)

    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    #define FCPU 1000000
    #define VTRANS 2400
    
    
    ISR(USART_RX_vect)
    {
    	char znak;
    	
    	znak = UDR;
    	if (PORTD == 0x7F)
    		PORTD = 0x00;
    	else
    		PORTD = 0x7F;
    }
    
    int main(void)
    {
    	DDRB = 0xFF;   	// Cały portB wyjściem
    	DDRD = 0x7E;	// Port D wyjściem poza RXD (bit 0)
    
    	PORTB = 0x0;
    	PORTD = 0x7F;   // Dioda swieci (bit 5)
    
    	UCSRB = 1 << RXCIE | 1 << RXEN;
    	UBRRL = 25;		// przy 1MHz transmisja 2400bps
    	sei();
    
    	while (1)
    	{
    		
    	}
    	return 0;
    }


    Byłbym wdzięczny za jakąkolwiek pomoc w znalezieniu błędu.
  • #3 6879827
    wojtek_84
    Poziom 13  
    Spróbuj użyć takiego programu jak Realterm. Jest dużo lepszy niż HyperTerm i na pewno wyśle tylko jeden znak. I jeszcze jedno jak chcesz zmieniać jeden bit w rejestrze to radzę przeprowadzać operację typu
    PORTD |= _BV(5); - od razu widać że zmieniasz jeden bit.
    Operacje na całym porcie trochę komplikują późniejsze rozszyfrowanie co się chciało zrobić, ale to tylko moja subiektywna uwaga :).
  • #4 6880260
    loocasm
    Poziom 15  
    Ostatnio akurat bawiłem się HyperTerminalem - napisałem nawet podobny programik... Stwierdziłem, że jednak był on w stanie wysłać jeden znak - program w Atmedze generował jedno przerwanie.
    Ale to tak odnośnie HyperTerminala...
    A 2 znaki na raz to może wysyła przy wciskaniu Entera? (nowa linia i powrót karetki?)
  • #5 6883385
    robalpl
    Poziom 10  
    Działo się to przy każdym klawiszu.
    Ponadto wczoraj stało się coś niespodziewanego. Po napisaniu wczorajszego postu wgrałem inny program do pamięci flash, po czym wgrałem ponownie ten sam, który miałem wcześniej (kod w 1 poście). Jednak teraz program nie działa w ogóle. Po podłączeniu bateryjki dioda tylko mrugnie po czym gaśnie na dobre.
    Zauważyłem też, że gdy używam HiperTerminala, to jeżeli układ mam podłączony do baterii to wyświetla się komunikat, że nie można 'otworzyć urządzenia z portu COM'. Dopiero odłączenie likwiduje komunikat, jednak układ pozostaje bez zasilania.
    Uwzględniłem również zmiany w programie i teraz wygląda następująco
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    #define VTRANS 2400
    
    
    ISR(USART_RX_vect)
    {
    	char znak;
    	znak = UDR;
    	PORTD ^= _BV(5);
    }
    
    
    int main(void)
    {
    	DDRB = 0b11111111;
    	DDRD = 0b1111110;
    
    	PORTB = 0x0;	
    	PORTD |= _BV(5);
    
      UCSRB = 1 << RXCIE | 1 << RXEN;
      UBRRL = 25;      // przy 1MHz transmisja 2400bps
      sei();
    
     while (1)
     {     
     }
     return 0;
    }
    
  • #6 6884120
    wojtek_84
    Poziom 13  
    Kod w symulatorze działa. Mógłbyś wrzucić schemat układu ?? Aha i w dokumentacji do MAX232 jest napisane że zalecane napięcie zasilania układu do od 4,5 do 5,5V, a jeżeli zasilasz z baterii to pewnie masz ok 3,3 i może to sprawia jakieś problemy ?
  • #7 6884978
    robalpl
    Poziom 10  
    Poniżej zamieszczam schemat układu. Układ zasilam z baterii 9V jednak używam stabilizatora 5V. Na jego wyjściu jest 4.95V.

    Wcześniej zapomniałem dodać, że używam przejściówki USB->RS232, ale nie wiem czy może mieć to jakieś znaczenie mimo, że słyszałem o tym, że nie wszystkie działają poprawnie. Sprawdziłem jednak czy sygnał wraca przez nią do komputera (poprzez zwarcie 9 i 10 pinu w MAX232) i działało jak powinno tj. wysłane znaki powracały.

    A może znaczenie mają wiszące pozostałe piny wtyku? Widziałem gdzieś rozwiązanie gdzie zwarte był ze sobą piny 7 i 8 oraz 1, 4, 6.


    EDIT:
    A czy wina może leżeć po stronie mikrokontrolera? Tj działa ale nie jak powinien. Napisałem krótki program, który ma wydłużać miganie diody jednak ciągle świeci się w odstępach kilkuset milisekund.

    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>
    
    int main(void)
    {
       DDRB = 0xFF;     
       DDRD = 0x7E;   
    
       PORTB = 0x0;
       PORTD = 0x7F;  
    		
    	int i;
    	i = 100;
       while (1)
       {	
    		PORTD ^= _BV(5);
    		_delay_ms(100);	
    		i = i + 100;
       }
       
       return 0;
    }
    
    


    Jeżeli chodzi o Fusebity i lockbity to nigdy się do nich nie zabierałem.
  • #8 6887509
    wojtek_84
    Poziom 13  
    Ja też używam przejściówki USB<->RS i bywają z nią problemy ale w większości przypadków działa. Ostatnio kupiłem taką przejściówkę na układzie FT232RL i jak na razie nie ma problemów.Odnośnie nowego kodu to dioda będzie gasła i zapalała się co 100 ms. Zmienna 'i' nie jest wcale wykorzystywana. Odnośnie schematu to pytam bo z niego jasno nie wynika, masz kondensator 100nF między VCC a GND procesora ? No i czy reset jest przez rezystor do +5V podciągnięty?
  • #9 6887674
    yego666
    Poziom 33  
    Ostatnio bawilem sie z transmisja szeregowa na ATTiny26.
    Zostalem zaskoczony srodze, gdyz okazalo sie, ze kalibracja wewnetrznego oscylatora ( 8MHz ) ma rozrzut nawet do 10%.
    Stad jeden procek dobrze chodzi przy 2400 a inny ni diabla.
    Moze tu masz tez jakis problem.
  • #10 6889817
    robalpl
    Poziom 10  
    Fakt, błąd w programie jest już spowodowany szukaniem na siłę błędu mikrokontrolera. Aż wstyd mi za taki błąd.

    W tej chwili już dodałem kondensator 100nF, oraz reset jest podłączony do zasilania przez rezystor 100kOhm, ale nadal jest tak jak było.

    Chciałem spróbować również jak będzie działał układ bez przejściówki i podłączyłem go bezpośrednio do RS-232. Jednak w menagerze urządzeń, w drzewku "Porty COM i LPT" nie wykrywa żadnego nowego urządzenia, nawet pod nazwą nierozpoznanego urządzenia, dlatego też nie ma możliwości wysłania danych do kontrolera.
  • Pomocny post
    #11 6892056
    wojtek_84
    Poziom 13  
    Sprawdzałem fizycznie drugą wersję twojego kodu co prawda na Atmega 16, ale to nie szkodzi. No i muszę stwierdzić że wszystko ładnie chodzi. Naciskam coś na klawiaturze i diodka się zapala, naciskam drugi raz i diodka gaśnie. Ustawienia portu w Hyper Terminalu to:
    -liczba bito na sekundę : 2400
    - bity danych: 8
    - parzystość : brak
    - bity stopu : 1
    - sterowanie przepływem : brak

    Testowałem to przez MAX232 jak i przez układ FT232RL i wszystko działa. Także kod działa. Błędów szukałbym po stronie elektrycznej.
    Jeżeli w PC masz port COM to powinien być on widoczny w menadżerze urządzeń bez podpiętego sprzętu (np. COM1). Podpinasz kabel i otwierasz ten port w HyperTermie i tyle. PC nie powinien wykrywać nowych urządzeń w takim przypadku.
  • #12 6894309
    robalpl
    Poziom 10  
    No więc znalazłem ostatecznie rozwiązanie. Przejrzałem od początku całą płytkę w poszukiwaniu zimnych lutów, zwarć i innych nieoczekiwanych rzeczy i po długich poszukiwaniach okazało się, że na nóżce mikrokontrolera był zimny lut. Poprawiłem i wszystko działa poprawnie - bezpośrednio po podpięciu do komputera i poprzez przejściówkę.
    Teraz już wiem, żeby zwracać większą uwagę na połączenia ;).
REKLAMA