diff --git a/1 - Code/hl3.py b/1 - Code/hl3.py index 8fa27855cae9880a86dccd2bb550c8e3a8f68fb4..9d23fbd5c013523c699a33a557f1eb1d0483393a 100644 --- a/1 - Code/hl3.py +++ b/1 - Code/hl3.py @@ -1,5 +1,6 @@ -from machine import Pin, Uart +from machine import Pin, UART from neopixel import NeoPixel +from rp2 import PIO, StateMachine, asm_pio import utime nb_line = 8 @@ -268,33 +269,91 @@ def show_text(text, Color, speed): class Uart: - channel = None - direction = None - def __init__(self, dir, baudrate=9600, parity=None, bits=8, stop=1): + + self.direction = dir if (dir == Direction.NORTH): - self.channel = Uart(0, baudrate=baudrate, tx=Pin(12), rx=Pin(13), parity=parity, bits=bits, stop=stop) + self.channel = UART(0, baudrate=baudrate, tx=Pin(12), rx=Pin(13), parity=parity, bits=bits, stop=stop) elif (dir == Direction.SOUTH): - self.channel = Uart(1, baudrate=baudrate, tx=Pin(8), rx=Pin(9), parity=parity, bits=bits, stop=stop) + self.channel = UART(1, baudrate=baudrate, tx=Pin(8), rx=Pin(9), parity=parity, bits=bits, stop=stop) + + elif (dir == Direction.EAST): + self.tx = StateMachine(0, Uart.uart_tx, freq=8 * baudrate, sideset_base=Pin(14), out_base=Pin(14)) + self.tx.active(1) + + self.rx = StateMachine(1, Uart.uart_rx, freq=8 * baudrate, in_base= Pin(15, Pin.IN, Pin.PULL_UP), jmp_pin= Pin(15, Pin.IN, Pin.PULL_UP),) + self.rx.active(1) + elif (dir == Direction.WEST): + self.tx = StateMachine(2, Uart.uart_tx, freq=8 * baudrate, sideset_base=Pin(20), out_base=Pin(20)) + self.tx.active(1) + + self.rx = StateMachine(3, Uart.uart_rx, freq=8 * baudrate, in_base= Pin(21, Pin.IN, Pin.PULL_UP), jmp_pin= Pin(21, Pin.IN, Pin.PULL_UP),) + self.rx.active(1) + else: raise ValueError("Uart direction does not exist") - - self.direction = dir + + @asm_pio(sideset_init=PIO.OUT_HIGH, out_init=PIO.OUT_HIGH, out_shiftdir=PIO.SHIFT_RIGHT) + def uart_tx(): + # Block with TX deasserted until data available + pull() + # Initialize bit counter, assert start bit for 8 cycles + set(x, 7) .side(0) [7] + # Shift out 8 data bits, 8 execution cycles per bit + label("bitloop") + out(pins, 1) [6] + jmp(x_dec, "bitloop") + # Assert stop bit for 8 cycles total (incl 1 for pull()) + nop() .side(1) [6] + + @asm_pio(in_shiftdir=PIO.SHIFT_RIGHT,) + def uart_rx(): + # fmt: off + label("start") + # Stall until start bit is asserted + wait(0, pin, 0) + # Preload bit counter, then delay until halfway through + # the first data bit (12 cycles incl wait, set). + set(x, 7) [10] + label("bitloop") + # Shift data bit into ISR + in_(pins, 1) + # Loop 8 times, each loop iteration is 8 cycles + jmp(x_dec, "bitloop") [6] + # Check stop bit (should be high) + jmp(pin, "good_stop") + # Either a framing error or a break. Set a sticky flag + # and wait for line to return to idle state. + irq(block, 4) + wait(1, pin, 0) + # Don't push data if we didn't see good framing. + jmp("start") + # No delay before returning to start; a little slack is + # important in case the TX clock is slightly too fast. + label("good_stop") + push(block) + # fmt: on + + def pio_uart_print(sm, s): + for c in s: + sm.put(ord(c)) def send(self, data): + if self.direction == Direction.NORTH or self.direction == Direction.SOUTH: self.channel.write(data) else: - i = 0 + Uart.pio_uart_print(self.tx, data) def sendline(self, data): + if self.direction == Direction.NORTH or self.direction == Direction.SOUTH: self.channel.write(data+'\n') else: - i = 0 + Uart.pio_uart_print(self.tx, data+'\n') def receive(self, length=1): data = None @@ -305,7 +364,9 @@ class Uart: if data is None: utime.sleep(0.1) else: - i = 0 + data = "" + for i in range(length): + data += chr(self.rx.get() >> 24) return data @@ -318,9 +379,11 @@ class Uart: if data is None: utime.sleep(0.1) else: - i = 0 + data = "" + while not data.endswith("\n"): + data += chr(self.rx.get() >> 24) - return data + return data.rstrip() def christmas(): diff --git a/1 - Code/main.py b/1 - Code/main.py index 4338e9aa31fd55e655b454109d8ca9ad91bbab54..bf6848359012a6521917b44143af8694894ecf95 100644 --- a/1 - Code/main.py +++ b/1 - Code/main.py @@ -1,4 +1,14 @@ from hl3 import * +#uart_north = Uart(Direction.NORTH) +#uart_south = Uart(Direction.SOUTH) +uart_east = Uart(Direction.EAST, 9600) +#uart_west = Uart(Direction.WEST) + + while True: - christmas() + #uart_east.sendline("Pipo") + received_data = uart_east.receiveline() + #received_data = uart_north.receiveline() + print(f"Data received: {received_data}") + #utime.sleep(0.1) diff --git a/2 - Reports/Michael_Divia.md b/2 - Reports/Michael_Divia.md index 0b575ecf3c4c9d2c2f371909691a22ed76fdaa7f..f0c893faa234dae975e7a2c46673915713116e5b 100644 --- a/2 - Reports/Michael_Divia.md +++ b/2 - Reports/Michael_Divia.md @@ -49,13 +49,13 @@ J'ai aussi profité d'implémenter toute les couleurs que nous devions implémen J'ai ensuite créer un fonction de démo `christmas` afin de démontré le bon fonctionnement des LEDs. Cette fonction est une ré-implémentation de la fonction de M. Gluck que vous pouvez trouver [ici](https://gitedu.hesge.ch/cores/projects/hepialight2/hepialight2-examples/-/blob/02261b68aad94dd52c6b35fdb83ed1d54028061b/peripherals/display/christmas_ball.py). -Suite à cela nous avons, à l'aide de M. Escribano, à implémenter les fonction `UART` suivante : `send`, `snedline`, `receive` et `receiveline` et nous avons commencé à les tester entre 2 cartes mais nous avons eux quelque problème, nous allons donc devoir continuer à investiguer cela demain. +Suite à cela nous avons, avec l'aide de M. Escribano, à implémenter les fonction `UART` suivante : `send`, `snedline`, `receive` et `receiveline` et nous avons commencé à les tester entre 2 cartes mais nous avons eux quelque problème, nous allons donc devoir continuer à investiguer cela demain. ## Mercredi, 19 Juin 2024 -A l'aide de M. Escribano nous avons finalisé la correction des fonctions `receive` et `receiveline` afin de pouvoir communiqué en `UART` entre 2 cartes en utilisant les ports prévu à cet effet sur les RPI Pico (`NORTH` et `SOUTH` dans notre code). +Avec l'aide de M. Escribano nous avons finalisé la correction des fonctions `receive` et `receiveline` afin de pouvoir communiqué en `UART` entre 2 cartes en utilisant les ports prévu à cet effet sur les RPI Pico (`NORTH` et `SOUTH` dans notre code). -Nous avons ensuite enchaîner avec la communication `UART` via les `GPIO`. +Nous avons ensuite enchaîné avec la communication `UART` via les `GPIO`, pour cela nous avons utilisé `rp2 PIO`. Nous avons donc adapté tout les fonctions crées précédemment afin de fonctionner avec ces derniers. # Creators