Ramona1805
28.04.2010, 15:47
Hallo ihr Lieben,
ich bin langsam ziemlich ratlos.. Ich bin derzeit dabei an meinem PIC18F458 (später dann auch am PIC18F4685)
über I2C mit meinem EAeDip320-8-Display zu kommunizieren.. Leider bisher ohne Erfolg :(
Hierfür nutze ich MPLAB in Verbindung mit dem CCS-Compiler.
Bin für alle Ratschläge dankbar
zur besseren Info hier die Datenblätter:
PIC18F458: http://ww1.microchip.com/downloads/en/devicedoc/41159d.pdf
I2C ab Seite 154; I2C-Master ab Seite 169
Display: http://www.lcd-module.com/deu/pdf/grafik/edip320-8.pdf
I2C ab Seite 7; Befehlssatz ab Seite 14
Zum einen habe ich folgende Verkabelungen angebracht:
Display GND (PIN1) - Stromversorgung GND
Display VDD (PIN2) - Stromversorgung +5V
Display GND (PIN1) - GND Pic-Board
Display I2CMODE (PIN12) - Display GND
Display SCL (PIN15) - Pic SCL (C3)
Display SDA (PIN14) - Pic SDA (C4)
Pic SCL über Pullup 12k - Pic-Board Stromversorgung 5V
Pic SDA über Pullup 12k - Pic-Board Stromversorgung 5V
Könnte sein, dass hier auch noch was fehlt oder falsch ist..
Mein Testcode ist der folgende:
#include "18F458.h"
#FUSES H4, NOWDT //H4 für möglichst hohe Geschwindigkeit am IRQ-Eingang
#use I2C(Master, SDA=PIN_C4, SCL = PIN_C3, FAST, FORCE_HW)
#int_SSP
SSP_isr()
{
//Zum Test noch leer interrupt flag bit von Compiler rückgesetzt
}
void main()
{
enable_interrupts(global);
enable_interrupts(INT_SSP);
set_tris_d(0x00); //Ausgang für LEDs
set_tris_c(0b00011000); //SDA und SCL als INPUT laut Datenblatt
output_d(0xFF); //Alle LEDs erst aus (AUS = 1, AN = 0)
while(1)
{
//Übertragen des Befehls zum Invertieren des kompletten Displays
i2c_start();
output_bit(PIN_D0,~input(PIN_D0));
i2c_write(0b11011110); //senden der slave-Adresse mit 0 für write
output_bit(PIN_C2, ~PIR2[3]);
output_bit(PIN_D1,~input(PIN_D1));
i2c_write(0x11); //Hex-Code für '#' übertragen
output_bit(PIN_D2,~input(PIN_D2));
i2c_write(0x02); //Länge der Datenbytes
output_bit(PIN_D3,~input(PIN_D3));
i2c_write(0x44); //Hex-Code für 'D'
output_bit(PIN_D4,~input(PIN_D4));
i2c_write(0x49); //Hex-Code für 'I'
output_bit(PIN_D5,~input(PIN_D5));
i2c_write(0xA0); //Prüfsumme
output_bit(PIN_D6,~input(PIN_D6));
i2c_stop();
output_bit(PIN_D7,~input(PIN_D7));
}
}
Die LEDs sind zum nachvollziehen im Durchlauf, wobei ich leider feststellen muss, dass der PIC schon während des ersten Write-Befehls aussteigt..
Die while-Schleife sollte dafür sein, dass ich den Vorgang wiederholt am Oszi verfolgen kann,
nur tut sich da auch noch nicht wirklich was.. :(
Wie gesagt ich bin mittlerweile richtig ratlos, aber meinen Funden an Beispielen hab ich bisher immer entnommen,
dass das #use I2C mit den Optionen und i2c_start, write, stop eigentlich ausreichen müsste..
Wäre echt super wenn ihr mich unterstützen könntet sowohl in Sachen Display als auch I2C-Programmieren..
ich bin langsam ziemlich ratlos.. Ich bin derzeit dabei an meinem PIC18F458 (später dann auch am PIC18F4685)
über I2C mit meinem EAeDip320-8-Display zu kommunizieren.. Leider bisher ohne Erfolg :(
Hierfür nutze ich MPLAB in Verbindung mit dem CCS-Compiler.
Bin für alle Ratschläge dankbar
zur besseren Info hier die Datenblätter:
PIC18F458: http://ww1.microchip.com/downloads/en/devicedoc/41159d.pdf
I2C ab Seite 154; I2C-Master ab Seite 169
Display: http://www.lcd-module.com/deu/pdf/grafik/edip320-8.pdf
I2C ab Seite 7; Befehlssatz ab Seite 14
Zum einen habe ich folgende Verkabelungen angebracht:
Display GND (PIN1) - Stromversorgung GND
Display VDD (PIN2) - Stromversorgung +5V
Display GND (PIN1) - GND Pic-Board
Display I2CMODE (PIN12) - Display GND
Display SCL (PIN15) - Pic SCL (C3)
Display SDA (PIN14) - Pic SDA (C4)
Pic SCL über Pullup 12k - Pic-Board Stromversorgung 5V
Pic SDA über Pullup 12k - Pic-Board Stromversorgung 5V
Könnte sein, dass hier auch noch was fehlt oder falsch ist..
Mein Testcode ist der folgende:
#include "18F458.h"
#FUSES H4, NOWDT //H4 für möglichst hohe Geschwindigkeit am IRQ-Eingang
#use I2C(Master, SDA=PIN_C4, SCL = PIN_C3, FAST, FORCE_HW)
#int_SSP
SSP_isr()
{
//Zum Test noch leer interrupt flag bit von Compiler rückgesetzt
}
void main()
{
enable_interrupts(global);
enable_interrupts(INT_SSP);
set_tris_d(0x00); //Ausgang für LEDs
set_tris_c(0b00011000); //SDA und SCL als INPUT laut Datenblatt
output_d(0xFF); //Alle LEDs erst aus (AUS = 1, AN = 0)
while(1)
{
//Übertragen des Befehls zum Invertieren des kompletten Displays
i2c_start();
output_bit(PIN_D0,~input(PIN_D0));
i2c_write(0b11011110); //senden der slave-Adresse mit 0 für write
output_bit(PIN_C2, ~PIR2[3]);
output_bit(PIN_D1,~input(PIN_D1));
i2c_write(0x11); //Hex-Code für '#' übertragen
output_bit(PIN_D2,~input(PIN_D2));
i2c_write(0x02); //Länge der Datenbytes
output_bit(PIN_D3,~input(PIN_D3));
i2c_write(0x44); //Hex-Code für 'D'
output_bit(PIN_D4,~input(PIN_D4));
i2c_write(0x49); //Hex-Code für 'I'
output_bit(PIN_D5,~input(PIN_D5));
i2c_write(0xA0); //Prüfsumme
output_bit(PIN_D6,~input(PIN_D6));
i2c_stop();
output_bit(PIN_D7,~input(PIN_D7));
}
}
Die LEDs sind zum nachvollziehen im Durchlauf, wobei ich leider feststellen muss, dass der PIC schon während des ersten Write-Befehls aussteigt..
Die while-Schleife sollte dafür sein, dass ich den Vorgang wiederholt am Oszi verfolgen kann,
nur tut sich da auch noch nicht wirklich was.. :(
Wie gesagt ich bin mittlerweile richtig ratlos, aber meinen Funden an Beispielen hab ich bisher immer entnommen,
dass das #use I2C mit den Optionen und i2c_start, write, stop eigentlich ausreichen müsste..
Wäre echt super wenn ihr mich unterstützen könntet sowohl in Sachen Display als auch I2C-Programmieren..