Skillnad på Pic & Pic ang. programmering inom samma familj?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Teknikern
Inlägg: 6974
Blev medlem: 29 juni 2007, 14:09:48
Ort: Sköldinge

Skillnad på Pic & Pic ang. programmering inom samma familj?

Inlägg av Teknikern »

Jag håller på att designa en led-termometerskala som ska mäta tempen i ett spa-bad och tänkte använda mig av detta schema som jag hittade på nätet tillsammans med HEX-koden.

Bild

Eftersom jag har ett större antal av Pic 16F874A tänkte jag använda mig av en sådan, jag jämförde den med den som är använd här och det enda som skiljer är att min har:

FLASH Program Memory
(14-bit words) 4K *8K*

Data Memory (bytes) 192 *368*

EEPROM Data Memory 128 *256*

Dom inom stjärnor är den dom använt i projektet och är en Pic 16F877A, alltså samma pinout och samma familj. Koden är liten men när jag flashat in den och slog på strömmen visade displayen bara 56 för att sen hoppa till 13 och stanna, den reagerar alltså inte alls på temperaturförändringar och första siffran är svart. Lösning, finns det eller är det helt olika koder i dom kretsarna?

Jag var inne på att köra med Icl 7107 som ju är en ren voltmeter dom driver 7-segmentsdisplay men den har jag inte på hyllan därför tänkte jag använda det som redan finns i lager om det går.
Användarvisningsbild
Glenn
Inlägg: 33666
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: Skillnad på Pic & Pic ang. programmering inom samma fami

Inlägg av Glenn »

Har du inte källkoden och kan kompilera om ?

Jag har vid nåt enstaka tillfälle hällt i kod (där jag enbart haft hexfilen) för 16F84 i en 16F84A varvid man får varningar men det funkade, det är ju dock extremt lika kretsar.
Användarvisningsbild
Teknikern
Inlägg: 6974
Blev medlem: 29 juni 2007, 14:09:48
Ort: Sköldinge

Re: Skillnad på Pic & Pic ang. programmering inom samma fami

Inlägg av Teknikern »

Källkoden har jag och du sa nåt, jag ska testa för i grunden är ju kretsarna lika, bara utrymmet i dom som skiljer så därför tänkte jag att det ska nog gå eftersom kodsnutten är liten.
Användarvisningsbild
Glenn
Inlägg: 33666
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: Skillnad på Pic & Pic ang. programmering inom samma fami

Inlägg av Glenn »

Kan man kompilera om brukar det ju inte vara några problem, möjligen några pindefinitioner man måste ändra på.
Användarvisningsbild
Teknikern
Inlägg: 6974
Blev medlem: 29 juni 2007, 14:09:48
Ort: Sköldinge

Re: Skillnad på Pic & Pic ang. programmering inom samma fami

Inlägg av Teknikern »

Pindefinitioner borde ju följa med när det är samma pinout eller? Nu ska jag strax börja kompilera om så får vi se för då har jag ju koden framför näsan också och kan lägga upp den här om det skiter sig.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45173
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Skillnad på Pic & Pic ang. programmering inom samma fami

Inlägg av TomasL »

Även om pinouten är samma kan det skilja på hur de olika funktionerna skall användas och initieras. Förutom det är det viktigt att veta vilken kiselversion du har och jämföra med erratan.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Skillnad på Pic & Pic ang. programmering inom samma fami

Inlägg av sodjan »

När det gäller både flash och RAM så har ju din halva av varje.
Så det beror helt på hur allokeringen av flash och RAM ser ut
i den aktuella källkoden. Om du har tur (om det är ett modernt
projekt som kör "relocatable") så är det bara att bygga om det
med rätt "target". Om du har otur (gammalt projekt med adresser
som är hårdkodade i källkoden) så behöver även källkoden ändras...
Användarvisningsbild
Teknikern
Inlägg: 6974
Blev medlem: 29 juni 2007, 14:09:48
Ort: Sköldinge

Re: Skillnad på Pic & Pic ang. programmering inom samma fami

Inlägg av Teknikern »

Sodjan, nu slog du sista spiken i kistan, jag hade förut tillgång till en online-compilator men den finns inte mera märkte jag så nu skickar jag efter några ICL 7106-7107 istället för detta projekt och framtida, programmering är inte alls min grej och en enorm tidstjuv har jag märkt, jag ska ägna mig åt det jag är bäst på, mekanik och kretslösningar och ge fan i allt vad mikrodatorer heter, iallafall tills vidare för jag har tappat intresset för det helt nu.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45173
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Skillnad på Pic & Pic ang. programmering inom samma fami

Inlägg av TomasL »

Tanka ned MPLAB och kompilera om det.
Användarvisningsbild
Teknikern
Inlägg: 6974
Blev medlem: 29 juni 2007, 14:09:48
Ort: Sköldinge

Re: Skillnad på Pic & Pic ang. programmering inom samma fami

Inlägg av Teknikern »

Jag testade i det, det funkade inte, Mplab hittade inte ens filen så jag är osäker på i vilket programspråk det hela skrevs. Jaja, skit samma, nu är processorerna tingade och 3 ICL7107 fast ryska på väg från Polen för en struntsumma.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Skillnad på Pic & Pic ang. programmering inom samma fami

Inlägg av sodjan »

Är det så för--anat svårt att posta en enkel länk till projektet?
Är det detta projekt: http://www.hamradio.in/circuits/thermometer.php ?

