Skocz do zawartości

FPGA (własne programy #4): komunikacja FPGA-Arduino UART-RS485


Pomocna odpowiedź

(edytowany)

Po tej modyfikacji wyświetla się A5 (cokolwiek nie wpisze do terminala), a diody D3 i D4 święcą się stale (D5-8 zmieniają się według cyfry którą wybieram na klawiaturze)

Jak wpisywałam 1 to ona aktualizowała się na diodach D8-5 (czyli D8), a na D3 i D4 stale jest wysoki poziom (nie wpisywałam 12, powinna na drugim wyświetlaczu widnieć cyfra wpisywana przed 1, np 1)

Edytowano przez monsiw

To dobrze, miało się właśnie wyświetlać na stałe A5. Wyświetlane jest ładnie, bez nakładania się cyfr? Jeśli tak, to możemy założyć, że problem jest z UARTem lub jego obsługą. Wróć z tym fragmentem kodu do stanu poprzedniego.

 

Opis diod świecących w pliku UCF skopiowałem chyba z kursu Forbota bez sprawdzenia, tam jest odwrócony porządek bitów wobec tego, co zakładałem. Najmłodszy bit to dioda D8, a oczekiwałem, że będzie to D1. Nie ma to większego znaczenia. Trzeba ustalić skąd się biorą jedynki logiczne na D3 i D4 (czyli wartość 3, która już wcześniej pojawiała się na wyświetlaczu) w starszej połówce bajtu.

 

 

Możesz zrobić jakieś zrzuty ekranu z programu do obsługi portu szeregowego? W szczególności chodzi o wpisywane liczby oraz ustawienia portu.

 

Masz ewentualnie dostęp do analizatora stanów logicznych lub oscyloskopu – tak, żeby podejrzeć transmitowaną ramkę UART?
 

Tak, o to chodziło, chciałem się upewnić, czy ustawienia są takie same jak w kodzie odbiornika UART.

Te piny DTR i CTS nie powinny mieć znaczenia, ponieważ nie używasz opcji „Flow Control". Chyba, że ten konwerter działa jakoś inaczej, ale to mało prawdopodobne.

 

Chyba pozostaje sprawdzić dokładnie kod tego odbiornika UART, jego działanie w symulacji. Szkoda, że nie masz możliwości podejrzeć przesyłanej ramki, ale raczej powinna być poprawna.

  • Pomogłeś! 1

Ok, załączam jeszcze przykładowy kod testowy (w VHDL), gdybyś chciała się pobawić w symulacji. Jest tam zasymulowane przesłanie kolejno po sobie czterech liczb: 1, 2, 3, 4. W rzeczywistości ramki przychodzą z większymi odstępami czasowymi pomiędzy nimi. Ale i tak nie widzę skąd bierze się ta „3".

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
use IEEE.Numeric_std.ALL;
use ieee.math_real.all;
 
ENTITY test IS
END test;
 
ARCHITECTURE behavior OF test IS 
 
   --Inputs
   signal i_Clk : std_logic := '0';
   signal i_UART_RX : std_logic := '0';

 	--Outputs
   signal o_UART_TX : std_logic;
   signal o_Segment_7 : std_logic;
   signal o_Segment_A : std_logic;
   signal o_Segment_B : std_logic;
   signal o_Segment_C : std_logic;
   signal o_Segment_D : std_logic;
   signal o_Segment_E : std_logic;
   signal o_Segment_F : std_logic;
   signal o_Segment_G : std_logic;
   signal led_enable : std_logic_vector(2 downto 0);
	signal LED : std_logic_vector(7 downto 0);
	
   -- Clock period definitions
   constant i_Clk_period : time := 83333 ps;
 
BEGIN
 
	-- Instantiate the Unit Under Test (UUT)
   uut: entity work.UART_RX_To_7_Seg_Top PORT MAP (
          i_Clk => i_Clk,
          i_UART_RX => i_UART_RX,
          o_UART_TX => o_UART_TX,
          o_Segment_7 => o_Segment_7,
          o_Segment_A => o_Segment_A,
          o_Segment_B => o_Segment_B,
          o_Segment_C => o_Segment_C,
          o_Segment_D => o_Segment_D,
          o_Segment_E => o_Segment_E,
          o_Segment_F => o_Segment_F,
          o_Segment_G => o_Segment_G,
          led_enable => led_enable,
			 LED => LED
        );

   -- Clock process definitions
   i_Clk_process :process
   begin
		i_Clk <= '0';
		wait for i_Clk_period/2;
		i_Clk <= '1';
		wait for i_Clk_period/2;
   end process;
 

   -- Stimulus process
   stim_proc: process
	variable wektor : unsigned(7 downto 0) := (others => '0');
   begin		
      -- hold reset state for 100 ns.
		i_UART_RX <= '1';
      wait for 100 ns;	

		
		for jj in 1 to 4 loop
			wektor := to_unsigned(jj, wektor'length);
		
			i_UART_RX <= '0'; -- Bit startu
			wait for i_Clk_period*104;
			
			for ii in 0 to 7 loop -- Bity danych od najmlodszego
				i_UART_RX <= wektor(ii);
				wait for i_Clk_period*104;
			end loop;
			
			i_UART_RX <= '1'; -- Bit stopu
			wait for i_Clk_period*104;

			--wait for i_Clk_period * 10; -- Przerwa pomiedzy ramkami
		
		end loop;
		

      wait;
   end process;

END;

Jeżeli ustalisz przyczynę problemów, to napisz.

  • Lubię! 1
  • 1 miesiąc później...
(edytowany)

@piotr96

Okazało się, że wszystko dobrze działa, na wyświetlaczu pojawia się forma hex znaku, który wpisywałam do terminala. Jako, że ja próbowałam tylko cyfry przesyłać, to na stałe pokazywała się cyfra 3 na jednym z wyświetlaczy bo tak jest w zapisie szesnastkowy. Teraz widzę, że w filmie dotyczącym Receiver'a jest to pokazane, najwidoczniej zasugerowałam się kolejnym "Transmitter" na którym wyglądało, że to co było wybierane bezpośrednio na klawiaturze wracało do terminala, ale w tym przypadku nie pokazał wyświetlaczy (na których najwidoczniej była forma hex).

Edytowano przez monsiw
  • Lubię! 2

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...