Mix Postat Februarie 22, 2010 Partajează Postat Februarie 22, 2010 Salut. M-am apucat sa programez un pic16f628a. el va afisa temperatura exteriora, cea interioara si va avea un temporizator pentru becul de afara. Inca nu am facut functiile pentru senzorii de temperatura "one wire". Folosesc intreruperi iar functiile lor nu functioneaza in cazul asta. Problema este ca MCU-ul ramane la prima instructiune si nu mai face nimic. Imi vine sa inebunesc. Orice setare ii fac nu merge. Am incercat toate configurile posibile si cu cuartz si cu oscilator intern. Sa zicem ca una din configuratie pe care am folosit-o este 0x2114. Daca ii bag un soft mic doar sa aprind un led merge. Deci nu e de vina partea hardware. In simularile facute pe ISIS 7 pare sa mearga dar pana la "while". Cam asta e codul: #define button1 PORTA.RA1#define button2 PORTA.RA0unsigned short light = 0;unsigned short _light = 0;unsigned short time = 1;unsigned short time_delay = 0;unsigned short setup = 0;unsigned short setup_delay = 0;unsigned short setup_repeat = 0;unsigned short temp[2];unsigned short _temp = 0;unsigned short temp_conv = 1;unsigned short temp_delay = 0;unsigned short allow = 1;unsigned short digit_value[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};void readTemp(){ temp[0] = 10; temp[1] = 23; }unsigned short digit(unsigned short value){ return (_light || light) ? digit_value[value]+0x80 : digit_value[value];}void display(){ if (setup) { Delay_ms(1); PORTA.RA2 = 0; PORTA.RA3 = 1; PORTB = digit(time / 10); Delay_ms(2); PORTA.RA3 = 0; PORTA.RA2 = 1; PORTB = digit(time % 10); } else if (_temp) { Delay_ms(1); PORTA.RA2 = 0; PORTA.RA3 = 1; PORTB = digit(temp[1] / 10); Delay_ms(2); PORTA.RA3 = 0; PORTA.RA2 = 1; PORTB = digit(temp[1] % 10); } else { Delay_ms(1); PORTA.RA2 = 0; PORTA.RA3 = 1; PORTB = digit(temp[0] / 10); Delay_ms(2); PORTA.RA3 = 0; PORTA.RA2 = 1; PORTB = digit(temp[0] % 10); }}void interrupt(){ if (temp_conv) { temp_delay++; if (temp_delay == 254) { readTemp(); temp_delay = 0; setup = 0; time_delay++; if (time_delay == time * 7 && !_light) { time_delay = 0; light = 0; } } } else { setup_delay++; if (setup_delay == 10) { if (button1 || button2) { allow = 1; setup_repeat = 0; temp_conv = 1; } else setup_repeat++; setup_delay = 0; if (!button1 && setup_repeat == 15) { setup = 1; setup_repeat = 0; } if (!button2 && setup_repeat == 15) { _light = 1; setup_repeat = 0; } } } INTCON.T0IF = 0;}void main(){ CMCON = 0x07; TRISA = 0x13; // RA0, RA1, RA4 - input; RA2, RA3 - output TRISB = 0x00; PORTB = 0x40; OPTION_REG = 0x06; // TMR0 prescaler 1:128, internal clock (clock/4) time = EEPROM_Read(0x00); readTemp(); INTCON.GIE = 0; TMR0 = 7; Delay_ms(2000); INTCON.T0IE = 0; while (1) { if (!button1 && allow) { temp_conv = 0; TMR0 = 7; allow = 0; if (setup) { time--; if (time<1) time = 1; EEPROM_Write(0x00, time); } else { _temp = ~_temp; } } if (!button2 && allow) { temp_conv = 0; allow = 0; TMR0 = 234; if (setup) { time++; if (time>30) time = 30; EEPROM_Write(0x00, time); } else { if (_light) { _light = 0; light = 0; } if (!_light && !light) { light = 1; time_delay = 0; } } } display(); }} Mai jos este si schema. Link spre comentariu
Vizitator thenoble66 Postat Martie 1, 2010 Partajează Postat Martie 1, 2010 Codul e un pic neobisnuit, dar aparent e bun.Vezi bitii de configuratie: 0x2114 contine WDT ON.Daca vrei WDT OFF, atunci pune 0x2110.ISIS-ul are lacune serioase la afisaje cu matrice/segmente.Cu codul Tau, doar cu portiunea de afisare, cu delay de 40ms, incep sa apara cifrele. La timpi mai mici le incurca rau.Mai bine teste pe viu.thenoble66 Link spre comentariu
Vizitator thenoble66 Postat Martie 1, 2010 Partajează Postat Martie 1, 2010 Apropos: Problema este ca MCU-ul ramane la prima instructiune si nu mai face nimic.Cum iti dai seama?thenoble66 Link spre comentariu
Mix Postat Martie 1, 2010 Autor Partajează Postat Martie 1, 2010 am incarcat softul in mcu si cand alimentez afiseaza "--" (PORTB = 0x40;). m-am exprimat in repezeala. nu prima instructiune, ci mai exact a 4-a din main, apoi vine setarea prescalerului si de aici cred k nu mai face nimic. fara WDT se pare sa mearga, incercasem si asa. nu am mai avut timp zilele astea, dar ma voi uita diseara sa vad ce mai depistez. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum