Blink a led fail - HI-TEC C -> PIC 16F648A

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
RoXa
Inlägg: 160
Blev medlem: 25 september 2005, 20:51:39
Ort: Göteborg

Blink a led fail - HI-TEC C -> PIC 16F648A

Inlägg 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?
Senast redigerad av RoXa 21 oktober 2010, 13:35:17, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Blin a led fail - HI-TEC C -> PIC 16F648A

Inlägg 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).
RoXa
Inlägg: 160
Blev medlem: 25 september 2005, 20:51:39
Ort: Göteborg

Re: Blin a led fail - HI-TEC C -> PIC 16F648A

Inlägg 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?)
Användarvisningsbild
Icecap
Inlägg: 26658
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Blin a led fail - HI-TEC C -> PIC 16F648A

Inlägg av Icecap »

MCLR ska vara kopplat till VDD via ett 10k motstånd!
RoXa
Inlägg: 160
Blev medlem: 25 september 2005, 20:51:39
Ort: Göteborg

Re: Blin a led fail - HI-TEC C -> PIC 16F648A

Inlägg av RoXa »

Det är den, felskrivet av mig igår natt.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Blin a led fail - HI-TEC C -> PIC 16F648A

Inlägg 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.
RoXa
Inlägg: 160
Blev medlem: 25 september 2005, 20:51:39
Ort: Göteborg

Re: Blin a led fail - HI-TEC C -> PIC 16F648A

Inlägg 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); 
		}
    }
}
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Blin a led fail - HI-TEC C -> PIC 16F648A

Inlägg 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...
RoXa
Inlägg: 160
Blev medlem: 25 september 2005, 20:51:39
Ort: Göteborg

Re: Blin a led fail - HI-TEC C -> PIC 16F648A

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26658
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Blin a led fail - HI-TEC C -> PIC 16F648A

Inlägg 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...
Senast redigerad av Icecap 21 oktober 2010, 14:16:36, redigerad totalt 1 gång.
RoXa
Inlägg: 160
Blev medlem: 25 september 2005, 20:51:39
Ort: Göteborg

Re: Blin a led fail - HI-TEC C -> PIC 16F648A

Inlägg 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
H.O
Inlägg: 5919
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Re: Blink a led fail - HI-TEC C -> PIC 16F648A

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Blink a led fail - HI-TEC C -> PIC 16F648A

Inlägg 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...
RoXa
Inlägg: 160
Blev medlem: 25 september 2005, 20:51:39
Ort: Göteborg

Re: Blink a led fail - HI-TEC C -> PIC 16F648A

Inlägg 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:)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Blink a led fail - HI-TEC C -> PIC 16F648A

Inlägg 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... :-)
Skriv svar