Rs232 MAXSONAR a de2

-1
module testc (CLOCK_50, KEY, UART_RXD, LEDR);

parameter IDLE = 1'b0;
parameter RECEIVING = 1'b1;

input CLOCK_50, UART_RXD;
input [0:0] KEY;
output [7:0] LEDR;
wire [7:0] RxData;

reg shift;
reg [1:0] state, nextstate;
reg [3:0] bitcounter;
reg [3:0] samplecounter;
reg [12:0] counter;
reg [10:0] rxshiftreg;
reg clear_bitcounter, inc_bitcounter, inc_samplecounter, clear_samplecounter;

wire reset;

assign reset = KEY[0];
assign RxData = rxshiftreg[8:1];
assign LEDR = RxData;

always @ (posedge CLOCK_50)
begin
    if (!reset) 
    begin
        state <= IDLE;
        bitcounter <= 0; counter <= 0;
        samplecounter <= 0;
    end
    else 
    begin
        counter <= counter+1;
        if (counter>=1736)
        begin
            counter<=0;
            state<=nextstate;
            if (shift)
                rxshiftreg<={UART_RXD, rxshiftreg[10:1]};
            if (clear_samplecounter) 
                samplecounter<=0;
            else if (inc_samplecounter) 
                    samplecounter<=samplecounter+1;
            if (clear_bitcounter)
                bitcounter <=0;
            if (inc_bitcounter)
                bitcounter<=bitcounter+1;
        end
    end
end

always @ (state or UART_RXD or bitcounter or samplecounter)
begin
    shift = 0;
    clear_samplecounter = 0;
    inc_samplecounter = 0;
    clear_bitcounter = 0;
    inc_bitcounter = 0;

    case (state)
    IDLE:begin
        if (UART_RXD)
            nextstate = IDLE;
        else begin
            nextstate = RECEIVING;
            clear_bitcounter = 1;
            clear_samplecounter = 1;
         end
    end
    RECEIVING:begin
        if (samplecounter == 1) shift = 1;
        if (samplecounter == 3) begin
            if (bitcounter == 10) begin
                nextstate = IDLE;
            end
            inc_bitcounter = 1;
            clear_samplecounter = 1;
        end
        else inc_samplecounter = 1;
        end
    endcase
end
endmodule

Este es el módulo verilog que estoy usando para obtener mi rxdata ... Cuando conecto el pin tx del sensor al pin rx del de2, los leds siguen parpadeando sin patrón y también el led rxd en el de2 mantiene parpadea lo que significa que está recibiendo los datos. Le doy una fuente externa de 5 V al sensor y conecto a tierra el quinto pin del rs232

Si alguien puede ayudarlo, sería genial

    
pregunta user591124

1 respuesta

1

Según la hoja de datos vinculada en los comentarios, como mínimo, debe invertir la señal. Como se puede hacer con el código FPGA, la protección eléctrica más allá de las resistencias de 47 ohmios que aparentemente ya se encuentran presentes debería ser externa. A 9600 baudios, probablemente funcionará un divisor de voltaje resistivo.

"Si se desea un nivel de voltaje estándar RS232, invierta y conecte un convertidor RS232 como un MAX232"

Es casi seguro que su código FPGA está diseñado para la comunicación en serie de nivel lógico, como el MAX232 acepta en su lado lógico, que se invierte en sentido de la salida de "bajo voltaje RS232" de este sensor y el verdadero RS232 que cumple con las especificaciones que espera para ser aceptado en lugar de.

Puede que aún no funcione, incluso después de que haya resuelto el sentido lógico. Como dije más brevemente en mi comentario, debe asegurarse de que el FPGA está generando el baudio correcto de 8x baudios o 16x o cualquier otro reloj de muestreo (si lo obtuvo de una fuente que también publica un transmisor, constrúyalo y configúrelo a). Repetir algunos caracteres puede ser una simple comprobación). Y es posible que desee hacer su depuración con un programa de terminal de PC como la fuente, para que pueda enviar un valor conocido a la vez. A medida que se acerque a su funcionamiento, al menos debería comenzar a ver algún tipo de patrón entre la tecla que presiona y la salida que obtiene, pensar en esos números en binario puede llevar a identificar cualquier problema restante.

(Por cierto, normalmente un microcontrolador emitiría datos en serie con la polaridad de nivel lógico habitual, y requeriría que un inversor externo tenga el mismo sentido que RS232 para intentar el truco de subtensión que han empleado. Sin embargo, Parece que no se está usando un UART de hardware, sino que se trata de una operación de bit bit en la salida serial del software, momento en el cual es fácil para ellos producirla con la polaridad que deseen. Si los problemas persisten, vale la pena tener en cuenta que básicamente haga que los motores serie hágalo usted mismo en ambos extremos del enlace en lugar de UART validados de forma más exhaustiva implementados a nivel de silicio. Como resultado, podría esperarse una probabilidad ligeramente mayor de tener problemas menores de implementación en cada extremo, lo que solo se convierte en un problema real cuando están conectados entre sí).

    
respondido por el Chris Stratton

Lea otras preguntas en las etiquetas