Grazie Datman,
i rettangoli sono fissi. Ho controllato la corrispondenza dei piedini display verso il programma e verso il pcb (col multimetro tra piedini display e zoccolo microcontroller) : tutto bene , purtroppo. C'è altro forse nel programma o come lo carico. Sei hai qualche idea , sono pronto ad eseguire.
Aggiungo che togliendo l'ATmega dal modulo display ottengo la stessa visualizzazione , 16 rettangoli neri. Deduco quindi che tra il display e il microc non c'è comunicazione.
Grazie ancora
Andrea
Che ATmega328P hai acquistato? E' vergine o con bootloader e fuse per Arduino?
Quindi è vergine.
Se installi l'IDE 1.8.x posso seguirti meglio.
Ricontrolla bene i collegamenti per la programmazione.
Anziché quella scheda, però, sarebbe stato meglio se avessi acquistato un USBASP, che uso normalmente io, o un Pololu, usato consigliato abitualmente da Guglielmo. Certo, però, in questo caso sullo stampato non è montato un connettore 2x3 per la programmazione ISP, perciò devi programmare il microcontrollore esternamente... Per usare un programmatore ISP dovresti aggiungere il connettore e bisogna verificare che il circuito non interferisca con la programmazione.
...Ma davvero il Reset, il pin 1, non è collegato???... Se viene lasciato scollegato, il microcontrollore si può bloccare in qualsiasi momento! Ci devi mettere 10k verso +5V.
Lo cerco e lo installo.
Se mi passi un collegamento la compro.
Pensavo fosse perfetta questa AVR ISP shield. Lo strumento adatto a programmare un microc esterno, senza fili e collegamenti sbagliabili.
Ma sono qua per imparare.
Per il reset, sul modulo display, non c'è in effetti ma l'ATmega8 montato e funzionante non ha problemi.
Metti immediatamente 10k fra il reset e +5V, poi andiamo avanti!
Ho controllato lo schema: i piedini che si usano per la programmazione ISP sono liberi (anche troppo: manca la 10k sul reset!).
Emmm ,,, non esattamnete ... "consigliato" abitualmente da me per l'ottimo rapporto prezzo/prestazioni, la qualità e la semplicità d'uso ... io abitualmente, per gli AVR, utilizzo il Atmel AVRISP MKII:
... possiedo comunque una "collezione" di programmatori, per un'infinità di MCU
Guglielmo
L'USBASP lo trovi a poco più di 4€ da Aliexpress, completo dell'adattatore da 10pin a 6pin:
https://it.aliexpress.com/item/1005007987591843.html
L'adattatore serve per portare i segnali sulla piattina a 10 poli, alternando poli di massa ai segnali, e poi usare un connettore con solo i 6 poli che servono. Nonostante ciò, non sono riuscito a usare una piattina più lunga di quella in dotazione. Probabilmente una più lunga funzionerebbe abbassando la velocità di programmazione, ma in caso di necessità è più pratico usare una prolunga USB.
Io lo acquistai con un guscio di plastica verde trasparente, utile per non fare cortocircuiti se hai roba intorno. Dovresti trovarlo come opzione aggiuntiva. Questo, per esempio, ma non è chiaro se vendono tutto o solo il guscio...
USBASP ISP AVR Programmer Adapter Protection Case ATMEGA8 ATMEGA128 A2TF | eBay?
Il Pololu costa un po' di più:
Non l'ho mai usato, perciò non so dirti che vantaggi porti rispetto all'USBASP.
Montata res da 10K tra +5v e pin 1 del microc.
Purtroppo non è cambiato nulla sulla visualizzazione.
Prossimo passo sarà attrezzarmi con altri strumenti di programmazione da voi consigliati.
Datman una domanda ma con l'USBASP non ho ben capito cosa si collega a cosa e soprattutto dove metto l'Atmega da programmare.
Grazie
Andrea
Stai sbagliando la definizione dei pin nello sketch Arduino.
Non devi mettere il numero del pin fisico del microcontrollore, ma a cosa corrisponde nel framework Arduino la porta utilizzata.
Display -> Porta 328 -> numerazione pin Arduino
RS -> PD2 -> 2
EN -> PD3 -> 3
D4 -> PD4 -> 4
D5 -> PD5 -> 5
D6 -> PD6 -> 6
D7 -> PD7 -> 7
E' vero! Fino al 13 erano possibili...
Correggi e funzionerà immediatamente.
Non ho capito però se @apatuel64 ha modificato i fuses per abilitare l'oscillatore interno come gli avevi già consigliato.
Forse sarebbe una buona idea aggiungere un piccolo led da far lampeggiare per capire se il programma sta girando correttamente prima di andare oltre.
Ha acquistato un microcontrollore vergine da RS (post #23), quindi ha i fuse di fabbrica con abilitati l'oscillatore interno e il DIV8.
Signori funzionaaa!
Non ho capito niente sulla numerazione dei pin display da riportare nello sketch, ma studierò. Per ora sto gongolando. Graziee!
Ho qualche problema di lettura Temp e Amp. Devo aver sbagliato qualcosa nei dati inseriti nel programma.
Nei settaggi Tool ho "clock internal:1MHz"
Ora devo far funzionare la lettura sullo shunt ed il sens dallas. La lettura Volts è OK e pure le scritte di avvio.
Poi, ciliegina sulla torta, voglio costruire i simboli +/- e ° . In teoria li ho già fatti ma non so come inserirli nel programma
Codice ultimo:
#include <LiquidCrystal.h>
// Pin per LCD
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
// Pin analogici
#define VOLT_PIN A0
#define CURRENT_PIN A1
#define TEMP_PIN A3
// Costanti
const float SHUNT_RESISTOR = 0.1; // Resistenza dello shunt in ohm
const float VOLTAGE_DIVIDER_RATIO = 8.2; // Rapporto del partitore di tensione
void setup() {
// Inizializza LCD
lcd.begin(16, 2);
lcd.setCursor(5, 0);
lcd.print("PATUELLI");
lcd.setCursor(0, 1);
lcd.print("DUAL PowerSupply");
// Messaggio di avvio
delay(3000);
lcd.clear();
}
void loop() {
// Leggi tensione
int rawVoltage = analogRead(VOLT_PIN);
float voltage = (rawVoltage * 5.0 / 1023.0) * VOLTAGE_DIVIDER_RATIO;
// Leggi corrente
int rawCurrent = analogRead(CURRENT_PIN);
float current = (rawCurrent * 5.0 / 1023.0);
// Leggi temperatura
int rawTemp = analogRead(TEMP_PIN);
float temperature = (rawTemp * 5.0 / 1023.0);
// Mostra dati su LCD
lcd.setCursor(0, 0);
lcd.print("+/-");
lcd.print(voltage, 2);
lcd.print("V ");
lcd.setCursor(11, 0);
lcd.print(current, 2);
lcd.print("A");
lcd.setCursor(3, 1);
lcd.print(voltage * current, 2);
lcd.print("W");
lcd.setCursor(11, 1);
lcd.print(temperature, 1);
lcd.print("'C");
delay(1000);
}
Questa la grafica del "più e meno"
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
byte piumeno[8] = {
B00100,
B00100,
B11111,
B00100,
B00100,
B00000,
B11111,
};
void setup() {
lcd.createChar(0, piumeno);
lcd.begin(16, 2);
lcd.write(byte(0));
}
void loop() {}
Questa la grafica del ° per i gradi C
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
byte grado[8] = {
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
};
void setup() {
lcd.createChar(0, grado);
lcd.begin(16, 2);
lcd.write(byte(0));
}
void loop() {}
Grazie Cotestatnt, grazie Datman
Evviva!
.
Sì, è corretto. Dopo aver usato il carattere 1 per i gradi anziché il carattere 0, devi solo mettere lcd.write(byte(0));
per piumeno e lcd.write(byte(1));
per i gradi tra gli lcd.print.
byte piumeno[8] = {
B00100,
B00100,
B11111,
B00100,
B00100,
B00000,
B11111,
};
byte grado[8] = {
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
};
void setup() {
lcd.createChar(0, piumeno);
lcd.createChar(1, grado);
lcd.begin(16, 2);
}
Nel loop, dove occorre, scrivi una cosa simile:
lcd.write(byte(0)); lcd.print("abcd"); lcd.write(byte(1));
Datman riesci ad inserirlo nel mio programma? Anche solo nella parte del mio programma dove si infilano queste info. Perchè non so a che altezza raccontargli tutte ste cose.
Grazie
Togli lcd.print("+/-");
e metti:
lcd.write (0)); // Scrive il carattere piumeno.
byte piumeno[8] e byte grado[8] vanno all'inizio, insieme alla dichiarazione delle variabili, fuori da tutte le funzioni; le due righe lcd.createChar vanno nel setup.
Anche il carattere del grado è già presente tra i caratteri mappati nel controller del display. Non c'è bisogno di crearlo da zero (a meno che non sia un'esigenza di natura estetica)..
La seguente istruzione ad esempio, dovrebbe produrre come output la stringa °C
lcd.print( " \xDF" "C");
La stringa \xDF
rappresenta il valore esadecimale 0xDF che corrisponde al decimale 223. E' necessario dividere la stringa in due pezzi perché altrimenti il compilatore non sarebbe in grado di distinguere tra 0xDF e 0xDFC che è comunque un numero esadecimale valido.
Se vuoi stampare solo il simbolo del grado senza concatenare altro basterebbe anche un semplice
lcd.write(223);
L'elenco completo dei caratteri lo trovi nel datasheet del controller HD44780