Sida 1 av 1
Blink a led fail - HI-TEC C -> PIC 16F648A
Postat: 21 oktober 2010, 00:47:19
av RoXa
Jag är en total nybörjare på microcontrollers och tänkte att "blink a led" vore ett lagom steg att börja med. Kopplade upp simplaste möjliga kretsen där pinne RA1 är kopplad till en diod och motstånd. Jag har skrivit ett litet primitivt program som ska blinka leden enligt:
Kod: Markera allt
#include <htc.h>
#define _XTAL_FREQ 4000000
// Config: ext reset, no code protect, no brownout detect, no watchdog,
// power-up timer enabled, 4MHz int clock
__CONFIG(MCLREN & UNPROTECT & BORDIS & WDTDIS & PWRTEN & INTIO);
void main()
{
TRISA = 0b11111101; // configure GP1 (only) as an output
for (;;) { // loop forever
RA1 = 1;
__delay_ms(500);
RA1 = 0;
__delay_ms(500);
}
}
Det enda som händer är att dioden lyser
hela tiden. Förutom när jag håller ett finger på resistorn, då blinkar den som den ska. Jag fattar inte vad jag har missat. Någon som kan hjälpa en noob på vägen?
Re: Blin a led fail - HI-TEC C -> PIC 16F648A
Postat: 21 oktober 2010, 00:59:55
av sodjan
Börja med en komplet beskrivning.
Hur har du kopplat (allt, och speciellt MCLR och PGM).
Programmerare ? Går programmeringen bra ?
Din CONFIG saknas en del, t.ex LVP. Se till att den
är avslagen (eller kopplad till jord/gnd).
Re: Blin a led fail - HI-TEC C -> PIC 16F648A
Postat: 21 oktober 2010, 01:17:22
av RoXa
MCLR är kopplad till jord via ett 4.7k motstånd. PGM är inte kopplad till något. Kretsen matas med 5v (Vdd) och 0 (Vss).
Programmeraren är en PicKit3 och är inkopplad via fem trådar, LVP har jag inte kopplat.
Testade att sätta LVPDIS och nu fungerar det. Tack Sodjan, pricksäkert! (varför? Jag använder ju inte PGM pinnen?)
Re: Blin a led fail - HI-TEC C -> PIC 16F648A
Postat: 21 oktober 2010, 10:07:27
av Icecap
MCLR ska vara kopplat till VDD via ett 10k motstånd!
Re: Blin a led fail - HI-TEC C -> PIC 16F648A
Postat: 21 oktober 2010, 10:37:17
av RoXa
Det är den, felskrivet av mig igår natt.
Re: Blin a led fail - HI-TEC C -> PIC 16F648A
Postat: 21 oktober 2010, 10:52:37
av sodjan
> Testade att sätta LVPDIS och nu fungerar det. Tack Sodjan, pricksäkert! (varför? Jag använder ju inte PGM pinnen?)
Om du inte sätter LVPDIS så antar jag att den är "enabled" !?
D.v.s att PGM pinnen kommer att används som LVP-pinne. Då gäller
det att se till att lägga den till jord annars får man problem...
Rätt metod är naturligstvis att stänga av LVP helt om man inte använder det.
När du rörde fingeret i närheten av processorn så kände PGM/LVP pinnen
av det och gav de lite underliga fenomenen. Man får samma sak om
MCLR inte är ansluten. Och igentligen får du det på alla andra
pinner som är ingångar och oanslutna. Fungerar antagligen i denna
test, men om det vore "på riktigt" så ska man aldrig lämna CMOS-ingångar
oanslutna, Googla på "open CMOS input" eller liknande så ser du mer om det.
Re: Blin a led fail - HI-TEC C -> PIC 16F648A
Postat: 21 oktober 2010, 12:11:33
av RoXa
Tack för tipset!
Jag utökade programmet lite i morse med en if-sats och då blev det samma fenomen som i går natt. Dioden lyser starkt och fint men blinkar inte, så jag dummade ner koden för att testa if-satsen. Det enda som händer är att den aldrig går in i if-satsen.. Varför?
Kod: Markera allt
#include <htc.h>
#define _XTAL_FREQ 4000000
// Config: ext reset, no code protect, no brownout detect, no watchdog,
// power-up timer enabled, 4MHz int clock
__CONFIG(MCLREN & UNPROTECT & BORDIS & WDTDIS & PWRTEN & INTIO & LVPDIS);
void main()
{
TRISA = 0b00000000; // configure PORTA as output
RA1 = 1;
while (1) { // loop forever
if(RA1 == 1)
{
RA1 = 0;
__delay_ms(500);
RA1 = 1;
__delay_ms(500);
}
}
}
Re: Blin a led fail - HI-TEC C -> PIC 16F648A
Postat: 21 oktober 2010, 12:36:50
av sodjan
Vad är kopplat på RA1 ??
Var det ine lysdioden ?
Vad är det du vill göra ?
SKRIV EN KOMMENTAR vid IF-satsen så vi ser vad du tänkte...
Re: Blin a led fail - HI-TEC C -> PIC 16F648A
Postat: 21 oktober 2010, 12:52:25
av RoXa
Kod: Markera allt
#include <htc.h>
#define _XTAL_FREQ 4000000
// Config: ext reset, no code protect, no brownout detect, no watchdog,
// power-up timer enabled, 4MHz int clock
__CONFIG(MCLREN & UNPROTECT & BORDIS & WDTDIS & PWRTEN & INTIO & LVPDIS);
void main()
{
TRISA = 0b00000000; // configure PORTA as output
RA1 = 1; // RA1 är kopplad till en lysdiod via en resistor, sätts till ett och börjar lysa.
while (1) { // loop forever
if(RA1 == 1) //If-satsen ska bara testas då detta villkor aldrig tycks uppfyllas
{
RA1 = 0; //Släck dioden och vänta 0.5s
__delay_ms(500);
RA1 = 1; //Tänd dioden och vänta 0.5s, gå därefter tillbaka till if-satsen och testa villkoret
__delay_ms(500);
}
}
}
Problemet är att if-satsens villkor aldrig tycks bli uppfyllt.. Dioden lyser kontinuerligt.
Re: Blin a led fail - HI-TEC C -> PIC 16F648A
Postat: 21 oktober 2010, 13:11:07
av Icecap
Vissa kompilatorer kan ha problem med t.ex. "if(RA1 == 1)".
RA1 är ju port A, bit 1 och den kan vara 0 eller 2 varför det är dålig programmering att skriva sånt. Skriv istället:
if(RA1)
Om man vill testa om RA1 == 0 skriver man:
if(!RA1)
Men just på PIC omvandlas den till en BTFSx-kommando så där brukar det fungera men jag har upplevd andra ställen där sekvensen verkade vara att porten avlästes, den "skyldiga" bit maskades ut och slutvärdet då jämfördes och då blir det just 0 eller 2, aldrig 1.
Testa att ändra, man vet aldrig...
Re: Blin a led fail - HI-TEC C -> PIC 16F648A
Postat: 21 oktober 2010, 13:21:57
av RoXa
Det fungerade inte heller, det tycks som att RA1 är noll för kompilatorn oavsett vad för värde den sätts till. Jag bytte ut koden runt if-satsen
Kod: Markera allt
#include <htc.h>
#define _XTAL_FREQ 4000000
// Config: ext reset, no code protect, no brownout detect, no watchdog,
// power-up timer enabled, 4MHz int clock
__CONFIG(MCLREN & UNPROTECT & BORDIS & WDTDIS & PWRTEN & INTIO & LVPDIS);
void main()
{
TRISA = 0b00000000; // configure PORTA as output
RA1 = 0; // RA1 är kopplad till en lysdiod via en resistor, sätts till 0, dioden släckt.
while (1) { // loop forever
if(RA1 == 0) //If-satsen ska bara testas
{
RA1 = 0; //Släck dioden och vänta 0.5s
__delay_ms(500);
RA1 = 1; //Tänd dioden och vänta 0.5s, gå därefter tillbaka till if-satsen och testa villkoret
__delay_ms(500);
}
}
}
Och nu fungerar det, dioden blinkar. Men enligt koden borde villkoret ha blivit underkänt andra gången loopen snurrade. Mystiskt
EDIT: fixade kommentarerna så att de inte blev missvisande
Re: Blink a led fail - HI-TEC C -> PIC 16F648A
Postat: 21 oktober 2010, 13:46:59
av H.O
RA1 är även kopplad till komparatorn och om du inte "kopplar om" det genom att sätta CMCON registret korrekt så läsed RA1 som 0 oavsett nivån på den fysiska pinnen. Se
datablad sektion 5.1 och 10.
Re: Blink a led fail - HI-TEC C -> PIC 16F648A
Postat: 21 oktober 2010, 13:52:10
av sodjan
H.O har helt rätt.
Han man inte läst databladet och förstått det så fungerar det inte.
RA0 *läses* alltid som "0" (så som koden är skriven nu).
Men oavsett det, *VAD* är det igentligen du vill ha gjort med
den där IF satsen ? Alltså varför finns den där IF satsen där
överhuvudtaget ? Vad gör den för nytta ? Läget på RA1 är
ju alltid känt efter en sväng genom koden i alla fall...
Re: Blink a led fail - HI-TEC C -> PIC 16F648A
Postat: 21 oktober 2010, 14:13:00
av RoXa
Självklart har jag hela tiden ett finger i databladet. Men som nybörjare är det tämligen många parametrar att hålla ordning på. Jag är djupt tacksam för all hjälp. Jag satte CMCON = 0x07; och nu fungerar allt som det var tänkt, tack H.O!
Sodjan: Som jag skrev ovan har if-satsen ingen funktion, grejen vat att jag skrev en kodsnutt innan som var beroende av vilkoret RA1 == 1, men det fungerade ju inte som jag ville så då gjorde jag denna "dummie" kod för att visa på problemet. Trodde jag hade gjort klart det.
Nu fungerar allt för tillfället och jag är riktigt glad att ni tog er tid:)
Re: Blink a led fail - HI-TEC C -> PIC 16F648A
Postat: 21 oktober 2010, 14:29:01
av sodjan
Det är ganska tydligt i PORTA kapitlet :
"When selected as a comparator input, these pins will read as ‘0’s."
Och "EXAMPLE 5-1:" på samma sida har också ett exempel på
vad som behöver göras (alltså CMCON = h'07').
Sen så är detta i och för sig förtydligat i senare datablad, t.ex 16F886
har detta angivet på PORTA-sidan i en extra tydlig grå liten ruta :
"Note: The ANSEL register must be initialized to configure an analog channel
as a digital input. Pins configured as analog inputs will read ‘0’."
Men visst, ca hälften av alla som börjar med PIC gör exakt samma miss...
