I2C Display och Arduino
Re: I2C Display och Arduino
Ja å det såg inte jag.
Det ska väl finnas editorer för tecken som ger C-koden.
Men hur det går till praktiskt har jag aldrig utfört, möjligtvis när jag höll på med 68000
och Amiga. Vi konstruerade ett pcb att sticka in i porten baktill på Amigan och sedan
höll jag kurs i hur vi skulle skriva tecken till en ansluten LCD. Det hela utfördes i assembler
med hjälp av Dev-Pac. Förmodligen ett sådan där HD-chip från Hitachi.
Det ska väl finnas editorer för tecken som ger C-koden.
Men hur det går till praktiskt har jag aldrig utfört, möjligtvis när jag höll på med 68000
och Amiga. Vi konstruerade ett pcb att sticka in i porten baktill på Amigan och sedan
höll jag kurs i hur vi skulle skriva tecken till en ansluten LCD. Det hela utfördes i assembler
med hjälp av Dev-Pac. Förmodligen ett sådan där HD-chip från Hitachi.
Re: I2C Display och Arduino
Nu när jag läst på om FTDI så finns en del kul projekt bland annat att
köra SPI och till exempel styra en "LED-modul 7-segment 8 siffror seriell"
typ https://www.electrokit.com/produkt/led- ... r-seriell/,
eller till exempel en AD9850.
https://github.com/swharden/AVR-project ... /readme.md
https://swharden.com/blog/2018-06-03-bi ... i-devices/
köra SPI och till exempel styra en "LED-modul 7-segment 8 siffror seriell"
typ https://www.electrokit.com/produkt/led- ... r-seriell/,
eller till exempel en AD9850.
https://github.com/swharden/AVR-project ... /readme.md
https://swharden.com/blog/2018-06-03-bi ... i-devices/
Re: I2C Display och Arduino
Då ser jag nu varför det blir olika tecken,
då engelska pund-tecknet knappas in på datorn (från min bild på sidan 1)
fås ett bakvänt "L" på LCD:n.
Adressen 1010 0011 har olika tecken på 1602 och HD.
Betyder det att HD-kretsen anses som mer standard?
då engelska pund-tecknet knappas in på datorn (från min bild på sidan 1)
fås ett bakvänt "L" på LCD:n.
Adressen 1010 0011 har olika tecken på 1602 och HD.
Betyder det att HD-kretsen anses som mer standard?
Re: I2C Display och Arduino
Laddar jag hem och installerar drivrutiner för min FTDI-adapter fås 2 drivrutiner.
Windows plockar VCP-drivrutinen och sammanbinder den med en inställbar port i enhetshanteraren.
Avmarkeras VCP så kommer fortfarande D2XX.drivrutinen att vara i funktion och då den enda som finna om jag förstår det hela riktigt.
"FTDI provides DLL and virtual COM port (VCP) application interfaces to its drivers."
Så jag håller på med att koda ett program för att ta reda på mer och som kanske mynnar ut i något användbart.
Som synes fås -1 som resultat när ansluten COM-port skrivs ut då VCP är inaktiverad.
D2XX är typ en direktkontakt med chippet på något sätt.
https://www.ftdichip.com/Support/Docume ... 00071).pdf
Och här är java-programmet....
GUI
Koden som utför uppkoppling och utskrift...
och så trådkontrollern...
Windows plockar VCP-drivrutinen och sammanbinder den med en inställbar port i enhetshanteraren.
Avmarkeras VCP så kommer fortfarande D2XX.drivrutinen att vara i funktion och då den enda som finna om jag förstår det hela riktigt.
"FTDI provides DLL and virtual COM port (VCP) application interfaces to its drivers."
Så jag håller på med att koda ett program för att ta reda på mer och som kanske mynnar ut i något användbart.
Som synes fås -1 som resultat när ansluten COM-port skrivs ut då VCP är inaktiverad.
D2XX är typ en direktkontakt med chippet på något sätt.
https://www.ftdichip.com/Support/Docume ... 00071).pdf
Och här är java-programmet....
GUI
Kod: Markera allt
package start;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import d2xx.D2XX;
import net.sf.yad2xx.FTDIException;
import java.awt.Font;
import java.awt.Color;
import javax.swing.border.BevelBorder;
import threadController.ThreadController;
import javax.swing.JTextArea;
import java.awt.Dimension;
public class D2XXGUI {
private static final int NUMBEROFTHREADS = 1; // Antalet objekt som ska köras som en tråd
private JFrame frmDxxFtrSoftware;
private JPanel panel;
private JButton btnExitButton;
private JButton btnCloseDxxDevice;
private JButton btnOpenDxxDevice;
private Object tc0 = null; // objekt som ska köras av trådkontrollern
private static ThreadController[] threadController; // varje tråd har en trådkontroller
private static Thread[] threadControllerThread; // varje trådkontroller körs som en tråd
private static JTextArea textArea_0;
private JButton btnStart;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
D2XXGUI window = new D2XXGUI(); // Ett fönsterbaserat GUI
window.frmDxxFtrSoftware.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
* @throws InterruptedException
*/
public D2XXGUI() throws InterruptedException {
initialize(); // Konstruera GUI
setUpThreadControllers();
}
private void setUpThreadControllers() {
tc0 = new D2XX(); // skapa ett objekt
threadController = new ThreadController[D2XXGUI.NUMBEROFTHREADS]; // skapa en array att hålla ett antal trådkontroller
threadControllerThread = new Thread[D2XXGUI.NUMBEROFTHREADS]; // skapa en array som håller ett antal trådar
threadController[0] = new ThreadController(tc0); // skapa en trådkontrollerobjekt för objektet EchoD2xx
// threadControllerThread[0] = new Thread (threadController[0]); // skapa en tråd av varje trådkontroller
// threadControllerThread[0] håller nu en tråd av en trådkontroller som ännu inte startats
}
/*
* Tar emot text att addera till en textarea
*/
public static void addTextTA(String text) {
textArea_0.append(text + "\n");
}
/*
* Tömmer textarean på innehåll
*/
public static void eraseTextFromTextArea() {
textArea_0.setText(null);
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frmDxxFtrSoftware = new JFrame();
frmDxxFtrSoftware.setMaximumSize(new Dimension(800, 600));
frmDxxFtrSoftware.setFont(new Font("BankGothic Md BT", Font.BOLD, 12));
frmDxxFtrSoftware.setTitle("D2XX FT232R SOFTWARE");
frmDxxFtrSoftware.setResizable(false);
frmDxxFtrSoftware.setBackground(new Color(0, 0, 0));
frmDxxFtrSoftware.getContentPane().setBackground(new Color(0, 0, 0));
frmDxxFtrSoftware.getContentPane().setForeground(new Color(254, 254, 0));
frmDxxFtrSoftware.setBounds(100, 100, 707, 545);
frmDxxFtrSoftware.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmDxxFtrSoftware.getContentPane().setLayout(null);
panel = new JPanel();
panel.setBackground(new Color(47, 79, 79));
panel.setBounds(10, 415, 671, 79);
panel.setLayout(null);
frmDxxFtrSoftware.getContentPane().add(panel);
//====================================================================================================== START-knapp
btnStart = new JButton("START");
btnStart.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) { // status = true om objektets run() körs = objektet tråd har startats
if(!((D2XX)tc0).getStatus()) { // om ingen tråd ännu startats av trådkontrollern så
threadControllerThread[0] = new Thread (threadController[0]); // skapa en tråd utav trådkontrollern och
threadControllerThread[0].start(); // starta den trådkontrollern
} // den här trådkontrollern körs nu som en tråd
}
});
btnStart.setFont(new Font("Trebuchet MS", Font.PLAIN, 15));
btnStart.setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
btnStart.setBackground(Color.WHITE);
btnStart.setBounds(10, 11, 120, 23);
panel.add(btnStart);
//====================================================================================================== OPEN D2xxx Device-knapp
// Hittar D2XX ansluten enheten till COM-port och öppnar enheten för datatrafik
btnOpenDxxDevice = new JButton("OPEN D2XX Device");
btnOpenDxxDevice.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
if(((D2XX)tc0).getStatus()) {
try {
((D2XX)tc0).D2xxSetUp();
} catch (FTDIException e1) {
e1.printStackTrace();
}
}
}
});
btnOpenDxxDevice.setFont(new Font("Trebuchet MS", Font.PLAIN, 15));
btnOpenDxxDevice.setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
btnOpenDxxDevice.setBackground(Color.WHITE);
btnOpenDxxDevice.setBounds(140, 11, 167, 23);
panel.add(btnOpenDxxDevice);
//====================================================================================================== CLOSE D2xxx Device-knapp
// Stänger öppnad anslutning
btnCloseDxxDevice = new JButton("CLOSE D2XX Device");
btnCloseDxxDevice.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
if(((D2XX)tc0).getStatus()) {
((D2XX)tc0).closeD2xx();
}
}
});
btnCloseDxxDevice.setFont(new Font("Trebuchet MS", Font.PLAIN, 15));
btnCloseDxxDevice.setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
btnCloseDxxDevice.setBackground(Color.WHITE);
btnCloseDxxDevice.setBounds(140, 48, 167, 23);
panel.add(btnCloseDxxDevice);
//====================================================================================================== EXIT-knapp
// Avslutar programmet
btnExitButton = new JButton("EXIT");
btnExitButton.setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
btnExitButton.setBackground(new Color(255, 255, 255));
btnExitButton.setFont(new Font("Trebuchet MS", Font.PLAIN, 15));
btnExitButton.setBounds(10, 48, 120, 23);
btnExitButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("EXIT");
System.out.println("Avslutar " + threadController[0].toString());
System.exit(0);
}
});
panel.add(btnExitButton);
//========================================================================== Textarea att printa info i
textArea_0 = new JTextArea();
textArea_0.setBackground(new Color(253, 245, 230));
textArea_0.setForeground(new Color(0, 0, 0));
textArea_0.setFont(new Font("Monospaced", Font.ITALIC, 14));
textArea_0.setRows(50);
textArea_0.setBounds(10, 11, 671, 393);
frmDxxFtrSoftware.getContentPane().add(textArea_0);
}
}
Kod: Markera allt
package d2xx;
import static net.sf.yad2xx.FTDIConstants.*;
import net.sf.yad2xx.Device;
import net.sf.yad2xx.FTDIException;
import net.sf.yad2xx.FTDIInterface;
import start.D2XXGUI;
/*
* Om COM-porten där FTDI-adaptern är ansluten är konfigurerad med D2XX så
* är den dold i windows
*/
public class D2XX implements Runnable {
private boolean stopSignal;
private volatile static boolean status;
// Get available FTDI Devices
private Device dev;
/*
* Konstruktor
*/
public D2XX() {
D2XX.status = false;
this.stopSignal = false;
dev= null;
}
/*
* Ett objekt av klassen Echo2xx kör som tråd och när tråden startas
* startar run()
*/
public void run() {
D2XX.status = true;
D2XXGUI.addTextTA(" ========================================================");
D2XXGUI.addTextTA(" Programmet har startat");
D2XXGUI.addTextTA(" ========================================================");
System.out.println(this.getStatus());
}
public boolean getStatus() {
return D2XX.status;
}
public void D2xxSetUp() throws FTDIException {
dev = FTDIInterface.getDevices()[0];
D2XXGUI.eraseTextFromTextArea();
if (!dev.isOpen()) {
// rensa textArea
D2XXGUI.addTextTA(" ========================================================");
D2XXGUI.addTextTA(" Opening device ---> " + dev.getDescription());
D2XXGUI.addTextTA(" ========================================================");
dev.open();
D2XXGUI.addTextTA(" Device connected to COM port: -> " + dev.getComPortNumber());
// dev.setTimeouts(2000, 2000);
D2XXGUI.addTextTA(" Setting -> Baudrate = " + FT_BAUD_9600);;
dev.setBaudRate(FT_BAUD_9600);
D2XXGUI.addTextTA(" Setting -> " + "data bits = " + FT_BITS_8 + ", stop bits = " + FT_STOP_BITS_1 + ", paritet = " + FT_PARITY_NONE);
dev.setDataCharacteristics(FT_BITS_8, FT_STOP_BITS_1, FT_PARITY_NONE);
D2XXGUI.addTextTA(" Setting -> flow control = " + FT_FLOW_NONE);
dev.setFlowControl(FT_FLOW_NONE, (char) 0, (char) 0);
D2XXGUI.addTextTA(" Device name description -> " + dev.getDescription());
D2XXGUI.addTextTA(" Device all description -> " + dev);
D2XXGUI.addTextTA(" Device connected to COM port: -> " + dev.getComPortNumber());
// 48 45 4C 4C 4F = HELLO
/* byte[] data = { (byte)0x48, (byte)0x45, (byte)0x4C, (byte)0x4C, (byte)0x4F };
System.out.println("Sending data");
for (int i = 0; i < 3; i++) {
System.out.println("Sending data");
dev.write(data);
try {
Thread.sleep(1000);
System.out.println("Antal mottagna bytes = " + dev.getStatus().getRxBytes());
}
catch (InterruptedException ie) {}
byte[] input = new byte[5];
dev.read(input);
System.out.println((char)input[0] + " " + (char)input[1]+ " " + (char)input[2]+ " " + (char)input[3]+ " " + (char)input[4]);
} */
}
else {
D2XXGUI.eraseTextFromTextArea();
D2XXGUI.addTextTA(" ========================================================");
D2XXGUI.addTextTA(" Unable to open device. Maybe already open");
D2XXGUI.addTextTA(" Closing it if already open. Try to open it again");
D2XXGUI.addTextTA(" ========================================================");
if(dev.isOpen())
dev.close();
}
}
/*
* Stänger öppnade portar. Kontrolleras ifrån GUI
*/
public void closeD2xx() {
if(dev.isOpen()) {
try {
D2XXGUI.eraseTextFromTextArea();
D2XXGUI.addTextTA(" ========================================================");
D2XXGUI.addTextTA(" Closing device ---> " + dev.getDescription());
D2XXGUI.addTextTA(" ========================================================");
dev.close();
} catch (FTDIException e) {
e.printStackTrace();
}
}
else {
D2XXGUI.eraseTextFromTextArea();
D2XXGUI.addTextTA(" ========================================================");
D2XXGUI.addTextTA(" Nothing to Close!");
D2XXGUI.addTextTA(" ========================================================");
}
}
public Device getDevice() {
return dev;
}
/*
* Metoden startas ifrån GUI.
* Ett försök utförs att skapa en datalinje till en uppkopplad serieport.
* En while-loop snurrar som utför aktiviteter baserat på vad som kontrolleras ifrån GUI.
* While-loopen kan avbrytas ifrån GUI för att koppla ned serieporten och sedan avsluta hela programmet.
*/
public void RunEcho() {
}
/*
* Vid tryck på knappen EXIT i GUI sätts denna stoppflagga
* för att avbryta while-loopen i metoden RunEcho
*/
public void setStopSignal() {
this.stopSignal = true;
}
public boolean getStopSignal() {
return this.stopSignal;
}
public String toString() {
return "EchoD2xx";
}
}
Kod: Markera allt
package threadController;
public class ThreadController implements Runnable {
private Object obj;
private Thread objectThread;
private static final int TIMER_INTERVAL = 500;
/*
* Konstruktor
*/
public ThreadController(Object object) {
this.obj = object;
}
public void run() {
objectThread = new Thread( (Runnable) obj); // skapar en ny tråd
objectThread.start();
System.out.println("Trådkontrollern kör nu run");
while(true) {
try {
Thread.sleep(TIMER_INTERVAL);
}
catch(InterruptedException ie) {
objectThread.interrupt();
}
}
}
public String toString() {
return this.obj.toString();
}
}
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: I2C Display och Arduino
Funderar på om det skulle gå att styra I2C-displayen direkt med
FTDI USP-adaptern, alltså skriva kod på datorn och få det att fungera?
FT232R-kretsen som sitter monterad har stöd för I2C men inte SPI,
för SPI ska man ha ett FT232H-chip, Lite synd för det finns många kul tillämpningar för SPI.
Electrokit säljer en "Serieinterface för LCD I2C SPI" https://www.electrokit.com/produkt/seri ... d-i2c-spi/
FTDI USP-adaptern, alltså skriva kod på datorn och få det att fungera?
FT232R-kretsen som sitter monterad har stöd för I2C men inte SPI,
för SPI ska man ha ett FT232H-chip, Lite synd för det finns många kul tillämpningar för SPI.
Electrokit säljer en "Serieinterface för LCD I2C SPI" https://www.electrokit.com/produkt/seri ... d-i2c-spi/
Re: I2C Display och Arduino
Jag hade läst på för lite om FT232R för den har inget stöd för I2C.
Jag har kikat på lite fler adaptrar för just detta och här till exempel
används en PIC för att sköta det mesta I2C och SPI...
https://www.robot-electronics.co.uk/pro ... dules.html
Ska jag sedan kunna styra min Geeek-Pi LCD med en sådan adapter måste jag först förstå mig på I2C till LCD-ports-omvandlaren PCF8574,
i mitt fall från TI då hex-adressen börjar på 2, NXP-varianten börjar på 3. Det finns ingen märkeslogga tryckt på IC:n, tycker jag
de borde börja med.
https://www.ti.com/lit/ds/symlink/pcf8574a.pdf
https://www.nxp.com/docs/en/data-sheet/ ... F8574A.pdf
Här finns förslag på vad som jag ska kunna..https://electronics.stackexchange.com/q ... -connector
Jag har kikat på lite fler adaptrar för just detta och här till exempel
används en PIC för att sköta det mesta I2C och SPI...
https://www.robot-electronics.co.uk/pro ... dules.html
Ska jag sedan kunna styra min Geeek-Pi LCD med en sådan adapter måste jag först förstå mig på I2C till LCD-ports-omvandlaren PCF8574,
i mitt fall från TI då hex-adressen börjar på 2, NXP-varianten börjar på 3. Det finns ingen märkeslogga tryckt på IC:n, tycker jag
de borde börja med.
https://www.ti.com/lit/ds/symlink/pcf8574a.pdf
https://www.nxp.com/docs/en/data-sheet/ ... F8574A.pdf
Här finns förslag på vad som jag ska kunna..https://electronics.stackexchange.com/q ... -connector
Re: I2C Display och Arduino
Ska börja med att montera processorn som finns på UNO-kortet och se om det fungerar ihop
med displayen och tidspulsen. Sedan flasha en ATmega328P-PU med hjälp av Arduino UNO-kortet, MISO, MOSI och SCK.
Sågade av fästet på TO220-kapseln så bygghöjden kunde minskas.
med displayen och tidspulsen. Sedan flasha en ATmega328P-PU med hjälp av Arduino UNO-kortet, MISO, MOSI och SCK.
Sågade av fästet på TO220-kapseln så bygghöjden kunde minskas.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.