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

[attiny25][C] Software'owy port RS (tylko TX)

Krampek 27 Mar 2009 09:36 1773 5
REKLAMA
  • #1 6338980
    Krampek
    Poziom 16  
    Witam

    Chcę zaimplementować do mojego procka wysyłanie danych po RS'ie ( chodzi tylko o wysyłanie zgodne z standardem RS232 8 bitów danych, brak parzystości, 1 bit stopu, prędkość konfigurowalna). Czy ktoś ma jakiś przykładowy programik jak zaimplementować w programie alby jeden z pinów procesora pracował jako TX. Rozumiem że trzeba jakieś timery uruchomić i wysyłać synchronicznie tak aby spełnić założenia prędkości np 4800kB/s.

    Będę wdzięczny za wszelkie info, oraz przekierowanie na strony gdzie znajdę więcej na temat software'owego portu RS232. Znalazłem jakieś strony na których są przykładowe programy, ale dotyczą one tworzenia całej magistrali ( TX,RX ) a mi tylko potrzebny TX. Stąd nie chcę niepotrzebnie sobie komplikować programu.

    Pozdrawiam

    Poprawiłem tytuł - Regulamin. [c_p]
  • REKLAMA
  • #2 6339006
    seba_x
    Poziom 31  
    Krampek napisał:
    Witam

    Chcę zaimplementować do mojego procka wysyłanie danych po RS'ie ( chodzi tylko o wysyłanie zgodne z standardem RS232 8 bitów danych, brak parzystości, 1 bit stopu, prędkość konfigurowalna). Czy ktoś ma jakiś przykładowy programik jak zaimplementować w programie alby jeden z pinów procesora pracował jako TX. Rozumiem że trzeba jakieś timery uruchomić i wysyłać synchronicznie tak aby spełnić założenia prędkości np 4800kB/s.

    Będę wdzięczny za wszelkie info, oraz przekierowanie na strony gdzie znajdę więcej na temat software'owego portu RS232. Znalazłem jakieś strony na których są przykładowe programy, ale dotyczą one tworzenia całej magistrali ( TX,RX ) a mi tylko potrzebny TX. Stąd nie chcę niepotrzebnie sobie komplikować programu.

    Pozdrawiam


    $regfile = "attiny13.dat"
    
    
    $hwstack = 40
    $swstack = 40
    $framesize = 40
    
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Config 1wire = Portb.4
    
    Dim Odczyt(2)as Byte
    Dim T As Integer
    Dim W As Word
    
    Start Adc
    
    
    Do
    
       1wreset
       1wwrite &HCC
       1wwrite &H44
    
       Waitms 750
    
       1wreset
       1wwrite &HCC
       1wwrite &HBE
    
       Odczyt(1) = 1wread(2)
       T = Odczyt(2)
       Shift T , Left , 8
       T = T + Odczyt(1)
    
       W = Getadc(3)
    
    
      Open "comb.2:9600,8,n,1" For Output As #1    '----- tu masz wysyłanie po rsie
      Print #1 , W
      Print #1 , T
      Close #1
    
    Loop
    End
  • REKLAMA
  • #3 6339121
    Krampek
    Poziom 16  
    Tak na marginesie - bo nie umieściłem tego w poście - piszę pod AVR Studio, GCC.

    Pozdrawiam
  • REKLAMA
  • Pomocny post
    #4 6339382
    mirekk36
    Poziom 42  
    Tak więc widzisz kolego Krampek, że TAGI w temacie o których tyle razy była mowa są bardzo przydatne bo bez dodatkowych słów opisu byłoby wiadomo z takiego tematu:

    [ATtiny25][C] - software'owy port RS (tylko TX)

    że chodzi ci o przykłady w C dla procka tiny25 ;)

    a odnośnie samego pytania - to sam ostatnio szukałem możliwości wykonania takiego sftwarowego RS TxD w języku C no i udało się - działa wyśmienicie ;) poniżej kod:

    #include <avr/io.h>
    #include "soft_uart.h"
    
    .global sputchar
    
    sputchar:
    
    		push	R16
    		push	R17
    		push	R18
    
    		mov		R18, R24  ; przekazanie znaku do nadania z parametru funkcji sputchar
    
    		ldi	r16,1+8+sb	;1+8+sb (sb = ilość bitów stopu)
    		com	r18		;
    		sec			;Start bit
    
    		cli ; 
    
    putchar0:
    		brcc	putchar1	;
    		cbi		_SFR_IO_ADDR( SUART_PORT_TX ), TxD	;    send a '0'
    		rjmp	putchar2	;else
    
    putchar1:
    		sbi	_SFR_IO_ADDR( SUART_PORT_TX ), TxD	;    send a '1'
    		nop
    
    putchar2:
    		rcall UART_delay	;
    		rcall UART_delay
    
    		lsr		r18		;
    		dec		r16		;
    		brne	putchar0	;   
    					;
    		sei	;
    
    		pop		R18
    		pop		R17
    		pop		R16
    		ret			;  
    
    .global UART_delay
    
    UART_delay:
    		ldi		R17, b_value
    UART_delay1:
    		dec		R17
    		brne	UART_delay1
    		ret


    to co powyżej musisz zapisać jako plik z rozszerzeniem *.S (duża literka S)

    a poniżej masz do tegoż plik nagłówkowy:


    #ifndef SOFT_UART_H_
    #define SOFT_UART_H_
    
    // wybór portu do transmisji software UART
    // Nadawanie TxD
    #define SUART_PORT_TX PORTB
    #define SUART_DDR_TX DDRB
    // Odbieranie RxD ---------> poniższe 2 linijki trzeba zaremować jeśli nie korzystamy z soft RxD
    //#define SUART_PIN_RX PINC
    //#define SUART_DDR_RX DDRC
    
    //#define SUART_PORT D
    
    // wybór poszczególnych pinów portów dla linii RxD oraz TxD
    //#define	RxD	4
    #define	TxD	3
    
    // definicja ilości bitów STOP
    #define sb 1
    // stop bits 1..2
    
    // definicja opóźnienia dla Software UART
    // w zależności od częstotliwości taktowania
    // zgodnie z wartościami podanymi dla różnych prędkości
    // w nocie AVR-305
    // Table 4-2. Baud Rate Table (str.8)
    
    
    #define b_value 188 //135
    
    /*
    ; Some b values: 	(See also table in Appnote documentation)
    ;
    ; 1 MHz crystal:
    ;   9600 bps - b=14
    ;  19200 bps - b=5
    ;  28800 bps - b=2
    ;
    ; 2 MHz crystal:
    ;  19200 bps - b=14
    ;  28800 bps - b=8
    ;  57600 bps - b=2
    
    ; 4 MHz crystal:
    ;  19200 bps - b=31
    ;  28800 bps - b=19
    ;  57600 bps - b=8
    ; 115200 bps - b=2
    
    ; 8 MHz crystal:
    ;	9600 bps - b=135
    ;  14400 bps - b=89
    ;  19200 bps - b=66
    ;  28800 bps - b=42
    
    ; 11.0592 MHz crystal:
    ;	9600 bps - b=188  ******
    ;  14400 bps - b=124
    ;  19200 bps - b=92
    ;  28800 bps - b=60
    ;  57600 bps - b=28
    ; 115200 bps - b=12
    
    
    */
    
    #endif /* SOFT_UART_H_ */


    aha i do tego jeszcze inicjalizacja:

    
    #include <avr/io.h>
    #include "makra_mk.h"
    #include "soft_uart.h"
    
    void suart_init(void)
    {
    	// ustawienie kierunków linii dla Software-UART
    	SUART_DDR_TX SET (1<<TxD);
    	SUART_PORT_TX SET (1<<TxD);
    #ifdef SUART_DDR_RX
    	SUART_DDR_RX RESET (1<<RxD);
    #endif
    }


    oczywiście możesz sobie zaremować: #include "makra_mk.h"

    i zamiast pisać np jak wyżej:

    SUART_DDR_TX SET (1<<TxD);
    SUART_DDR_RX RESET (1<<RxD);


    napiszesz

    SUART_DDR_TX |= (1<<TxD);
    SUART_DDR_RX &= ~(1<<RxD);


    myślę że na podstawie tego już sam spokojnie napiszesz sobie funkcje do wyświetlania stringów , liczb itp

    pozdr
  • REKLAMA
  • Pomocny post
    #5 6339420
    piti___
    Poziom 23  
    Witam

    Można też tak:
    
    static int uart_putchar(char c, FILE *stream);
    
        static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,
                                                 _FDEV_SETUP_WRITE);
    
    static int uart_putchar(char c, FILE *stream)
    {
       char i;       
    
       cli();
       // bit startu 
       SOFTUART_SETLO(); 
       delay_us(BIT_DELAY); 
       // 8 bitów danych (MSB first) 
       for(i=0;i<8;i++) 
       { 
          if(c & 0x01) 
             SOFTUART_SETHI(); 
          else 
             SOFTUART_SETLO(); 
          c >>= 1; 
          delay_us(BIT_DELAY); 
       } 
        
       // bit stopu 
       SOFTUART_SETHI(); 
       delay_us(BIT_DELAY); 
       sei();     
    
          return 0;
        }
    


    oraz gdzies w programie:
    stdout = &mystdout;
  • #6 6356058
    Krampek
    Poziom 16  
    Pierwsza wersja obsługi rs'a działa faktycznie wyśmienicie ;), drugiej nie sprawdzałem jeszcze. Dzięki za pomoc!
REKLAMA