EDIT:

Så svårt är det väl inte att se vilket språk som "TEMP.C" är skrivet i? Dessutom står det ju i klartext:
"The program is written in C and compiled using HI-TECH PICC-Lite, free software from HI-TECH Softwares.".

HI-TECH PICC-Lite är väl, om jag inte har helt fel, i princip föregångaren till Microchip XC8.

Koden är ju inte jättestor direkt:

Kod: Markera allt

/*----------------------------------------------------------------
 * File:        TEMP.C
 *
 * Purpose:     To display Temperature  between 2 to 100 Degree C
 *
 * Inputs:      LM35
 *             
 * Outputs:     Three seven segment common Cathod LED Display
 *
 * LM35 gives 10mv for a 1 degree temperature change
 *
 * Author: C.V. Niras, vu3cns@yahoo.com 
 *-----------------------------------------------------------------*/

#include <pic.h>
 
__CONFIG(WDTDIS & XT & UNPROTECT &PWRTEN & LVPDIS);

#define	CH0	0b00000000	// AN0
#define	CH1	0b00001000	// AN1
#define	CH2	0b00010000	// AN2
#define	CH3	0b00011000	// AN3
#define	CH4	0b00100000	// AN4 

#define ADCON0_VALUE 0b11000001 // RC OSC, ADON

volatile static unsigned char digit[3];
//volatile static unsigned char a, b, c;
void adc_delay(void);
void set_adc_ch(unsigned char channel);
unsigned int adc_read(void);
union
{
	unsigned int i;
	unsigned char ch[2];
}adc;

void interrupt timer (void);
void DelayMs(unsigned char cnt);
//float floor (float f);

#define	MHZ	*1000L			
#define	KHZ	*1
#define	DelayUs(x)	{ unsigned char _dcnt; \
			  _dcnt = (x)/((12MHZ)/(4MHZ))|1; \
			  while(--_dcnt != 0) \
				  continue; }

void main()
{
	unsigned int temp, temp_real, temp1, i;
	volatile static char channel;
	
	ADCON1 = 0x82;		// RA's are input and RE's are digital output
	TRISA = 0x1F;		// all are input 
	TRISB = 0x00;		// All portB are output
	TRISC = 0x00;		// All PortC are out put
	PORTC = 0x00;
	TRISE = 0x00;
 	OPTION = 0x04;		/* Prescale of 32. */
 						/* which is really Fosc/4*32. */
  	INTCON = 0;
 	T0IE = 1;
 	GIE = 1;
 	
	for( ; ;)
	{
		if ( RA4 )
		{	
			channel = CH0;
		}
		else
		{
			channel = CH1; 
		}
		set_adc_ch(channel);
		adc_delay();
		
		temp = adc_read();
		temp += adc_read();
		temp += adc_read();
		temp += adc_read();
	
		temp_real = (int) (( temp * 1.2207 ) + 0.5);
		temp1 = temp_real;
		
		if(temp1 > 1000)
		{
			digit[0] = digit[1] = digit[2] = 10;	// display error i.e."E"
		}
		else
		{
			for ( i = 0; i < 3; i++)
			{
				digit[i] = temp1 % 10;
				temp1 = temp1 / 10;
			}
		}
		// Temperature control for devices (X10, i.e 390 is 39.0)
		if ( temp_real > 390 ) 
		RC0 = 1 ;
		else 
		RC0 = 0 ;
		if ( temp_real > 400 ) 
		RC1 = 1 ;
		else 
		RC1 = 0 ;
		if ( temp_real > 420 ) 
		RC2 = 1 ;
		else 
		RC2 = 0 ;
		if ( temp_real > 500 ) 
		RC3 = 1 ;
		else 
		RC3 = 0 ;
		if ( temp_real < 350 ) 
		RC4 = 1 ;
		else 
		RC4 = 0 ;
		if ( temp_real < 320 ) 
		RC5 = 1 ;
		else 
		RC5 = 0 ;
		if ( temp_real < 300 ) 
		RC6 = 1 ;
		else 
		RC6 = 0 ;
		if ( temp_real < 250 ) 
		RC7 = 1 ;
		else 
		RC7 = 0 ;
		DelayMs(200);
	}
}
void adc_delay(void)
{
	//19 Cycles
	char n;
	for(n=0; n<2; n++)
	{
		NOP();
	}
}

void set_adc_ch(unsigned char channel)
{
	ADCON0 = channel | ADCON0_VALUE;
}

unsigned int adc_read(void)
{
	ADGO = 1;				// Start Conversion, 1 cycles
	NOP();
	while(ADGO);			// wait for conversion complete
	adc.ch[0]	= ADRESL;
	adc.ch[1]	= ADRESH;
	return adc.i;
}

void interrupt timer (void)
{
	static unsigned char display[11] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x79};
	static unsigned char d, i;
	if ( i > 2 )
	{
		d = 0b1111011;		// Only one Common Cathode display ON
		i = 0;
	}
	PORTE = 0xFF;			// Off display
	PORTB = display[digit[i]];
	PORTE = d;				// Turn on curresponding segment
	
	i += 1;
	d = d >> 1;
	TMR0 = 0;
	T0IF = 0; 
}
	
void DelayMs(unsigned char cnt)
{
	unsigned char	i;
	do {
		i = 4;
		do {
			DelayUs(250);
		} while(--i);
	} while(--cnt);
}
Skriv svar