PIC16F871 7segment displey problem

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
Vuzee01
Posts: 14
Joined: 19-03-2016, 10:05

PIC16F871 7segment displey problem

Post by Vuzee01 »

Prije svega evo vam video pogledajte da bude jasnije pa onda procitajte gdje je problem: https://youtu.be/yxoxfAunscI

Pozdrav svima, napravio sam kod koji mi u simulacija radi perfektno, a to je da na 7 segmentnom dispelju broji do 45min pa da se resetuje, e sad ovo je problem kada ga upisem u pic16f871 desava mi se sljedece: Skroz zadnji segment nece da radi i kada ga upisem vise ne mogu da obrisem nista iz tog pica niti da obrisem niti da verifikujem pic...

KOD:

Code: Select all

// Program Timer.c (PIC16F871@4MHz)

#include <PIC.h>
#include "util.h"

//__CONFIG (WRTDIS & LVPDIS & BORDIS & PWRTDIS & WDTDIS & XT);
__CONFIG(CP_OFF  & BOREN_OFF & WDTE_OFF & PWRTE_ON & FOSC_HS );

#define DP3			A3 // cifra najmanje tezine
#define DP2			A2
#define DP1			A1
#define DP0			A0 // cifra najvece tezine (minute)
#define TASTER1	4		//
#define TASTER2	2		//
#define TASTER3	1		//
#define TST_DLY	15
#define RELE1		RD6
#define RELE2		RD7
#define SET_DLY	60 		// 1 min. u sekundama (kasnjenje za rele2)

#define DISPL_REFR	2	// svake druge ms ide refr na sljedecu cifru, znaci 1000/2/4 = 125Hz

#define IN 			1
#define OUT 		0
#define TRUE 		1
#define FALSE		0

#define T_TICK		6	// Timer se okida svakih 1000us = 1ms na 4MHz

// Displej sa RB0-a...RB7-dp
const char sseg[]={0b01111110,0b00110000,0b01101101,0b01111001,0b00110011, // 01234
				   0b01011011,0b01011111,0b01110000,0b01111111,0b01111011,0b00000001,0b00010111}; // 56789-h

//const char sseg[]={0b11111100,0b01100000,0b11011010,0b11110010,0b01100110, // 01234
//				   0b10110110,0b10111110,0b11100000,0b11111110,0b11110110, 0b00000010, 0b00101110}; // 56789-h

volatile char Digits[9];
volatile char displ_refr, f, nxdp;
volatile unsigned char minute, sekunde, RE2_delay;
volatile unsigned int ms, sek_tik, timeout;
volatile bit Odbrojavanje, End_flag = FALSE;

void IO_inic(void)
{
	ADCON1 = 7;			// svi analogni ulazi su iskljuceni
	PORTA = PORTB = PORTC = PORTD = 0;
	TRISA = 0;
	TRISB = 0;
	TRISC = 0x0F;
	TRISD = 0;
	
   	T0CS = 0;					// Timer se pov. na instr. klok
	PSA = 1;		       		// preskaler dodijeljen WATCHDOG-u
	PS2=1;  PS1=1;  PS0=0;		// setujemo dijeljenje sa 64 za WD

	T0IF = 0;
	T0IE = 0; 

	T2CON = 0b00000101;   // TMR2 ON, presk 1:4
	TMR2IF = 0;	
	TMR2IE = 1;

	PEIE = 1;				// PERIPHERAL INT. ENABLE bit - radi TMR2 mora biti omogucen!
   	GIE=1;					// global enable interrupts
}

void delay(unsigned int pauza)
{
	ms = pauza;
	while (ms)
		CLRWDT();
}

void SetDigits(void)
{
	Digits[1] = sseg[minute / 10];
	Digits[2] = sseg[minute % 10] | 0x80;	// ukljucujemo tacku iza druge cifre
	Digits[4] = sseg[sekunde / 10];
	Digits[8] = sseg[sekunde % 10];
}


bit PTaster(const char taster)
{
char debounce;

	debounce = 350;
	do{
		if (PORTC & taster)
			return FALSE;
		CLRWDT();
	}while(--debounce);
	return TRUE;
}

