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

Atmega 32 freemodbus win avr

radziu88 15 Mar 2011 01:57 6382 18
  • #1 9278182
    radziu88
    Poziom 10  
    Witam
    Powoli zagłębiam się w tajniki atmegi i próbuję odpalić komunikacje rs485. Po wielu poszukiwaniach wybór padł na freemodbus. Ściągnąłem bibliotekę z ich strony i po przeczytaniu readme postanowiłem skompilować Załączony przykład demo.c lecz niestety przy kompilacji za pomocą win avr otrzymuje błąd
    > "make.exe" all
    /opt/gcc-avr/bin/avr-gcc  -mmcu=atmega168 -Iport -I. -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include  -Wall -gstabs -DF_CPU=20000000UL  -Os -Wall -Wstrict-prototypes -Wp,-M,-MP,-MT,demo.o,-MF,dep/demo.o.d  -c  demo.c
    process_begin: CreateProcess(NULL, /opt/gcc-avr/bin/avr-gcc -mmcu=atmega168 -Iport -I. -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include -Wall -gstabs -DF_CPU=20000000UL -Os -Wall -Wstrict-prototypes -Wp,-M,-MP,-MT,demo.o,-MF,dep/demo.o.d -c demo.c, ...) failed.
    make (e=2): The system cannot find the file specified.
    
    make.exe: *** [demo.o] Error 2
    
    > Process Exit Code: 2
    > Time Taken: 00:00

    w załączniku dodałem plik demo.c
    Proszę o pomoc w kompilacji tego przykładu
    Pozdrawiam
  • #2 9279889
    radziu88
    Poziom 10  
    ok trochę czasu mi to zajeło ale udało mi sie przejść ten problem po przez edycje pliku makefile wyedytowałem 3 linie odpowiedzialne za wybór kompilatora i poszło.

    CC=avr-gcc
    OBJCOPY=avr-objcopy
    AVRDUDE=avrdude


    ale powstał kolejny problem mianowicie problem z plikiem demo.cof wiem że win avr zrezygnował z coff ale niewim jak poprawic makefile aby ten problem rozwiązać.
    komunikat z kompilatora

    > "make.exe" all
    avr-gcc  -mmcu=atmega168 -Iport -I. -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include  -Wall -gstabs -DF_CPU=20000000UL  -Os -Wall -Wstrict-prototypes -Wp,-M,-MP,-MT,demo.o,-MF,dep/demo.o.d  -c  demo.c
    avr-gcc -mmcu=atmega168 -Iport -I. -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include  -Wall -gstabs -DF_CPU=20000000UL  -Os -Wall -Wstrict-prototypes -Wp,-M,-MP,-MT,mb.o,-MF,dep/mb.o.d    -c -o ../../modbus/mb.o ../../modbus/mb.c
    avr-gcc -mmcu=atmega168 -Iport -I. -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include  -Wall -gstabs -DF_CPU=20000000UL  -Os -Wall -Wstrict-prototypes -Wp,-M,-MP,-MT,mbrtu.o,-MF,dep/mbrtu.o.d    -c -o ../../modbus/rtu/mbrtu.o ../../modbus/rtu/mbrtu.c
    avr-gcc -mmcu=atmega168 -Iport -I. -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include  -Wall -gstabs -DF_CPU=20000000UL  -Os -Wall -Wstrict-prototypes -Wp,-M,-MP,-MT,mbascii.o,-MF,dep/mbascii.o.d    -c -o ../../modbus/ascii/mbascii.o ../../modbus/ascii/mbascii.c
    avr-gcc -mmcu=atmega168 -Iport -I. -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include  -Wall -gstabs -DF_CPU=20000000UL  -Os -Wall -Wstrict-prototypes -Wp,-M,-MP,-MT,mbfunccoils.o,-MF,dep/mbfunccoils.o.d    -c -o ../../modbus/functions/mbfunccoils.o ../../modbus/functions/mbfunccoils.c
    avr-gcc -mmcu=atmega168 -Iport -I. -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include  -Wall -gstabs -DF_CPU=20000000UL  -Os -Wall -Wstrict-prototypes -Wp,-M,-MP,-MT,mbfuncdiag.o,-MF,dep/mbfuncdiag.o.d    -c -o ../../modbus/functions/mbfuncdiag.o ../../modbus/functions/mbfuncdiag.c
    avr-gcc -mmcu=atmega168 -Iport -I. -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include  -Wall -gstabs -DF_CPU=20000000UL  -Os -Wall -Wstrict-prototypes -Wp,-M,-MP,-MT,mbfuncholding.o,-MF,dep/mbfuncholding.o.d    -c -o ../../modbus/functions/mbfuncholding.o ../../modbus/functions/mbfuncholding.c
    avr-gcc -mmcu=atmega168 -Iport -I. -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include  -Wall -gstabs -DF_CPU=20000000UL  -Os -Wall -Wstrict-prototypes -Wp,-M,-MP,-MT,mbfuncinput.o,-MF,dep/mbfuncinput.o.d    -c -o ../../modbus/functions/mbfuncinput.o ../../modbus/functions/mbfuncinput.c
    avr-gcc -mmcu=atmega168 -Iport -I. -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include  -Wall -gstabs -DF_CPU=20000000UL  -Os -Wall -Wstrict-prototypes -Wp,-M,-MP,-MT,mbfuncother.o,-MF,dep/mbfuncother.o.d    -c -o ../../modbus/functions/mbfuncother.o ../../modbus/functions/mbfuncother.c
    avr-gcc -mmcu=atmega168 -Iport -I. -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include  -Wall -gstabs -DF_CPU=20000000UL  -Os -Wall -Wstrict-prototypes -Wp,-M,-MP,-MT,mbfuncdisc.o,-MF,dep/mbfuncdisc.o.d    -c -o ../../modbus/functions/mbfuncdisc.o ../../modbus/functions/mbfuncdisc.c
    avr-gcc -mmcu=atmega168 -Iport -I. -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include  -Wall -gstabs -DF_CPU=20000000UL  -Os -Wall -Wstrict-prototypes -Wp,-M,-MP,-MT,mbutils.o,-MF,dep/mbutils.o.d    -c -o ../../modbus/functions/mbutils.o ../../modbus/functions/mbutils.c
    avr-gcc -mmcu=atmega168 -Iport -I. -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include  -Wall -gstabs -DF_CPU=20000000UL  -Os -Wall -Wstrict-prototypes -Wp,-M,-MP,-MT,portserial.o,-MF,dep/portserial.o.d    -c -o port/portserial.o port/portserial.c
    avr-gcc -mmcu=atmega168 -Iport -I. -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include  -Wall -gstabs -DF_CPU=20000000UL  -Os -Wall -Wstrict-prototypes -Wp,-M,-MP,-MT,portevent.o,-MF,dep/portevent.o.d    -c -o port/portevent.o port/portevent.c
    avr-gcc -mmcu=atmega168 -Iport -I. -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include  -Wall -gstabs -DF_CPU=20000000UL  -Os -Wall -Wstrict-prototypes -Wp,-M,-MP,-MT,porttimer.o,-MF,dep/porttimer.o.d    -c -o port/porttimer.o port/porttimer.c
    ../../modbus/include/mbport.h:91: warning: 'vMBPortTimersDisable' declared inline after being called
    ../../modbus/include/mbport.h:91: warning: previous declaration of 'vMBPortTimersDisable' was here
    port/porttimer.c:41: warning: 'usTimerOCRBDelta' defined but not used
    avr-gcc -mmcu=atmega168 -Iport -I. -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include  -Wall -gstabs -DF_CPU=20000000UL  -Os -Wall -Wstrict-prototypes -Wp,-M,-MP,-MT,mbcrc.o,-MF,dep/mbcrc.o.d    -c -o port/mbcrc.o port/mbcrc.c
    avr-gcc -mmcu=atmega168 -Wl,-Map=demo.map,--cref demo.o port/portserial.o port/portevent.o port/porttimer.o port/mbcrc.o ../../modbus/mb.o ../../modbus/rtu/mbrtu.o ../../modbus/ascii/mbascii.o ../../modbus/functions/mbfunccoils.o ../../modbus/functions/mbfuncdiag.o ../../modbus/functions/mbfuncholding.o ../../modbus/functions/mbfuncinput.o ../../modbus/functions/mbfuncother.o ../../modbus/functions/mbfuncdisc.o ../../modbus/functions/mbutils.o    -o demo.elf
    avr-objcopy --debugging \
    		--change-section-address .data-0x800000 \
    		--change-section-address .bss-0x800000 \
    		--change-section-address .noinit-0x800000 \
    		--change-section-address .eeprom-0x810000 -O coff-avr demo.elf demo.cof
    int constant type not supported in coff-avr
    avr-objcopy: --change-section-vma .eeprom+0xff7f0000 never used
    avr-objcopy: --change-section-lma .eeprom+0xff7f0000 never used
    avr-objcopy: --change-section-vma .noinit+0xff800000 never used
    avr-objcopy: --change-section-lma .noinit+0xff800000 never used
    make.exe: *** [demo.cof] Error 1
    
    > Process Exit Code: 2
    > Time Taken: 00:09


    makefile
    ##############################################################################
    # Makefile for the project AVR
    ###############################################################################
    
    ## General Flags
    PROJECT = demo
    MCU = atmega168
    TARGET = demo
    
    CC=avr-gcc
    OBJCOPY=avr-objcopy
    AVRDUDE=avrdude
    
    ## Options common to compile, link and assembly rules
    COMMON = -mmcu=$(MCU)
    
    ## Compile options common for all C compilation units.
    CFLAGS = $(COMMON) \
    		 -Iport -I. \
    		 -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include 
    CFLAGS += -Wall -gstabs -DF_CPU=20000000UL  -Os -Wall -Wstrict-prototypes
    
    CFLAGS += -Wp,-M,-MP,-MT,$(*F).o,-MF,dep/$(@F).d 
    
    ## Assembly specific flags
    ASMFLAGS = $(COMMON)
    ASMFLAGS += -x assembler-with-cpp -Wa,-gstabs
    
    ## Linker flags
    LDFLAGS = $(COMMON)
    LDFLAGS += -Wl,-Map=$(TARGET).map,--cref
    
    ## Intel Hex file production flags
    HEX_FLASH_FLAGS = -R .eeprom
    
    HEX_EEPROM_FLAGS = -j .eeprom
    HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
    HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0
    
    
    ## Objects that must be built in order to link
    #OBJECTS = excoils.o
    OBJECTS = demo.o
    MBPORTOBJECTS = port/portserial.o \
    			port/portevent.o \
    			port/porttimer.o \
    			port/mbcrc.o
    MBOBJECTS = ../../modbus/mb.o \
    			../../modbus/rtu/mbrtu.o \
    			../../modbus/ascii/mbascii.o \
    			../../modbus/functions/mbfunccoils.o \
    			../../modbus/functions/mbfuncdiag.o \
    			../../modbus/functions/mbfuncholding.o \
    			../../modbus/functions/mbfuncinput.o \
    			../../modbus/functions/mbfuncother.o \
    			../../modbus/functions/mbfuncdisc.o \
    			../../modbus/functions/mbutils.o 
    
    
    ## Build
    all: $(TARGET).elf $(TARGET).cof $(TARGET).hex $(TARGET).eep 
    
    ## Compile
    demo.o: demo.c
    	$(CC) $(INCLUDES) $(CFLAGS) -c  $<
    
    ##Link
    $(TARGET).elf: $(OBJECTS) $(MBOBJECTS) $(MBPORTOBJECTS)
    	 $(CC) $(LDFLAGS) $(OBJECTS) $(MBPORTOBJECTS) $(MBOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET).elf
    
    %.hex: $(TARGET).elf
    	$(OBJCOPY) -O ihex $(HEX_FLASH_FLAGS)  $< $@
    
    %.cof: $(TARGET).elf
    	$(OBJCOPY) --debugging \
    		--change-section-address .data-0x800000 \
    		--change-section-address .bss-0x800000 \
    		--change-section-address .noinit-0x800000 \
    		--change-section-address .eeprom-0x810000 -O coff-avr $< $@
    
    %.eep: $(TARGET).elf
    	$(OBJCOPY) $(HEX_EEPROM_FLAGS) -O ihex $< $@
    
    %.lss: $(TARGET)
    	$(OBJCOPY) -h -S $< > $@
    
    flash:
    	$(AVRDUDE) -p m168 -c stk200 -U flash:w:$(TARGET).hex				
    
    #size: ${TARGET}
    #	@echo
    #	@sh avr-mem.sh ${TARGET} ${MCU}
    
    ## Clean target
    .PHONY: clean
    clean:
    	-rm -rf $(OBJECTS) $(MBOBJECTS) $(MBPORTOBJECTS) 
    	-rm -rf $(TARGET).elf $(TARGET).hex $(TARGET).eep $(TARGET).cof $(TARGET).map
    	-rm -rf dep
    
    ## Other dependencies
    -include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)
    
    
    


    proszę o pomoc
  • #3 9281461
    Slawek_K
    Poziom 12  
    Witam,

    Proponuję użyć AVR Studio v4.18 SP3. U mnie bez problemu udało się skompilować program na ATmega32. Udało się również uruchomić komunikację Modbus z wykorzystaniem tego przykładu na mikrokontrolerze ATmega2560.

    pozdrawiam
    Sławek
  • #4 9281950
    radziu88
    Poziom 10  
    wkleiłeś po prstu kod do avr studio i skompilowałeś ? czy wymaga to jakiś innych operacji ?? sory ale jestem w tym nowy
  • #5 9282033
    Karol966
    Poziom 31  
    radziu88 napisał:
    wkleiłeś po prstu kod do avr studio i skompilowałeś ? czy wymaga to jakiś innych operacji ?? sory ale jestem w tym nowy


    Użyj jakiegokolwiek pliku make dla procesora atmega32 pod win avr i zmień odpowiednie linie (głównie: nazwa pliki *.c, kwarc, ewentualne dodatkowe pliki *.c no i typ oraz podłączenie programatora).

    Odpal mój make i zmień go na swoje potrzeby - jest to raptem kilka linii, jak nie to Ci go spróbuję zmienić. Pamiętaj aby wywalić rozszerzenie - nie mogłem bez niego dodać go jako załącznik.
  • #6 9286233
    radziu88
    Poziom 10  
    super bardzo dziękuje za pomoc udało mis się w końcu skompilować to demo. teraz następne Pytanie jak sprawdzić czy po wgraniu do uc program działa prawidłowo obecnie podłączyłem do atmegi max232 i przez rs232 do komputera program modbus poll wyświetla tylko komunikat time out
  • #8 9292808
    radziu88
    Poziom 10  
    tak tylko pytanie teraz jaki jest adres urządzenia ?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    jeżeli dobrze zrozumiałem dokumentacje to adres urządzenia w tym wypadku powinien być 0x34 czyli 52 lecz niestety nie mogę nic odczytać po tym adresem.
    Połączenie z uc rs485 (max rs485) w pc przejściówka avtmod03 i program baseblock MODBUS RTU.

    uc to atmega 32 taktowana wewnętrznym kwarcem wiec nie zmieniałem fusebitów
  • #9 9300910
    Slawek_K
    Poziom 12  
    Witam,

    Adres urządzenia w sieci Modbus RTU jest 10 (0x0A).
    Wynika to z inicjalizacji: eStatus = eMBInit( MB_RTU, 0x0A, 0, 38400, MB_PAR_EVEN );
    Prędkość transmisji 38400, kontrola parzystości Even.

    pozdrawiam
    Sławek
  • #10 9302293
    radziu88
    Poziom 10  
    dzięki za odpowiedz juz do tego doszedłem ale wciąż nie mogę odczytać tych rejestrów i nie mam pojęcia co robię źle. doszedłem już do tego że brakowało mi terminatorów więc dodałem pomierzy zaciskami AB rezystory 120 ohm na końcach linii. zastanawiam się czy to nie wina zegara mam ustawiony wewnętrzny oscylator czy to może być przyczyną ? czy do komunikacji trzeba zmieniać jakieś fuse bity ?
  • #11 9302524
    Slawek_K
    Poziom 12  
    Witam,

    Pierwszy problem to na pewno oscylator. Oscylator wewnętrzny nie ma dużej dokładności (dla ATmega32 jest to +/-3% nominalnej częstotliwości). Proponuję użyć zewnętrznego oscylatora.
    Druga sprawa to jaki obszar pamięci danych jest odczytywany przez układ nadrzędny?
    W przykładzie "demo.c" jest ustawiony obszar pamięci typu "Input Register" od rejestru nr 1000 do 1003. Wynika to z deklaracji na początku:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W tym przykładzie nie jest pokazana obsługa odczytu i zapisu innych obszarów danych, np. Holding Register.

    pozdrawiam
    Sławek
  • #12 9303654
    radziu88
    Poziom 10  
    do do rejestrów staram się odczytać rejestr o numerze 1000 z urządzenia o adresie 10.
    co do oscylatora muszę wymyślić jak to przestawić wiem że trzeba zmienić fusebity ale trochę się obawiam że mogę zablokować uc
  • #13 9303770
    Slawek_K
    Poziom 12  
    Witam,

    W protokole Modbus są dwa rodzaje rejestrów: Input i Holding Register. Różnica polega na tym, że Input można tylko odczytywać i są to przeważnie wejścia analogowe. Rejestry typu Holding można odczytywać i zapisywać, mogą to być rejestry wewnętrzne lub wyjścia analogowe. Input Register (03) są odczytywane poprzez kod funkcji 04, natomiast Holding Register (04) są odczytane przy pomocy kodu funkcji 03.
    W tym przypadku należy użyć funkcji odczytu 03 i zapytać o rejestry od R1000 maksymalnie o 4 rejestry (można zaadresować mniejszą liczbę).

    Jeśli chodzi o oscylator to najpierw należy dołożyć układ oscylatora zewnętrznego i dopiero przestawić fusebits.

    pozdrawiam

    Sławek
  • #14 9355806
    radziu88
    Poziom 10  
    Witam ponownie.
    Zmieniłem oscylator w atmedze na zewnętrzny 14745600 Hz
    założyłem terminatory 120ohm na końcach lini miedzy A i B,
    wymieniłem max 485 na nowego
    i niestety wciąż nie mogę odczytać rejestru
    .ustawiania programu odczytowego pokazano na rysunku proszę o pomoc
    Atmega 32 freemodbus win avr
    połączenie atmega max485 tak jak tu
    http://gdallaire.net/blog/wp-content/uploads/2008/10/atmega8_rs485.png
  • #15 9360687
    Slawek_K
    Poziom 12  
    Witam,

    Proponuję sprawdzić komunikację z wykorzystaniem tylko RS232 w ATmega32. W przypadku RS485 należy jeszcze zapewnić sterowanie odbiornikiem i nadajnikiem. Należy odpowiednio wpisać numeru pinu portu mikrokontrolera, który będzie to realizował poprzez RTS_ENABLE. Zmiany należy wprowadzić w pliku "port.h".
    Poniżej przedstawiam fragment pliku "port.h". U mnie to jest dla ATmega2560

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    pozdrawiam
    Sławek
  • #16 9367020
    radziu88
    Poziom 10  
    Witam Poszedłem za twoją radą i odpaliłem najpierw rs232
    #include <stdint.h>
    #include <avr/io.h>
    #include <util/delay.h> 
    
    // Define baud rate
    #define USART_BAUD 9600ul
    #define USART_UBBR_VALUE ((F_CPU/(USART_BAUD<<4))-1)
    
    void USART_vInit(void)
    {
    // Set baud rate
    UBRRH = (uint8_t)(USART_UBBR_VALUE>>8);
    UBRRL = (uint8_t)USART_UBBR_VALUE;
    
    // Set frame format to 8 data bits, no parity, 1 stop bit
    UCSRC = (0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
    
    // Enable receiver and transmitter
    //UCSRB = (1<<RXEN)|(1<<TXEN);
    //włacz transpiter
    UCSRB = (1<<TXEN);
    }
    
    void USART_vSendByte(uint8_t u8Data)
    {
    // Wait if a byte is being transmitted
    while((UCSRA&(1<<UDRE)) == 0);
    // Transmit data
    UDR = u8Data;
    }
    
    
    
    int main(void)
    {
    uint8_t u8Data;
    
    // Initialise USART
    USART_vInit();
    
    
    // Repeat indefinitely
    for(;;)
    {
    
    USART_vSendByte('A');
    _delay_ms(1000);
    }
    }

    przy tym kodzie co 1000 ms powinienem na terminalu na pc odbierać znak A zamiast tego odbieram <00><00><00> błąd jest w kodzie ? przy transmisji rs485 miałem to samo .
    trochę poszperałem i udało mi się uruchomić transmisje po rs232
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    wszystko ładnie echo działa żadnych przekłamań niema.
    ale gdy wgrywam kod z demo freemodbusa nie mogę odczytać rejestru


    przeanalizowałem plik port.h


    #define ENTER_CRITICAL_SECTION( )   cli()
    #define EXIT_CRITICAL_SECTION( )    sei()
    
    #define assert( x )
    
    typedef char    BOOL;
    
    typedef unsigned char UCHAR;
    typedef char    CHAR;
    
    typedef unsigned short USHORT;
    typedef short   SHORT;
    
    typedef unsigned long ULONG;
    typedef long    LONG;
    
    #ifndef TRUE
    #define TRUE            1
    #endif
    
    #ifndef FALSE
    #define FALSE           0
    #endif
    
    /* ----------------------- AVR platform specifics ---------------------------*/
    
    #if defined (__AVR_ATmega168__)
    #define UCSRB           UCSR0B
    #define TXEN            TXEN0
    #define RXEN            RXEN0
    #define RXCIE           RXCIE0
    #define TXCIE           TXCIE0
    #define UDRE            UDRE0
    #define UBRR            UBRR0
    #define UCSRC           UCSR0C
    #define UPM1            UPM01
    #define UPM0            UPM00
    #define UCSZ0           UCSZ00
    #define UCSZ1           UCSZ01
    #define UDR             UDR0
    #define SIG_UART_TRANS  SIG_USART_TRANS
    
    #elif defined (__AVR_ATmega169__)
    
    #define SIG_UART_TRANS  SIG_USART_TRANS
    
    #elif defined (__AVR_ATmega8__)
    #define UBRR            UBRRL
    #define TCCR1C          TCCR1A  /* dummy */
    #define TIMSK1          TIMSK
    #define TIFR1           TIFR
    #define SIG_USART_DATA  SIG_UART_DATA
    #define SIG_USART_RECV  SIG_UART_RECV
    
    #elif defined (__AVR_ATmega16__)
    #define UBRR            UBRRL
    #define TCCR1C          TCCR1A  /* dummy */
    #define TIMSK1          TIMSK
    #define TIFR1           TIFR
    
    #elif defined (__AVR_ATmega32__)
    #define UBRR            UBRRL
    #define TCCR1C          TCCR1A  /* dummy */
    #define TIMSK1          TIMSK
    #define TIFR1           TIFR
    
    #elif defined (__AVR_ATmega128__)
    #define UCSRB           UCSR0B
    #define UBRR            UBRR0L
    #define UDR             UDR0
    #define TIMSK1          TIMSK
    #define TIFR1           TIFR
    #define SIG_UART_TRANS  SIG_USART0_TRANS
    #define SIG_USART_DATA  SIG_USART0_DATA
    #define SIG_USART_RECV  SIG_USART0_RECV
    #define UCSZ0           UCSZ00
    #define UCSZ1           UCSZ01
    #define UPM0            UPM00
    #define UPM1            UPM01
    #define UCSRC           UCSR0C
    
    #endif
    
    /* ----------------------- RS485 specifics ----------------------------------*/
    #ifdef  RTS_ENABLE
    
    #define RTS_PIN         PB0
    #define RTS_DDR         DDRB
    #define RTS_PORT        PORTB
    
    #define RTS_INIT        \
        do { \
            RTS_DDR |= _BV( RTS_PIN ); \
            RTS_PORT &= ~( _BV( RTS_PIN ) ); \
        } while( 0 );
    
    #define RTS_HIGH        \
        do { \
            RTS_PORT |= _BV( RTS_PIN ); \
        } while( 0 );
    
    #define RTS_LOW         \
        do { \
            RTS_PORT &= ~( _BV( RTS_PIN ) ); \
        } while( 0 );
    
    #endif
    
    #endif
    

    okazało się że sterownie przepływem odbywa się za pomocą portu PB0 czyli PIN1 atmegi32 . Jak rozumiem powinienem podłączyć pod ten pin piny 2 i 3 z maxa 485
    w celu sterowania kierunkiem transmisji niestety stan tego pinu się nie zmienia i wciąż nie mogę odczytać rejestru

    trochę walki i kolejne pozytywne efekty udało mi się przerobić program echo na rs485

    #include <avr/io.h> 
    #include <util/delay.h> 
    
    #define USART_BAUDRATE 9600 
    #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) 
    
    
    int main (void) 
    { 
       char znak; 
    
       UCSRB |= (1 << RXEN) | (1 << TXEN);   // Turn on the transmission and reception circuitry 
       UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); // Use 8-bit character sizes 
    
       UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register 
       UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register 
    
    
    
    for (;;)//pentla nieskonczona 
    {
       for (int i=0;i<1;i++)// pentla przestwia w stan odbierania i odbniera jeden znak 
       {
    	DDRB  = 0x01; // ustawimay pin B0 w stan wysoki max485 w trybie odbierania   
    	while ((UCSRA & (1 << RXC)) == 0) {}; // Do nothing until data have been received and is ready to be read from UDR 
        znak = UDR; // Fetch the received byte value into the variable "ByteReceived"
    	}
       
       for (int i=0;i<1;i++) 
       {
    	DDRB  = 0x00; //ustawimay pin B0 w stan niski max 485 w trybie nadawania
    	while ((UCSRA & (1 << UDRE)) == 0) {}; // Do nothing until UDR is ready for more data to be written to it 
    	UDR = znak; // Echo back the received byte back to the computer 
    	}  
    	_delay_ms(100);
    	
    	   
    }
    } 

    tylko że jak mu wysyłam znak 'a' to otrzymuje w odpowiedzi 'a<00>' skąd bierze się fragment '<00>' ? i jak go wyeliminować ?
  • #17 9380295
    Slawek_K
    Poziom 12  
    Witam,

    Proponuję coś innego. Komunikacja po Modbus może być uruchomiona z wykorzystaniem RS232. Ja uruchomiłem ten przykład na zestawie ZL3AVR http://www.kamami.pl/?id_prod=1826500 (akurat taki miałem). Dopiero później przerobiłem go na ATmega2560. Proszę prześlij do mnie informację jaki masz układ (najlepiej schemat) to pomogę Ci skompilować projekt.

    pozdrawiam
    Sławek
  • #19 9466351
    gayetan
    Poziom 18  
    Cytat:
    ....tylko że jak mu wysyłam znak 'a' to otrzymuje w odpowiedzi 'a<00>' skąd bierze się fragment '<00>' ? i jak go wyeliminować ?


    Nie wiem czy odpowiedź jest jeszcze aktualna i czy to może być, to co myślę, że może być..... ale jeśli zwrócisz uwagę na swój kod:
    Cytat:
    char znak;

    to zmienna, którą zadeklarowałeś jest typu char! teraz zależy czy wysyłasz rzeczywiście 'a' - to ją kompilator powinien zmienić na ASCII i powinno być ok. czy "a" - bo wtedy wysyłasz łańcuch, który składa się z 'a' i znaku końca łańcucha czyli 0 ( zero ASCII, zwane NULL - 'skrót ASCII - NUL').
    P.S. masz tu też błąd w 'pentli nieskończonej' - zwanej pętlą - ale to ostatnie nie wpłynie na wynik kompilacji. Pozdrawiam
REKLAMA