En första version har jag byggt ihop som läser av 2 st k-typ termoelement och skickar datan via USB till datorn, på datorn har jag skrivit ett program som loggar datan och ritar en plot.
Hårdvaran jag använder är enligt följande:
PIC 18f2550
2 st MAX6675 A/D omvandlare
Den första versionen måste vara kopplad till datorn för att logga, den drivs av ström från USB porten och skickar data via USB. Jag har använt mig av Dangerous Prototypes USB stack, stångades med microchips USB exempel utan att lyckas. Dangerous prototypes kod var för en nybörjare lättare att förstå!
I skrivandes stund håller jag på att utveckla nästa version av loggern, jag håller på att ordna med en LCD för att kunna visa mätningar utan att vara kopplat till datorn. Tankar finns också på att addera något slags minne för att kunna logga data och sedan koppla till datorn för att tömma enheten. Där har jag funderat på antingen EEPROM eller SD kort.
Ikväll har jag suttit och bråkat med att få en hd44780 lcd att fungera, jag har kommit så långt att jag lyckas initiera den och skriva ut text men bara på första raden?
Jag kan flytta markören på första raden utan problem men när jag flyttar till 0xC0 vilket borde peka på rad 2 kol 1 kommer det ingen text.
Vrider jag upp kontrasten så är det bara mörk bakgrund på översta raden så det känns som att displayen initieras i fel läge helt enkelt.
Bifogar min kod här så kanske någon kan se vad jag inte lyckats se de timmar jag suttit och letat

LCD funktionerna jag skrivit:
Kod: Markera allt
void E_strobe(void)
{
E_PIN=1;
Delay10Us(10);
E_PIN=0;
}
void lcd_pordelay(void){
DelayMs(15);
DelayMs(15);
}
void lcd_goto(unsigned char pos)
{
lcd_busy();
RS_PIN = 0;
lcd_write(0x80|pos);
}
void lcd_write(unsigned char c)
{
RS_PIN = 0;
lcd_busy(); // Wait if busy
LCD_DATA = ( ( c >> 4 ) & 0x0F ); // Hi NIB
E_strobe();
Delay10Us(5);
LCD_DATA = ( c & 0x0F ); // Low NIB
E_strobe();
}
void lcd_putch(unsigned char c)
{
RS_PIN = 1;
LCD_DATA &= 0xf0; // Nolla data portar
LCD_DATA |= ( ( c >> 4 ) & 0x0F ); // Hi NIB protect d4-d5
E_strobe();
LCD_DATA &= 0xf0; // Nolla data portar
LCD_DATA |= ( c & 0x0F ); // Low NIB
E_strobe();
}
void lcd_clear(void)
{
lcd_busy();
RS_PIN = 0;
lcd_write(0x1);
}
void lcd_puts(const char * s){
while(*s)
lcd_putch(*s++);
}
void lcd_busy(void)
{
char RS_state;
RS_state = RS_PIN; /* Save rs state*/
LATA = 0;
TRISA = 0x08;
RW_PIN = 1; /* Set control pins*/
RS_PIN = 0;
//Delay10Us(5);
E_PIN = 1; /* Ask for data*/
//Delay10Us(5);
while(BF_PIN); /* Wait for BF*/
E_PIN = 0;
TRIS_BF = 0; /* BF pin as out */
RW_PIN = 0; /* Back to write */
RS_PIN = RS_state; /* Reset RS to value before calling*/
//Delay10Us(2);
}
void InitLCD(void)
{
char init_value;
init_value = 0x03;
TRISB =0;
RS_PIN = 0;
E_PIN = 0;
RW_PIN = 0;
lcd_pordelay();
LCD_DATA = init_value; // 8 bit fs
E_strobe();
DelayMs(5);
E_strobe(); // 8 bit fs
Delay100Us(2);
E_strobe(); // 8bit fs
Delay100Us(2);
LCD_DATA = 0x2; // Four bit mode
E_strobe();
lcd_busy(); // Wait until not busy
lcd_write(0x28); // Function Set 4-bit, 2 line
//b00101000
lcd_write(0x08); // Display Off
//b00001000
lcd_write(0x01); // Clear display
//b00000001
lcd_write(0x06); // Entry mode, incremental, no shift
//b00000100
lcd_write(0x0C); // Display On, cur off, blink off
//b00001100
}
InitLCD anropas från min main varpå displayen startar och jag kan skriva text med lcd_puts('sträng'), lcd_goto() funkar som den skall men bara på rad 1.
Kod: Markera allt
void main(void)
{
int i;
SetupBoard(); //setup the hardware, customize for your hardware
InitLCD();
DelayMs(21);
DelayMs(21);
lcd_goto(0x00);
lcd_puts("Sensor 1: 0");
lcd_putch(0xDF); // Degrees
lcd_putch(0x43); // C
lcd_goto(0x40);
lcd_puts("Sensor 2: 0");
lcd_putch(0xDF); // Degrees
lcd_putch(0x43); // C
.
.
.
.
.
All input är välkommen! Någon som har provat på att använda SD kort och EEPROM? vad är enklast, jag vill mäta ganska korta förlopp och en mätning kräver ~200 kb i de textfiler jag nu skapar på datorn.