Har gjort ett litet program i CCS C till en 12F675. Direkt efter att jag programmerat kretsen fungerar det som det ska, men slår jag av och på strömmen till PIC:en fungerar det inte korrekt?
#include <12F675.h>
#include "more.inc"
#device ADC=10
#fuses INTRC_IO,NOWDT,NOPUT,NOPROTECT,NOCPD,NOMCLR
#use delay(clock=4000000)
#define GP0 PIN_A0
#define GP1 PIN_A1
#define GP2 PIN_A2
#define GP3 PIN_A3
#define GP4 PIN_A4
#define GP5 PIN_A5
int8 irlevel;
void init()
{
set_tris_a( 0b11100111 ); // set GP4 output, all other inputs
setup_comparator( NC_NC_NC_NC ); // disable comparators
setup_adc_ports( NO_ANALOGS ); // disable analog inputs
setup_adc( ADC_OFF ); // disable A2D
}
main()
{
init();
output_high(GP4); // turn LED off
irlevel = input(GP2); //Check level on irsensor
while (irlevel)
{ //Wait until an ir-signal is received
irlevel = input(GP2);
}
while ( TRUE )
{
output_high(GP4); // turn LED off
delay_ms( 250 ); // wait 250ms
output_low(GP4); // turn LED on
delay_ms( 250 ); // wait 250ms
}
}
På GP2 är en IR-mottagare ansluten, på GP4 sitter en led. Efter programmering är dioden släckt, och när en ir-signal mottas börjar den blinka. Precis som jag tänkt. Om jag sedan gör en powercycle så är dioden tänd från början och man kan inte se om ir-signalen detekteras. Antar att processorn inte startar på samma ställe om man gör en powerreset som när man använder MCLR (vilket programmeraren gör?)?
Den där fuse: NOMCLR läser jag till No Master Clear ... tror att den kan ha ganska mycket med det att göra. Men du säger inget om hur du har kopplat MCLR och det kan ju vara ganska besvärligt att rådge då.
Till VCC och vill du koppla till programmeraren kan du sätta en 10-47K motstånd mellan MCLR och VCC, då kan du koppla programmeraren direkt till MCLR och köra på utan problem.
Hmm typiskt mig att inte läsa särskilt noga
Enligt databladet ska resistorn vara 1k eller större, jag hade en 4k7 liggande som jag provat med. Men det fungerar inte ändå.... MCLR ligger på 3.3V och dioden tänds direkt, vare sig jag använder NOMCLR eller MCLR. Får väl leta rätt på en 0.1uF att koppla in oxå...
Det helt avgörande är *VILKEN* programmerare du har.
De flesta ICSP programmerare (inkl WIsp628) har problem med
12Fxxx om man kör med "internal-MCLR". Se : http://www.jescab.se/InternMCLR.html
Kan du programmera PIC'en mer än en gång (utan fel) ?
Om du kör med NOMCLR (vilket antar jag betyder "internal-MCLR") så
ska MCLR pinnen *INTE* anslutas någonstans mer än dit den skall
vara som I/O pinne (enbart ingång). Om du *INTE* behöver MCLR som
ingång, så kör med den som MCLR, det underlättar för programmeraren.
Jag använder en DIY-149 (http://www.voti.nl/shop/catalog.html?K-DIY-149).
Att programmera kretsen upprepade gånger är inga problem. Jag har testat med båda varianterna för MCLR enligt CCS-manualen:
NOMCLR Master Clear pin used for I/O
MCLR Master Clear pin enabled
Men inget av dessa fungerade.
Nu har jag testat att ansluta den .1u kondensator till MCLR som i manualen beskrivs som 'optional, not critical', och nu fungerar det! Är inte helt med på varför det fungerar, det borde fungera utan dessa komponenter om man anger NOMCLR...
Det står att om man använder internoscillator eller RC-nät så stänger /MCLR av denna oscillator. Om detta gäller oberoende av MCLRE i konfigurationsregistret framgår inte klart. MCLR skall har 0.8Vcc för att det säkert uppfattas som Vih. Den skall inte kopplas direkt till V+, då kan det säga tjoff enligt databladet beroende på annorlunda ESD-skydd på denna pinne eftersom den skall kunna anslutas till Vpp... Den är också känslig för transienter som drar den under GND, det kan orsaka latchup med åtföljande stora strömmar och bränd krets.
Om MCLR-pinnen är konfigurerad (via CONFIG registret) till att *inte*
vara "reset" (utan en digital ingång), så har den inte heller någon
reset-funktion, så klart. Dvs att den ska inte stoppa någonting.
Sen får man ju hoppas att CCS inte har en bugg i just denna hantering.
Det kan kollas genom att titta i HEX filen vad som ligger i adressen
för CONFIG registret...
Ta gärna med PWRTE (ingen aning om vad det heter i CCS) !
Vad har du för avkoppling kring PIC'en för övrigt ?
Vad har du för spänningsmatning ?
Sant, MCLR borde inte ha någon resetfunktion. Jag gjorde som så att jag laddade koden i programmeringsmjukvaran och kollade inställningarna för Fuses. Med NOMCLR angivet i koden blir MCLRE disabled, ändrar jag koden till MCLR blir MCLRE enabled. Så koden verkar ju funka i alla fall!?
PWRTE kallas PUT i CCS C, denna används inte ('NOPUT').
Avkopplingen består av en 0.1uF alldeles intill matningspinnarna, spänningsmatningen tas från programmeraren där den regleras av ett par 78XX kretsar. Inte mycket till kondensatorer i programmeraren, men den fungerar fint så matningen borde vara bra.