Benadski
Kom eens langs bij RevSpace of één van de andere spaces!
Ik ben al uren aan het zoeken, maar volgens mij staat het niet op internet.
Hoe voeg ik aan onderstaand stuk PIO code een extra I/O pin toe voor het RE/DE signaal, zodat ik van de 232 transmit PIO een 485 compatible transmit PIO maak? RE/DE moet hoog worden voor de (eerste) startbit en na de (laatste) stopbit meteen laag gaan. Eerste en laatste staan tussen haakjes want ik denk dat het ook wel tussen elke verzonden byte heel even mag wisselen.
;
; Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
;
; SPDX-License-Identifier: BSD-3-Clause
;
.program uart_tx
.side_set 1 opt
; An 8n1 UART transmit program.
; OUT pin 0 and side-set pin 0 are both mapped to UART TX pin.
pull side 1 [7] ; Assert stop bit, or stall with line in idle state
set x, 7 side 0 [7] ; Preload bit counter, assert start bit for 8 clocks
bitloop: ; This loop will run 8 times (8n1 UART)
out pins, 1 ; Shift 1 bit from OSR to the first OUT pin
jmp x-- bitloop [6] ; Each loop iteration is 8 cycles.
% c-sdk {
#include "hardware/clocks.h"
static inline void uart_tx_program_init(PIO pio, uint sm, uint offset, uint pin_tx, uint baud) {
// Tell PIO to initially drive output-high on the selected pin, then map PIO
// onto that pin with the IO muxes.
pio_sm_set_pins_with_mask(pio, sm, 1u << pin_tx, 1u << pin_tx);
pio_sm_set_pindirs_with_mask(pio, sm, 1u << pin_tx, 1u << pin_tx);
pio_gpio_init(pio, pin_tx);
pio_sm_config c = uart_tx_program_get_default_config(offset);
// OUT shifts to right, no autopull
sm_config_set_out_shift(&c, true, false, 32);
// We are mapping both OUT and side-set to the same pin, because sometimes
// we need to assert user data onto the pin (with OUT) and sometimes
// assert constant values (start/stop bit)
sm_config_set_out_pins(&c, pin_tx, 1);
sm_config_set_sideset_pins(&c, pin_tx);
// We only need TX, so get an 8-deep FIFO!
sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX);
// SM transmits 1 bit per 8 execution cycles.
float div = (float)clock_get_hz(clk_sys) / (8 * baud);
sm_config_set_clkdiv(&c, div);
pio_sm_init(pio, sm, offset, &c);
pio_sm_set_enabled(pio, sm, true);
}
static inline void uart_tx_program_putc(PIO pio, uint sm, char c) {
pio_sm_put_blocking(pio, sm, (uint32_t)c);
}
static inline void uart_tx_program_puts(PIO pio, uint sm, const char *s) {
while (*s)
uart_tx_program_putc(pio, sm, *s++);
}
%}
buckfast_beekeeper
Van Lambiek wordt goede geuze gemaakt.
Normaal maak je RE/DE hoog bij verzenden en laag bij ontvangen. Dat hoeft niet tussen elke byte. Is ook niet wenselijk denk ik.
Als alle RE/DE ingangen gelijk laag zijn, kan je best aan master zijde 10k tussen vcc en A plaatsen en 10k tussen B en GND. Zo hebben de A en B lijn altijd een gedefinieerde toestand.
Met 2 RS485 kan je ook een RS422 signaal maken. RE laag maken en DE hoog.
Benadski
Kom eens langs bij RevSpace of één van de andere spaces!
Ja, dat je dat moet doen weet ik wel, en in mijn geval koppel ik RE en DE aan elkaar. Maar de software moet die wel kunnen aansturen en daar loop ik vast.
RS422 heb ik niks aan, want daar kan de andere kant niets mee. Dat doet alleen (half-duplex) RS485.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Het lijkt me "te doen".
Iets met side 10 en 01 en dan twee output bits definieren.
Edit: Ik had haast, toen ik bovenstaande schreef.
Je zult moeten uitzoeken wat je WILT. Je kan natuurlijk de huidige code volgen en dan iedere byte de boel aan en uit zetten. Dat lijkt me eerlijkgezegd, niet zo'n goed plan.
Wat ik zou doen is dus de boel iets verder "uitschrijven": Tijdens de PULL wil je dat je RE/-DE hoog hebben. Als de pull "doorloopt, DAN enable je de driver (RE/-DE laag) en ga je het startbit doen. Dat kost dus een extra instructie en waarschijnlijk een klok als je een hele serie bytes gaat sturen 1 clock dat je DE toch inactief is. Of je moet het nog ingewikkelder maken met een IF op of er data beschikbaar is.
[Bericht gewijzigd door rew op (80%)]