// LCD1602 and Pi Pico!
#ifndef RAMEND
#define RAMEND SRAM_END
#define RAM_INI 0x20000000
#define ADDR_LEN uint32_t
#define RAM_BYTE (RAMEND-RAM_INI)
#else
#define RAM_INI 0x100
#define ADDR_LEN uint16_t
#define RAM_BYTE (RAMEND-RAM_INI)
#endif
#include "US.h"
#include <LiquidCrystal.h>
USPing usPing;
pico_unique_board_id_t pico_id;
#define PICO_IDS_LEN (2 * PICO_UNIQUE_BOARD_ID_SIZE_BYTES + 1)
char pico_ids[PICO_IDS_LEN];
#define TRIGGER_PIN 27
#define ECHO_PIN 22
char allZero[10]; // contiene 0 0 0 0 0 0 0 0 0
// const char *inFlash o char *inFlash finisce
// sempre nella memoria flash.
char *inFlash = "Hello pico!";
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
// SRAM_END vale 0x20042000 per pi-pico 2040
//#define RAMEND SRAM_END
// dichiarata così finisce in FLASH e Serial.println(inFlash);
// lavora perfettamente.
// dichiarata così finisce in RAM
char inRam[] = "Hello pico!";
const char inFlash1[] = "Hello pico!";
char hp[] = { 0x48, 0x65, 0x6c, 0x6c
, 0x6f, 0x20, 0x70, 0x69
, 0x63, 0x6f, 0x21, 0x00
};
// 6c6c6548 6970206f 00216f63
void showRam() {
// spazzoliamo tutta la ram cella per cella.
// come da datasheet inizio da 0x20000000
const char *ptrToRam = (char*)RAM_INI;
// mi servono 16 caselle da 0÷15
uint8_t counter15 = 15;
Serial.print("addr\t\t0123456789ABCDEF");
// Nota per pi-pico 2040 RAMEND vale 0x20042000
for (uint16_t t=0; t<=RAM_BYTE; t++) {
if (counter15 == 15) {
Serial.print("\n");
// su pi-pico un indirizzo e di 32-bit
Serial.print((ADDR_LEN)ptrToRam, HEX);
Serial.print("\t");
}
if ((counter15 > -1) && (counter15 < 16)) {
// vogliamo vedere i caratteri quindi
// dal puntatore con * otteniamo il puntato
// e poi il cast a char
char b = (char)*ptrToRam++;
// se b non è rappresentabile
// stampo il punto ".".
if ((b < 32) || (b > 126)) {
Serial.print(".");
} else {
Serial.print(b);
}
}
counter15--;
counter15 = counter15 % 30;
}
Serial.println();
}
char sprintBuff[17];
void rxEcho() {
usPing.rxEcho();
}
void setup() {
Serial.begin(115200);
lcd.begin(16, 2);
pinMode(LED_BUILTIN, OUTPUT);
usPing.begin(ECHO_PIN, TRIGGER_PIN);
//usPing.setTriggerInterval(15);
//pinMode(27, OUTPUT);
//digitalWrite(LED_BUILTIN, HIGH);
//Serial.println(LED_BUILTIN);
attachInterrupt(22, rxEcho, CHANGE);
//digitalWrite(27, HIGH);
//delayMicroseconds(10);
//digitalWrite(27, LOW);
pico_get_unique_board_id_string (pico_ids, PICO_IDS_LEN);
Serial.println(pico_ids);
//lcd.print("Hello World!");
//Serial.println(SYS_CLK_MHZ);
// il puntatore >inFlash< è in ram (0x20000F40)
Serial.println((uint32_t)&inFlash, HEX);
Serial.println(hp);
pico_unique_board_id_t pico_id;
pico_get_unique_board_id (&pico_id);
for (byte i = 0; i<8; i++)
Serial.print(pico_id.id[i]);
//Serial.println(sizeof (pico_unique_board_id_t));
//sprintf(pico_ids, "%llu", (uint64_t)pico_id);
sprintBuff[ 17 - 1 ] = '\0';
float fnum = 2;
sprintf(sprintBuff, "%#4.2f", fnum);
lcd.setCursor(0, 0);
lcd.print(sprintBuff);
delay(1000);
Serial.println(PICO_UNIQUE_BOARD_ID_SIZE_BYTES);
for (int i = 0; i < 10; i++) {
Serial.print((uint8_t)allZero[i]);
Serial.print(" ");
}
Serial.println();
delay(1000);
lcd.setCursor(2, 1);
//lcd.print("> Pi Pico <");
lcd.print(SRAM_END, HEX);
Serial.print("SRAM START:\t");
Serial.println(RAM_INI, HEX);
Serial.print("SRAM END:\t");
Serial.println(SRAM_END, HEX);
//showRam();
//Serial.println((char*)0x1000DAAD);
Serial.print(inFlash);
Serial.print(" in flash all'indirizzo: ");
Serial.println((uint32_t)inFlash, HEX);
Serial.print(inRam);
Serial.print(" in ram all'indirizzo: ");
Serial.println((uint32_t)inRam, HEX);
Serial.print(inFlash1);
Serial.print(" in flash all'indirizzo: ");
Serial.println((uint32_t)inFlash1, HEX);
//Serial.println(inRam);
//Serial.println((char*)0x200012FC);
//Serial.println((uint32_t)PSM_BASE, HEX);
//showRam();
}
void loop() {
usPing.trigger();
uint32_t echoTime = usPing.getEchoTime();
if (echoTime) {
//Serial.print("echoTime = ");
Serial.print(echoTime);
Serial.print('\t');
Serial.println(usPing.usToCm(echoTime));
}
delay(1); // Adding a delay() here speeds up the simulation
}