ik probeer in mijn project een lcd aansturing te bouwen. dus ik ben nu eerst bezig met een stand alone versie om deze later er in te voegen.

echter krijg ik hier hele rare errors op.


#include <system.h>
#pragma DATA 0x2007, 0x3F3A
#pragma CLOCK_FREQ  20000000

char data;
char timertick = 0;
char bad = 0;
char i;
char str[2] = {0,0};

//de software om LCD scherm aan te kunnen sturen
#define LCD_ARG	1, 				/* Interface type: mode 0 = 8bit, 1 = 4bit(low nibble), 2= 4bit(upper nible)*/\
	1,		 					/* Use busy signal: 1 = use busy, 0 = use time delays*/\
	PORTA, TRISA, 				/* Data port and data port tris register*/\
	PORTA, TRISA,				/* Contol port and control port tris register*/\
	7,							/* Bit number of control port is connected to RS*/\
	6,							/* Bit number of control port is connected to RW*/\
	4							/* Bit number of control port is connected to Enable*/

#include <lcd_driver.h> 	//include the LCD template code

#define DELAY delay_s( 2 )
#define DELAY_SHORT		 delay_ms ( 100 )

void main()
	{
	lcd_clear();
	lprintf("RGB sensor");
	delay_s (1);
	}

ik heb lcd_driver.h hieronder beschikbaar gemaakt

www.winius.net/lcd2.txt

de errors die ik krijg zijn

failed to generate expression lcd_clear
failed to generate expression lprintf

maar deze staan in de lcd_driver.h file.

Normaal gesproken zet je de #includes bovenin voor de definities.

ook al geprobeerd geen verschil.

dit stuk software is gekopieerd uit een voorbeeld software van sourceboost zelf. vooral het bovenste gedeelte.

iemand al enig idee?

of iemand die een wel werkende code voor me heeft?

Zag heel toevallig je vraag in het forum staan ik denk die jongen kan ik niet in de kou laten staan :p.
Ik heb hier zelf ook code voor geschreven. Bij deze code word ook de adc ingelezen, het is een klokje alleen hij loopt niet precies goed hij heeft iets van 3 seconden achterstand op een uur. Maargoed ik heb die code er allemaal maar bij laten staan je kan het altijd nog weghalen dacht ik zo. Haal alleen effe de include van de serial.h weg want die word nog niet gebruikt, was ik nog van plan. Je kan dit project zo debuggen in sourceboost, lekker makkelijk :p. Je ziet zelf wel hoe je dan de lcd moet configureren. De adc geeft hier een 8 bit waarde af in plaats van 10 bit.

Je hoeft de lcd_driver.h niet in je project te zetten je hoeft hem alleen te include.


#include <system.h>
#include <serial.h>
//Target PIC16F877 configuration word
#pragma DATA _CONFIG, _CP_OFF & _DEBUG_OFF & _WRT_OFF  & _CPD_OFF & _LVP_ON & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
//Set clock frequency
#pragma CLOCK_FREQ 20000000                       

#define LCD_ARGS 	2,	/* Interface type: mode 0 = 8bit, 1 = 4bit(low nibble), 2 = 4bit(upper nibble) */ \
		0, 				/* Use busy signal: 1 = use busy, 0 = use time delays */\
		PORTB, TRISB, 	/* Data port and data port tris register */ \
		PORTD, TRISD, 	/* Control port and control port tris register */ \
		7,				/* Bit number of control port is connected to RS */ \
		6,				/* Bit number of control port is connected to RW */ \
		5 				/* Bit number of control port is connected to Enable */

#include <lcd_driver.h> // include the LCD template code

int adc=0;
int spanning=0;
int ms=500, sec=0, min=0, uren=0;
int pre=60535;

void adc_init(void)
{
  set_bit(adcon1, ADFM);	// AD result needs to be right justified
  set_bit(adcon1, PCFG0);	// all analog inputs
  set_bit(adcon1, PCFG1); 	// Vref+ = Vdd
  set_bit(adcon1, PCFG2);	// Vref- = Vss

  set_bit(adcon0, ADCS1);  	// Select Tad = 32 * Tosc (this depends on the X-tal here 10 MHz, should work up to 20 MHz)
  clear_bit(adcon0, CHS0); 	// Channel 0
  clear_bit(adcon0, CHS1); 	//
  clear_bit(adcon0, CHS2);	//
  set_bit(adcon0,ADON);		// Activate AD module
}

