I just wanted to give a brief update: Power cycling the USRP seems to have 
fixed the issue. Too bad it took me days to do this...
So there is indeed a bug on the FPGA where some state was not reset properly.

> Gesendet: Dienstag, 10. März 2020 um 11:20 Uhr
> Von: "Lukas Haase" <[email protected]>
> An: "USRP-userslists.ettus.com" <[email protected]>
> Betreff: X310+UBX160 RX DSP tuning bug: First (or second) timed command 
> ignored? Non-zero state after start?
>
> Hi,
> 
> I am struggling with setting DSP freq of RX with timed command for over a 
> week and I am just out of ideas.
> It would be amazing if someone could try out my minimal testable gnuradio app 
> below and confirm that there's an issue in the first place (and maybe any 
> idea what the issue is)
> 
> Code below uses a loopback config with 30dB attenuation from RX/TX of first 
> UBX160 to RX2 of second UBX160:
> 1. Creates a static signal generator with 901 MHz (fcenter=900MHz, fif=1MHz). 
> Could be replaced with an external signal source (I have none)
> 2. Spectrum of RX2. A click on "Switch" toggles between fdsp=0 and fdsp=500e3 
> while keeping frf. A click shows which fdsp is selected and the tuning result 
> in the console.
> 3. The toggling is performed with class "blk" using timed commands
> 
> Here is what happens:
> 1.) On first retune (to fdsp=-500e3), the frequency jumps to 0.5 MHz, as 
> expected
> 2.) On the second retune (to fdsp=0), NOTHING happens!
> 3.) From then on, the frequency toggles on each click (but it's out of order 
> because one command was dropped!)
> 
> Note that if I remove the timed command (remove set_command_time), everything 
> works as expected.
> 
> It seems the first or second timed command for RX is always ignored.
> 
> There is even a more weird part: When I add a reset button which switches to 
> fdsp=0, when I restart the flow graph, it may still jump to 0.5MHz, depending 
> on the previous (!) run. It seems that the "state" of the USRP somehow holds 
> a state of a previous run which is not properly reset.
> 
> 
> Any help or guidance would be greatly appreciated!
> 
> Best,
> Lukas
> 
> PS: uhd v3.15.0.0, gnuradio v3.7.14.0
> 
> Code is here https://paste.ubuntu.com/p/RtK6PFs4nW/ but to be self-contained 
> it's also below:
> 
> #!/usr/bin/env python2
> # -*- coding: utf-8 -*-
> 
> if __name__ == '__main__':
>     import ctypes
>     import sys
>     if sys.platform.startswith('linux'):
>         try:
>             x11 = ctypes.cdll.LoadLibrary('libX11.so')
>             x11.XInitThreads()
>         except:
>             print "Warning: failed to XInitThreads()"
> 
> from PyQt4 import Qt
> from gnuradio import analog
> from gnuradio import eng_notation
> from gnuradio import gr
> from gnuradio import qtgui
> from gnuradio import uhd
> from gnuradio.eng_option import eng_option
> from gnuradio.filter import firdes
> from optparse import OptionParser
> import sip
> import sys
> import threading
> import time
> from gnuradio import qtgui
> 
> import numpy as np
> from gnuradio import gr
> from gnuradio import uhd
> 
> class blk(gr.sync_block):
>     def __init__(self):
>         gr.sync_block.__init__(self, name='Buttons Callback', in_sig=None, 
> out_sig=None)
> 
>         self.last_state1 = False
>         self.dsp_freqs = [ 500e3, 0 ]
>         self.last_freq1 = 0
> 
>     def buttons_callback(self, state1, usrp_source, usrp_sink):
>         if state1 is not self.last_state1 and state1 == True:
>             self.button_rx_handler(usrp_source, usrp_sink)
>         self.last_state1 = state1
> 
>     def button_rx_handler(self, usrp_source, usrp_sink):
>         dsp_freq = self.dsp_freqs[self.last_freq1]
>         self.last_freq1 = (self.last_freq1 + 1) % len(self.dsp_freqs)
>         print("Clicked 2: Switching RX fdsp=" + str(dsp_freq))
>         tune_req_rx = uhd.tune_request()
>         tune_req_rx.rf_freq_policy = uhd.tune_request.POLICY_NONE
>         tune_req_rx.dsp_freq_policy = uhd.tune_request.POLICY_MANUAL
>         tune_req_rx.dsp_freq = -dsp_freq
>         now = usrp_source.get_time_now()
>         usrp_source.set_command_time(now + uhd.time_spec(1))
>         res1 = usrp_source.set_center_freq(  tune_req_rx)
>         usrp_source.clear_command_time()
>         print res1
> 
>     def work(self, input_items, output_items):
>         output_items[0][:] = input_items[0]
>         return len(output_items[0])
> 
> 
> 
> class switch_on_click_debug_rx_retune(gr.top_block, Qt.QWidget):
> 
>     def __init__(self):
>         gr.top_block.__init__(self, "Switch On Click Debug Rx Retune")
>         Qt.QWidget.__init__(self)
>         self.setWindowTitle("Switch On Click Debug Rx Retune")
>         qtgui.util.check_set_qss()
>         try:
>             self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
>         except:
>             pass
>         self.top_scroll_layout = Qt.QVBoxLayout()
>         self.setLayout(self.top_scroll_layout)
>         self.top_scroll = Qt.QScrollArea()
>         self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
>         self.top_scroll_layout.addWidget(self.top_scroll)
>         self.top_scroll.setWidgetResizable(True)
>         self.top_widget = Qt.QWidget()
>         self.top_scroll.setWidget(self.top_widget)
>         self.top_layout = Qt.QVBoxLayout(self.top_widget)
>         self.top_grid_layout = Qt.QGridLayout()
>         self.top_layout.addLayout(self.top_grid_layout)
> 
>         self.settings = Qt.QSettings("GNU Radio", 
> "switch_on_click_debug_rx_retune")
>         self.restoreGeometry(self.settings.value("geometry").toByteArray())
> 
> 
>         ##################################################
>         # Variables
>         ##################################################
>         self.variable_qtgui_push_button_0 = variable_qtgui_push_button_0 = 
> False
>         self.variable_function_probe_1_0 = variable_function_probe_1_0 = 0
>         self.samp_rate = samp_rate = 5e6
> 
>         ##################################################
>         # Blocks
>         ##################################################
>         _variable_qtgui_push_button_0_push_button = Qt.QPushButton('Switch')
>         self._variable_qtgui_push_button_0_choices = {'Pressed': True, 
> 'Released': False}
>         _variable_qtgui_push_button_0_push_button.pressed.connect(lambda: 
> self.set_variable_qtgui_push_button_0(self._variable_qtgui_push_button_0_choices['Pressed']))
>         _variable_qtgui_push_button_0_push_button.released.connect(lambda: 
> self.set_variable_qtgui_push_button_0(self._variable_qtgui_push_button_0_choices['Released']))
>         
> self.top_grid_layout.addWidget(_variable_qtgui_push_button_0_push_button)
>         self.uhd_usrp_source_0 = uhd.usrp_source(
>                 ",".join(("", "dboard_clock_rate=20e6")),
>                 uhd.stream_args(
>                         cpu_format="fc32",
>                         channels=range(1),
>                 ),
>         )
> 
>         self.uhd_usrp_source_0.set_clock_rate(200e6, uhd.ALL_MBOARDS)
>         self.uhd_usrp_source_0.set_clock_source('internal', 0)
>         self.uhd_usrp_source_0.set_subdev_spec('B:0', 0)
>         self.uhd_usrp_source_0.set_samp_rate(samp_rate)
>         self.uhd_usrp_source_0.set_time_unknown_pps(uhd.time_spec())
>         self.uhd_usrp_source_0.set_center_freq(900e6, 0)
>         self.uhd_usrp_source_0.set_gain(0, 0)
>         self.uhd_usrp_source_0.set_antenna('RX2', 0)
>         self.uhd_usrp_source_0.set_auto_dc_offset(True, 0)
>         self.uhd_usrp_source_0.set_auto_iq_balance(True, 0)
>         self.uhd_usrp_sink_0 = uhd.usrp_sink(
>                 ",".join(("", "dboard_clock_rate=20e6")),
>                 uhd.stream_args(
>                         cpu_format="fc32",
>                         channels=range(1),
>                 ),
>         )
>         self.uhd_usrp_sink_0.set_clock_rate(200e6, uhd.ALL_MBOARDS)
>         self.uhd_usrp_sink_0.set_clock_source('internal', 0)
>         self.uhd_usrp_sink_0.set_subdev_spec('A:0', 0)
>         self.uhd_usrp_sink_0.set_samp_rate(samp_rate)
>         self.uhd_usrp_sink_0.set_time_unknown_pps(uhd.time_spec())
>         self.uhd_usrp_sink_0.set_center_freq(900e6, 0)
>         self.uhd_usrp_sink_0.set_gain(0, 0)
>         self.uhd_usrp_sink_0.set_antenna('TX/RX', 0)
>         self.epy_block_1 = blk()
> 
>         def _variable_function_probe_1_0_probe():
>             while True:
>                 val = 
> self.epy_block_1.buttons_callback(self.variable_qtgui_push_button_0, 
> self.uhd_usrp_source_0, self.uhd_usrp_sink_0)
>                 try:
>                     self.set_variable_function_probe_1_0(val)
>                 except AttributeError:
>                     pass
>                 time.sleep(1.0 / (10))
>         _variable_function_probe_1_0_thread = 
> threading.Thread(target=_variable_function_probe_1_0_probe)
>         _variable_function_probe_1_0_thread.daemon = True
>         _variable_function_probe_1_0_thread.start()
> 
>         self.qtgui_freq_sink_x_0 = qtgui.freq_sink_c(
>                 1024, #size
>                 firdes.WIN_BLACKMAN_hARRIS, #wintype
>                 0, #fc
>                 samp_rate, #bw
>                 "", #name
>                 1 #number of inputs
>         )
>         self.qtgui_freq_sink_x_0.set_update_time(0.10)
>         self.qtgui_freq_sink_x_0.set_y_axis(-140, 10)
>         self.qtgui_freq_sink_x_0.set_y_label('Relative Gain', 'dB')
>         self.qtgui_freq_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 
> 0, "")
>         self.qtgui_freq_sink_x_0.enable_autoscale(True)
>         self.qtgui_freq_sink_x_0.enable_grid(True)
>         self.qtgui_freq_sink_x_0.set_fft_average(1.0)
>         self.qtgui_freq_sink_x_0.enable_axis_labels(True)
>         self.qtgui_freq_sink_x_0.enable_control_panel(True)
> 
>         if not True:
>           self.qtgui_freq_sink_x_0.disable_legend()
> 
>         if "complex" == "float" or "complex" == "msg_float":
>           self.qtgui_freq_sink_x_0.set_plot_pos_half(not True)
> 
>         labels = ['', '', '', '', '',
>                   '', '', '', '', '']
>         widths = [1, 1, 1, 1, 1,
>                   1, 1, 1, 1, 1]
>         colors = ["blue", "red", "green", "black", "cyan",
>                   "magenta", "yellow", "dark red", "dark green", "dark blue"]
>         alphas = [1.0, 1.0, 1.0, 1.0, 1.0,
>                   1.0, 1.0, 1.0, 1.0, 1.0]
>         for i in xrange(1):
>             if len(labels[i]) == 0:
>                 self.qtgui_freq_sink_x_0.set_line_label(i, "Data 
> {0}".format(i))
>             else:
>                 self.qtgui_freq_sink_x_0.set_line_label(i, labels[i])
>             self.qtgui_freq_sink_x_0.set_line_width(i, widths[i])
>             self.qtgui_freq_sink_x_0.set_line_color(i, colors[i])
>             self.qtgui_freq_sink_x_0.set_line_alpha(i, alphas[i])
> 
>         self._qtgui_freq_sink_x_0_win = 
> sip.wrapinstance(self.qtgui_freq_sink_x_0.pyqwidget(), Qt.QWidget)
>         self.top_grid_layout.addWidget(self._qtgui_freq_sink_x_0_win)
>         self.analog_sig_source_x_1 = analog.sig_source_c(samp_rate, 
> analog.GR_COS_WAVE, 1e6, 1, 0)
> 
>         ##################################################
>         # Connections
>         ##################################################
>         self.connect((self.analog_sig_source_x_1, 0), (self.uhd_usrp_sink_0, 
> 0))
>         self.connect((self.uhd_usrp_source_0, 0), (self.qtgui_freq_sink_x_0, 
> 0))
> 
>     def closeEvent(self, event):
>         self.settings = Qt.QSettings("GNU Radio", 
> "switch_on_click_debug_rx_retune")
>         self.settings.setValue("geometry", self.saveGeometry())
>         event.accept()
> 
>     def get_variable_qtgui_push_button_0(self):
>         return self.variable_qtgui_push_button_0
> 
>     def set_variable_qtgui_push_button_0(self, variable_qtgui_push_button_0):
>         self.variable_qtgui_push_button_0 = variable_qtgui_push_button_0
> 
> def main(top_block_cls=switch_on_click_debug_rx_retune, options=None):
> 
>     from distutils.version import StrictVersion
>     if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"):
>         style = gr.prefs().get_string('qtgui', 'style', 'raster')
>         Qt.QApplication.setGraphicsSystem(style)
>     qapp = Qt.QApplication(sys.argv)
> 
>     tb = top_block_cls()
>     tb.start()
>     tb.show()
> 
>     def quitting():
>         tb.stop()
>         tb.wait()
>     qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting)
>     qapp.exec_()
> 
> if __name__ == '__main__':
>     main()
> 
> 
>

_______________________________________________
USRP-users mailing list
[email protected]
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Reply via email to