void main(void)
{
	IO_inic();
	RELE1 = RELE2 = 0;
	displ_refr = DISPL_REFR;
	TMR2 = T_TICK;
	sek_tik = 1000;							// sekunda je 1000ms
	Odbrojavanje = End_flag = FALSE;
	RE2_delay = SET_DLY;
	minute = 0; sekunde = 0;

	while(1){
	    	SetDigits();
	    	delay(5);
		/*if (PTaster(TASTER1)){			
			if (!Odbrojavanje){				
				if(++minute > 59)			
					minute = 0;
			    	SetDigits();
				timeout = 350;
				while(PTaster(TASTER1)){
					CLRWDT();    	      
					if (timeout == 0){
						break;
					}
				}
			}
		}
*/
		if (PTaster(TASTER2)){						// reset
			if (!Odbrojavanje){
					sekunde = 0;
					minute = 0;
			    	SetDigits();
			    	while(PTaster(TASTER2)){
			    		CLRWDT();
				}				
			}
		}
		
		if (PTaster(TASTER3)){					// TAST3
			Odbrojavanje = !Odbrojavanje;			// Start/Stop tajmera
			if(Odbrojavanje) RELE2 = RELE1 = 1;
			else RELE1 = 0;
			while(PTaster(TASTER3))
				CLRWDT();          		// cekaj da krkan pusti taster
		}
		
		if (End_flag){	// isteklo vrijeme tajmera;
			RELE1 = 0;
			End_flag = FALSE;
		}
		CLRWDT();
	}
}

static void interrupt rtcc_handler(void)
{
	if (TMR2IF){
		TMR2 = T_TICK;			// load TMR2
	   
		if (ms)					// za delay funkciju
			--ms;

		if (timeout)				// za autoripit
			--timeout;

		if (--sek_tik == 0){				// odbrojavanje sekundi
			sek_tik = 1000;
			if (Odbrojavanje){
				RE2_delay = SET_DLY;
				++sekunde;
				if(sekunde == 60){
					if (minute >= 0){		// odbrojavanje minuta
						++minute;
						sekunde = 0;
					}
					if (minute >= 45 && sekunde == 0){
						Odbrojavanje = FALSE;                 // STOP - vrijeme isteklo
						minute = 0;
						sekunde = 0;
						End_flag = TRUE;
   					}
				}
			}			
	            if(--RE2_delay == 0)
		    		RELE2 = 0;
		}
		
		if (--displ_refr == 0){
			displ_refr = DISPL_REFR;
			PORTA = PORTA & 0xF0;			// gasenje svih displ.
			PORTB = Digits[nxdp];			// setovanje znaka na diispleju i
			PORTA |=  nxdp;				// ukljucivanje odgovarajuce cifre
			if ((nxdp >>= 1)==0) nxdp = 8;	// nxdp se setuje za sljedecu cifru
		}
		TMR2IF = 0;	// reset int. flega za TMR2
	}	
}
simulacija od proteus 8 download: https://www.sendspace.com/file/rlhx3e

U simulaciji imam 2 dugmeta start/stop i drugo reset i kada stisnem start radi sve perfekt a kada sam u PIC upisao prvo treba da stisnem RC2 pa tek onda moram drzati RC1 da tajmer ide i opet ne vidim donji segment.

SLIKA: http://prntscr.com/ai643j

ovaj kod sam skinuo sa: http://www.elektronika.rs.ba/data/projekti/pic_rs/
ima dolje pise Uputstvo i softver za PIC razvojni sistem 16MB zauzima pa ima folder cpprimjeri pa u njemu se nalazi folder Timer odakle mi je taj gore kod, i taj hex radi dobro ali ja kada kompaliram opet to izbaci mi error za konfiguraciju pa sam ja dodao drugu konfiguraciju da nije do nje:

Code: Select all

__CONFIG(CP_OFF  & BOREN_OFF & WDTE_OFF & PWRTE_ON & FOSC_HS );
SLIKA CONFIGA: http://prntscr.com/ai6d0w
cak kada u configu ostavim samo FOSC_HS opet radi LED display ali ne radi segment...