int adc_measure(char channel)
{  
  // Clear the channel selection in adcon0
  adcon0 &= 11000111b;	
  // Shift the channel value to the appropriate position
  channel = (channel & 0x07) << 3;	
  // And move it to the appropriate position in adcon0
  adcon0 |= channel;
  // Wait the required acquisition time (datasheet)
  delay_10us(2);	
  // Start the conversion
  adcon0.GO_DONE = 1;	
  // Wait until it is done
  while(adcon0.GO_DONE);
    	
  int retval=0;
  retval = (short)adresh;
  retval = retval << 8;
  retval |= adresl;
  retval>>=2;
  return retval;	
}

void check_tijd(void)
{
  if(ms==1000){sec++; ms=0;}
  if(sec>=60){sec=0; min++;}
  if(min>=60){min=0; uren++;}
  if(uren>=24){uren=0;}
}

void main()
{
  trisa=0b11111110;
  trisb=0xFF;
  trisc=0b11111101;
  trisd=0xFF;
  trise=0x07;
  option_reg=0x80;
  intcon=0b11000000;
  pie1=0b00000001;
  pir1=0b00000000;
  
  lcd_setup();
  adc_init();
  
  //tmr1 init
  t1con=0x09;
while(1)
{     
  adc=adc_measure(0);
  spanning=(adc*(5/255)); 
  lcd_gotoxy(0,1);  
  lprintf("adc: %u   ",adc );
  lcd_gotoxy(0,0);
  lprintf("%u",uren);
  lprintf(":%u",min);
  lprintf(":%u   ",sec);
}
  
}

void interrupt(void)
{
  clear_bit(pir1,TMR1IF);
  LOBYTE(tmr1l,pre);
  HIBYTE(tmr1h,pre);   
  ms++;
  check_tijd();     
}

Ow en nog even,

Bij jouw ligt de fout waarschijnlijk bij het aanroepen van de lcd_setup();
Dat doe je niet! B-)

[Bericht gewijzigd door Henry S. op (0%)]

ook daar ligt het probleem niet in WEIRD!

die functie erin gezet en ook die ziet die als fout.

jouw software nog ff testen

EDIT: die werkt wel, dit is tevens ook voor een 877?

[Bericht gewijzigd door veenie op (18%)]

Yep ook voor de 877 alleen misshcien moet je nog effe het configuration aanpassen want ik heb alle crap uitgezet zoals de WDT.
Wat je nog meer kan proberen is time delays gebruiken.
Maar ik denk dat de compiler het niet zo leuk vind dat je voor de control poort en voor de data poort dezelfde poorten op hebt gegeven (twee maal portA en trisA).
Ik zie wel of het nu wel gaat lukken.
Wat maak je eigenlijk of is het gewoon een beetje proberen?

beetje uitproberen en eventueel in me project verwerken maar dat is meer een extratje op het project dan noodzaak.

project is de safety module, leest temperatuur spanning etc uit om te kijken of er geen fouten voor doen in de vermogen sturing.

[Bericht gewijzigd door veenie op (37%)]

Heb je hem al getest ik ben eigenlijk wel benieuwd?


#define LCD_ARGS 	2,	/* Interface type: mode 0 = 8bit, 1 = 4bit(low nibble), 2 = 4bit(upper nibble) */ \
		0, 				/* Use busy signal: 1 = use busy, 0 = use time delays */\
		PORTD, TRISD, 	/* Data port and data port tris register */ \
		PORTD, TRISD, 	/* Control port and control port tris register */ \
		5,				/* Bit number of control port is connected to RS */ \
		4,				/* Bit number of control port is connected to RW */ \
		7 				/* Bit number of control port is connected to Enable */

hoe defineer ik de data poorten?

ik heb het als het volgende aangesloten.
1 +5V
2 GND
3 +5V
4 RS = portd5
5 R/W = portd4
6 E = portd6
7 DB0
8 DB1
9 DB2
10 DB3
11 DB4 = portd0
12 DB5 = portd1
13 DB6 = portd2
14 DB7 = portd3
15 GND
16 +5V

ik test met de software van justinsane

Compliled de compiler wel met de data lijnen en control lijnen alletwee op poort D? Ik dacht dat dat niet kon.
Maar anders zou het zo goed moeten zijn. Let wel, met het simuleren kan je geen busy signaal gebruiken maar moet je dus time delays gebruiken(die nul in een 1 veranderen).
Je hebt voor de Enable gezegd dat je portD6 heb aangesloten maar in je define staat 7, denk dat dit een foutje is?

Zeg maar Justin trouwens ;P

