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
}
}
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 );
cak kada u configu ostavim samo FOSC_HS opet radi LED display ali ne radi segment...
ne znam do cega moze biti :S