ne znam do cega moze biti :S
Vuzee01
Posts: 14
Joined: 19-03-2016, 10:05

Re: PIC16F871 7segment displey problem

Post by Vuzee01 »

Testirali smo takodje sa osciloskopom dali ima signala na izlazu, taj segnem sto ne radi on je RB3 ili 36 PIN, i na njemu nema signala tj nema oscilovanja a na ostalima ima, a buni me isto zasto moram prvo da stisnem rc1 pa onda rc0 drzati da bi brojalo a tako nije na simulaciji, mislili smo da je do PIC-a ali nije probali smo jos jedan takav i jos 2 PIC16F877A i isto se desava...
Vuzee01
Posts: 14
Joined: 19-03-2016, 10:05

Re: PIC16F871 7segment displey problem

Post by Vuzee01 »

UPDATE #3

mislim da sam sredio sta je, sutra kada odem u skolu testiracu pa javim, a umjedjuvremenu ako vec vi znate do cega je ili prjedloge pisite....

Moje misljenje: kada sam usporedio config od orginalne verzije ovog koda i svoj konfig vidio sam da su daleko drugaciji, sada sam podesio isti konfig kao i na orginalnoj verziji i on izgleda ovako:

Code: Select all

__CONFIG(CP_OFF  & BOREN_ON & WDTE_OFF & PWRTE_OFF & BOREN_OFF & FOSC_XT & CPD_OFF & LVP_OFF);
Nadam se da se ovo raditi! :)
User avatar
WhiteHead
Pravi forumaš
Pravi forumaš
Posts: 1625
Joined: 28-06-2007, 18:36
Location: 75,35k; B&H

Re: PIC16F871 7segment displey problem

Post by WhiteHead »

U istoj naredbi za CONFIG stavio si BOREN i na ON i na OFF.
Treba da znaš da (uglavnom) svaki PIC ima drugačiji konfiguracioni bit.
Ako kaniš pobijediti, ne smiješ izgubiti
Vuzee01
Posts: 14
Joined: 19-03-2016, 10:05

Re: PIC16F871 7segment displey problem

Post by Vuzee01 »

WhiteHead wrote:U istoj naredbi za CONFIG stavio si BOREN i na ON i na OFF.
Treba da znaš da (uglavnom) svaki PIC ima drugačiji konfiguracioni bit.
Hmmm sada sam primjetio, hvala :)
Vuzee01
Posts: 14
Joined: 19-03-2016, 10:05

Re: PIC16F871 7segment displey problem

Post by Vuzee01 »

Hmm, imali smo u skoli PIC16f8771 i PIC16F877A i kada sam u njih upisao program onaj gore, sto sam prvi kod postavio i vise nije moguce da se upise nista na te PICove znaci nista nije moguce, da nije do onog gore prvog configa ili?

Testiracu ovaj novi config kada stignu PICovi posto smo sada ostali bez njih :D
Vuzee01
Posts: 14
Joined: 19-03-2016, 10:05

Re: PIC16F871 7segment displey problem

Post by Vuzee01 »

Uzeo sam neki PIC sa manje pinova, ne znam tacno koji je i na njemu ovaj kod sa novom konfiguracijom odlicno radi! ovdje moze lock! :)
User avatar
WhiteHead
Pravi forumaš
Pravi forumaš
Posts: 1625
Joined: 28-06-2007, 18:36
Location: 75,35k; B&H

Re: PIC16F871 7segment displey problem

Post by WhiteHead »

Vuzee01 wrote:Uzeo sam neki PIC sa manje pinova, ne znam tacno koji je
Bez ljutnje, ali iz ove rečenice se vidi prilično površan pristup poslu.
Bilo koji od tih PIC-eva bi radio, samo moraš pročitati datašit i vidjeti šta mu se sve u CONFIG bitu mora isključiti ili uključiti
Ako kaniš pobijediti, ne smiješ izgubiti
Post Reply