ja is tikfoutje, maar heb nog steeds niets hier helaas :(

krijg het nog niet werkend.

hij blijft hangen op zijn initalisatie lijkt het.. bij vol contrast is het witte balk boven, donkere balk onder (blauw wit display)

ook jou software,, aangepast op mijn poorten weigert te werken..

EDIT: met scope aan het meten gegaan. De RW en RS lijn staan continue aan. De enable lijn staat grote tijden aan maar valt met regelmaat af. (5v)

enable lijn doet zijn werk.

D6 is ook hoog d4, d5, d7 zijn laag.

Kan je anders je hele project eens opsturen naar mijn mail in een .rar? dan zal ik hem eens simuleren in sourceboost.

[Bericht gewijzigd door justinsane op (17%)]

Zo werkt ie bij mij in de debugger van sourceboost:


#include <system.h>
#pragma DATA 0x2007, 0x3F3A
//#pragma DATA _CONFIG, _CP_OFF & _DEBUG_OFF & _WRT_OFF  & _CPD_OFF & _LVP_ON & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
#pragma CLOCK_FREQ 20000000                                                                                                                                                                                                                                                                                                                                                      

#define LCD_ARGS     2,    /* Interface type: mode 0 = 8bit, 1 = 4bit(low nibble), 2 = 4bit(upper nibble) */ \
        0,                 /* Use busy signal: 1 = use busy, 0 = use time delays */\
        PORTD, TRISD,     /* Data port and data port tris register */ \
        PORTD, TRISD,     /* Control port and control port tris register */ \
        0,                /* Bit number of control port is connected to RS */ \
        1,                /* Bit number of control port is connected to RW */ \
        2                 /* Bit number of control port is connected to Enable */
#include <lcd_driver.h> // include the LCD template code

/*
Met aansluitingen:

Rs->PortD0
Rw->PortD1
Enable->PortD2
DB4..7->PortD4..7  
*/

void main()
{	
  trisa=00000000b;
  trisb=00000000b;
  trisc=00000000b;
  trisd=00000000b;
  trise=00000000b;
  
  lcd_setup();
  
while(1)
	{    
		set_bit(portb,7);
		delay_ms(10);
		delay_ms(10);
		lcd_gotoxy(0,0);  
		lprintf("test");
		delay_s(2);
		lcd_gotoxy(0,0);
	}

}

ik ga het vanavond even proberen,

hopelijk dat het nu wel werkt!

still no go :(....

wel wat veranderd dus er lijkt wel wat te gebeuren.

in plaats van 1 rij met witte blokken heb ik nu 2 rijen.

meet rapportje:
-RS is constant hoog maar valt 1x per 1s naar gnd
-RW altijd laag
-E altijd laag, heel kort even hoog.

data
d4 1
d5 1
d6 1
d7 0

*heb voor de zekerheid al een ander display en pic geplaatst. geen resultaat

ook andere poorten gebruiken voor de kanalen maakt niet uit. portb2,3,4 nu gebruikt exact zelfde probleem.

zou je je lcd_driver.h eens kunnen mailen vermoed dat die van mij rot is? :S

Hmm das raar want bij werkt ie gewoon. Is het contrast goed van de display, misschien kan je hier even mee experimenteren dor een potmeter eraan te hangen.
welke poorten hoog moeten worden weet ik ook niet precies dan zou je idd in de lcd driver moeten kijken, die je zo op je mail ziet :p
Ik kan trouwens gewoon een lcd simuleren in sourceboost, je hebt hier wel de plugins uitbreiding voor nodig, iets van 25 op hun site dan heb je ze meteen als je met de creditcard betaald.(geen reclame he)
Heb je trouwns in je lcd driver zitten pielen? had ik ook eerst gedaan :P

Heb je een weerstandje van 2.2K geprobeerd op de RS en de EN lijn?

Waar is dat weerstandje dan precies voor? En moet dat dan naar de ground of tuusen de lijnen, of is het een pull-up?

dat is mijn vraag dan ook ja?

en mijn lcd driver.h is toch net ff anders dan de jouwe zag ik dus, mogelijk dat dat het probleem is.

[Bericht gewijzigd door veenie op (64%)]

hmm 2k2 nog niet geprobeerd ivm onduidelijk..

ook de lcd_driver.h maakt geen verschil... SHEIZE!

iemand nog ideeen wordt er zo langzamerhand Prettig gestoord van.

Je kan in sourceboost even kijken met een programmaatje dat alle poorten aan en uit zet of alle pinnen dan ook wel hoog of laag gaan, misschien staat er een analoog ingang aan of iets dergelijks...anders begin ik oko geen ideeen mer te krijgen...

heb alles al nagelopen... das het rare.. als ik de signalen meet zouden deze ook moeten kloppen..

getting nuts in here.. iemand nog iets kunnen vinden ik snap er echt niks meer van :S?