Buongiorno a tutti, vi scrivo per cercare di riuscire a fare qualcosa che da solo non riesco proprio. Vorrei modificare il programma a bordo di un Atmega8 che pilota un display 1602.
Il modulo display è impiegato come voltmetro, amperometro, wattmetro e termometro.
Vorrei cambiare alcune scritte sul display modificando il programma già in uso.
Quindi scaricare il programma dall'ATmega8, studiarlo, modificarlo e poi ricaricarlo.
Gli strumenti in mio possesso.
Arduino UNO R3
AVR ISP Shield
Arduino IDE su PC
Ecco, ora avrei bisogno di un "cintura nera di Arduino" con tanta pazienza che mi guidasse passo-passo sulla meta.
Premetto che sono appena entrato nel mondo dei microcontroller mentre sono un frequentatore assiduo di elettronica analogica così ,nella costruzione di un alimentatore duale, volevo usare un display 1602 e da cosa è nata cosa. E' un primo affaccio che potrebbe farmi innamorare. Vediamo.
A presto pubblicherò qualche foto per mostrarvi dove sono arrivato.
Grazie a tutti per l'attenzione.
Buongiorno, apatuel64
Benvenuto nella sezione Italiana del forum
Cortesemente, leggi attentamente QUESTO MESSAGGIO e il REGOLAMENTO di detta sezione: [REGOLAMENTO] Come usare questa sezione del forum
(... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15)
e poi, come da suddetto regolamento (punto 16.7), fai la tua presentazione IN CODA ALL'APPOSITA DISCUSSIONE (Reply): Presentazioni nuovi iscritti: fatevi conoscere da tutti! (Part 2) spiegando bene quali esperienze hai in elettronica e in programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.
Grazie
Gianluca
P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento, nessuno ti risponderà (eventuali risposte, o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto.
P.P.S.: Evitate di utilizzare la traduzione automatica fatta dal browser ... vi impedisce di capire la lingua della sezione dove andate a scrivere ...
Questo NON è possibile ... il programma all'interno del ATmega8 ormai è solo "codice binario" (codice eseguibile), risultato della compilazione e del successivo link dei "programmi sorgenti" che ha scritto colui che ha programmato il modulo.
Tu sei in possesso di detti programmi sorgenti? Riesci a recuperarli dall'autore?
Guglielmo
P.S.: Inoltre, nel caso fosse un prodotto "commerciale", quasi sicuramente la MCU sarebbe stata bloccata per evitare la copia anche dell'eseguibile ... per evitare clonazioni
Grazie Guglielmo, anche se la notizia mi ha buttato un pò giù.
Il programma sorgente mi è impossibile recuperarlo. E' un modulo acquistato, da chi me l'ha venduto, sul mercato polacco.
Sto pensando che l'unica soluzione è che mi rifaccia il programma da zero, studiando da quelli bravi. Un bella montagna da scalare per me, ma voglio riuscirci.
Intanto acquisterò qualche ATmega8 nuovo da programmare. L'originale meglio non perderlo in esperimenti.
Allego qualche foto.
Grazie e a presto.
Sì, ci vuole poco. Per prima cosa, devi vedere su quali ingressi analogici arrivano le misure della tensione e della corrente e determinare o misurare il fattore di scala. Devi anche vedere che sensore di temperatura è montato e dove è collegato. A proposito della temperatura, al posto dell'apostrofo puoi definire il carattere ° dei gradi con createChar().
l'8 e il 328P mi sembrano perfettamente compatibili... No? Comunque si tratta solo di acquistare, programmare e montare l'uno o l'altro sul circuito di cui già dispone.
Piuttosto, se non c'è il quarzo bisogna programmare i fuse per l'oscillatore interno a 8MHz, oppure aggiungerne uno.
Grazie Guglielmo, grazie Datman, qua l'asticella si sta alzando
Pensate che ero partito da due moduli LED Volt/Amp , poi ho visto il 1602 così ricco di info. Solo da aggiustare un pò: il mess di benvenuto col sito del polacco, il volere il +/- davanti i Volt (ho output duale) e gli Amp con divisioni da 0,1 e non 0,5, poi , giustamente, anche quella virgoletta per i gradi da sostituire col classico cerchietto. Mi sta bene rifare il programma su Arduino, per il microcontroller mi sta bene anche il 328, ma vorrei riuscire a salvare il PCB con la resistenza di shunt, ingresso temp ,ecc. Il sens di temperatura che sto usando è un Dallas 18B20. Fortunatamente ho lo schema dei collegamenti che vi allego. Grazie di tutto. schema_collegamenti.pdf (721,6 KB)
Allora sei a cavallo!
Certo, sono 0,1 Ohm brutalmente in serie al carico, che tolgono 100mV in uscita ogni ampere di assorbimento, ma per fare di meglio servirebbe un circuito attivo sul positivo prima della controreazione dell'alimentatore...
Se vuoi 3A di fondo scala (non so... specificalo), con 0,1Ohm sono appena 300mV, quindi ti conviene usare un riferimento esterno molto più basso dei 5V standard per l'ADC per migliorare la risoluzione. Per esempio, puoi usare un classico TL431, che puoi anche recuperare da qualsiasi alimentatore switching fuori uso, con un partitore da 2,5V a 300mV, per esempio 2k2 e 150+150Ohm. Puoi anche realizzare i 300Ohm con 270Ohm e un trimmer da 47Ohm, oppure montando una resistenza da 15-18-22-27-33-39-47 Ohm che determinerai dopo aver misurato con un multimetro digitale le resistenze da 2k2 e 270Ohm in tuo possesso.
Ah! Abbassando la tensione di riferimento a 300mV, devi anche modificare il partitore per la lettura della tensione mettendo 150 Ohm fra il punto comune R3-PR2 e la massa.
e a quel punto tanto vale usare la Vref Internal che è (circa) 1,1 Volt, e va calibrata.
Io userei piuttosto un modulo con un INA219, con una resistenza di shunt adeguata al carico, che nasce esattamente per questo scopo, e misura direttamente anche la tensione.
L'ADC dell'ATmega328P è progettato per funzionare correttamente con una tensione di riferimento che rimanga all'interno di un intervallo operativo specificato nel datasheet. Il limite inferiore è 1V per garantire che i componenti analogici interni, come il comparatore e i circuiti di campionamento, funzionino in modo stabile.
Con una Vref troppo bassa, i transistori e i circuiti analogici interni potrebbero non operare nella regione lineare desiderata, introducendo errori o instabilità.
Ci sono! Grazie a tutti per la partecipazione.
Ho deciso per ora di ricreare il programma su ATmega328P (che ho ordinato)
utilizzando il PCB e lo schema esistente come da allegato sopra. In attesa che mi arrivi il microcontrollore vergine mi stavo dilettando nella programmazione scopiazzando qua e là.
Ora ve lo mostrerei per capire se ho scritto delle ...ate.
Sono in difficoltà nella sezione >Leggi tensione, corrente, temp.
Qua ho tre ingressi analogici: ingresso voltmetro - pin 23 - con un partitore già bello e fatto, ingresso amperometro con shunt da 0,1ohm e un r2 da 1K (che non so come computare) -pin 24 - ed in fine l'ingresso del sensore temp -pin 26- . Su questi tre ingressi , nella sintassi devo inserire numeri che non so - forse l'unico che ho azzeccato sta nella lettura Volts (8,2?)
Mi servirebbe un aiutino.
Grazie
Allego nuovamente lo schema dei collegamenti ed il codice scritto schema_collegamenti.pdf (721,6 KB)
#include <LiquidCrystal.h>
// Pin per LCD
LiquidCrystal lcd(4, 5, 6, 11, 12, 13);
// Pin analogici
#define VOLT_PIN 23
#define CURRENT_PIN 24
#define TEMP_PIN 26
// 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(2000);
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) / SHUNT_RESISTOR;
// Leggi temperatura
int rawTemp = analogRead(TEMP_PIN);
float temperature = (rawTemp * 5.0 / 1023.0);
// Mostra dati su LCD
lcd.setCursor(0, 0);
lcd.print("+/-V:");
lcd.print(voltage, 1);
lcd.print("V ");
lcd.setCursor(8, 0);
lcd.print("I:");
lcd.print(current, 1);
lcd.print("A");
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.print(temperature, 1);
lcd.print("°C");
lcd.setCursor(8, 1);
lcd.print("P:");
lcd.print(voltage * current, 1);
lcd.print("W");
delay(1000);
}
8.2.1 Default Clock Source
The device is shipped with internal RC oscillator at 8.0MHz and with the fuse CKDIV8 programmed, resulting in 1.0MHz system clock.
Vergine, quindi, ha l'oscillatore interno abilitato con il divisore per 8, quindi 8/8 = 1MHz. Questa è la frequenza che devi impostare nell'IDE dopo aver installato il MiniCore aggiungendo questo indirizzo in File/Impostazioni/URL aggiuntive per il Gestore schede:
Non ho mai usato l'IDE v2. Sembra solo un avviso, ma dice che non trova i dati della eeprom...
I rettangoli neri sono statici?
Verifica che i numeri dei piedini del display nel programma corrispondano con quelli effettivi. Prova anche con il multimetro.