Hjälp med kod för att blinka i 38kHz med 12F629

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
AnnaPanna
Inlägg: 81
Blev medlem: 19 mars 2009, 13:13:37
Ort: Stockholm

Hjälp med kod för att blinka i 38kHz med 12F629

Inlägg av AnnaPanna »

Hej alla!

Behöver lite hjälp.

Har aldrig hållit på med detta förut så har egentligen ingen aning om vad jag gör! :oops:

Har iaf lite kod:



Tanken är att jag ska få en diod att blinka med en frekvens på ca 38kHz.

Jag har använt dessa formler för att komma fram till mina olika värden:

Bild

Jag fick att TMR0=243 och att Count=2 för att få 38kHz.


Så första frågan:

Vad ska det stå på rad 14, har letat och letat och hittar liksom inte riktigt någon vettig information om Configuration bits/Word.

Andra frågan:

Rad 37, behöver jag sätta TMR0 till 243 varje iteration eller är det bara en gång?

Tredje frågan:

Kommer koden göra det jag vill? Haha :lol:

Jag inser att min #define ON 1 aldrig används.


Som sagt, är helt lost när det gäller det här, men hoppas jag är på rätt spår iaf.

Alla kommentarer mottages med tacksamhet!

Tack!

/Anna
sodjan
EF Sponsor
Inlägg: 43250
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hjälp med kod för att blinka i 38kHz med 12F629

Inlägg av sodjan »

Fråga 1: Se datablade och INC filen för processorn. Se också något kodexemple där de använder __CONFIG.

Fråga 2: Ingen aning, du får fundera på vad koden gör och se vad som är rätt.

> Alla kommentarer mottages med tacksamhet!

Lägg koden här med code-taggarna istället för på någon skum site...
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Hjälp med kod för att blinka i 38kHz med 12F629

Inlägg av bos »

AnnaPanna skrev:Andra frågan:

Rad 37, behöver jag sätta TMR0 till 243 varje iteration eller är det bara en gång?
Varje iteration. När TMR0 overflowat så kommer den att sättas till 0. Nästa overflow kommer då registret är 255 och ska gå till 0, vilket innebär att du får 256 cykler istället för dina 13 önskade.
AnnaPanna skrev: Tredje frågan:

Kommer koden göra det jag vill? Haha :lol:
Inte som den är nu. För att få den effekt du önskar ska du byta plats på rad 41 och 42, dvs flytta in ir_diode=... in i if-satsen.

Hur din config-rad ska se ut vet bara du själv. Det underlättar om du berättar vilken C-kompilator du använder, för då kan någon peka dig på en korrekt header-fil med läsbara symboler (vilket föredras) istället för att hårdkoda med siffror (vilket inte föredras).
AnnaPanna
Inlägg: 81
Blev medlem: 19 mars 2009, 13:13:37
Ort: Stockholm

Re: Hjälp med kod för att blinka i 38kHz med 12F629

Inlägg av AnnaPanna »

bos:

Ändrade koden till det här:

void main( void )
{
RP0=0; /* Bank 0 selected
TRIS0=0; /* GP0 is output
T0CS=0; /* Use internal clock
T0SE=0; /* React on rising edge
PSA=1; /* No prescaler
ir_diode=OFF; /* Diode off initially

while(1) /*Run for ever
{
TMR0=230;
while(!T0IF); /* Delay 13 times (256-230=26)
TOIF=0; /* Reset overflow flag
ir_diode=!ir_diode; /* If diod is off, turn on and vice versa
}
}

Kan det funka nu tro? Istället för att ta 2*13 tar jag 26 direkt. Koden borde bli mer exakt. Eventuellt sätta den till 25 istället.

Jag använder Cc5x och jag har läst i headerfilen, men jag hittar ingen förklaring till vad de olika "kommandona" betyder.
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Hjälp med kod för att blinka i 38kHz med 12F629

Inlägg av bos »

Jag skrev att du skulle flytta *in* i if-satsen, inte ta bort if-satsen helt.

Såhär:

Kod: Markera allt

while(1)				// Run for ever
{
    TMR0=243;
    while(!T0IF);
    Count++;
    if (Count==2) {
        Count=0;
        ir_diode = !ir_diode;
    }			
}
Ett annat tips är att när du skickar in kod till forumet, klicka på knappen "Code" under rubriken för att sätta in en kod-tagg. Det blir mer lättläst då.

Angående config-pragmat så har http://forum.sourceboost.com/index.php?showtopic=1342 en del tips i tredje inlägget:

#pragma DATA _CONFIG, _CP_OFF & _PWRTE_OFF & _WDT_OFF & _HS_OSC

Från och med "CP_OFF" osv är de värden du ställer in din PIC med. Exakt vilka nyckelord som finns hittar du i någon av CC5x:s headerfiler, och en utförlig beskrivning av vad de gör hittar du i databladet till din PIC.

CP betyder exempelvis "Code protection", PWRTE "Powerup timer enable", WDT "Watchdog timer", HS_OSC "High speed oscillator". Tyvärr har många (alla?) kompilatortillverkare olika benämning på dessa config-variabler, så man måste oftast rota i include-filerna för att få reda på exakt vad de heter.
bearing
Inlägg: 11675
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Hjälp med kod för att blinka i 38kHz med 12F629

Inlägg av bearing »

Jag rekommenderar att använda en PIC med inbyggd PWM-modul istället för 12F629

Om du ändå vill använda 12F629 tycker jag du ska göra loopen som följande kod istället. Timern är inte tillräckligt tillförlitlig för så här kort period. Testa fram rätt antal nop() eller nop2() i simulatorn i MPLAB. Med min version av kompilatorn (gratisversionen) tog varje cykel så många instruktioner som kommentaren säger.

Kod: Markera allt

	while(1) //Run for ever
	{
		ir_diode=!ir_diode; //3
		nop2(); //5
		nop2(); //7
		nop2(); //9
		nop2(); //11
 	} //13
Kommentarerna i din kod är inte slutna; en /* måste stängas med */. I CC5X går det även att göra kommentarer i C++-stil, alltså // som stängs vid radbyte.
sodjan
EF Sponsor
Inlägg: 43250
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hjälp med kod för att blinka i 38kHz med 12F629

Inlägg av sodjan »

> med inbyggd PWM-modul istället för 12F629

T.ex 12F683 som är i samma kapsel (8-pin DIP) och med en hel del andra finesser.
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Hjälp med kod för att blinka i 38kHz med 12F629

Inlägg av bos »

bearing skrev:Jag rekommenderar att använda en PIC med inbyggd PWM-modul istället för 12F629
Från urinlägget: "Har aldrig hållit på med detta förut så har egentligen ingen aning om vad jag gör!"

Med det som utgångspunkt gissar jag att en PWM-rekommendation är lite väl överkurs, även om det är i all välmening. Det är svårt att springa ett sprinterlopp innan man lärt sig krypa.
AnnaPanna
Inlägg: 81
Blev medlem: 19 mars 2009, 13:13:37
Ort: Stockholm

Re: Hjälp med kod för att blinka i 38kHz med 12F629

Inlägg av AnnaPanna »

bos skrev: Med det som utgångspunkt gissar jag att en PWM-rekommendation är lite väl överkurs, även om det är i all välmening. Det är svårt att springa ett sprinterlopp innan man lärt sig krypa.
TACK!

Det bästa av allt är att kursansvarig/projektledaren inte har någon koll alls på sånt här. :(

Vi ska redovisa detta imorgonbitti. Skitkul... :(

Jag förstod vad du mena med IF-satsen, men frågan är om den behövs... Insåg att jag hade dubblat frekvensen när jag ökade till ett delay på 26. så ändrade det... nu ser det ut så här:

Kod: Markera allt

void main( void )
{
	RP0=0;		// Bank 0 selected
	TRIS0=0;	        // GP0 is output
	T0CS=0;		// Use internal clock
	T0SE=0;		// React on rising edge
	PSA=1;		// No prescaler
	ir_diode=OFF;	// Diode off initially

  	while(1)				// Run for ever
     	{
      		TMR0=243;
		while(!T0IF);			// Delay 13 times (256-243=13)
		T0IF=0;				// Reset overflow flag
		ir_diode=!ir_diode;		// If diod is off, turn on and vice versa
	}
}
Nu borde den andra while-satsen delay:a i ca 13uS och sen nollställa overflow flaggan.
Sedan tända ir-dioden, och sen börja om.
AnnaPanna
Inlägg: 81
Blev medlem: 19 mars 2009, 13:13:37
Ort: Stockholm

Re: Hjälp med kod för att blinka i 38kHz med 12F629

Inlägg av AnnaPanna »

I det här läget kan jag inte ens krypa...
sodjan
EF Sponsor
Inlägg: 43250
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hjälp med kod för att blinka i 38kHz med 12F629

Inlägg av sodjan »

Men va f-n ! Är det skoljobb ?
Varför sa du inte det direkt, så hade man sluppit lägga tid på det.
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Hjälp med kod för att blinka i 38kHz med 12F629

Inlägg av bos »

Det ser korrekt ut.

Saknas gör nu bara config-bitarna.
sodjan
EF Sponsor
Inlägg: 43250
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hjälp med kod för att blinka i 38kHz med 12F629

Inlägg av sodjan »

> Saknas gör nu bara config-bitarna.

Bara att RTFM.
bearing
Inlägg: 11675
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Hjälp med kod för att blinka i 38kHz med 12F629

Inlägg av bearing »

AnnaPanna: Om oscillatorn oscillerar i 4 Mhz kommer koden du visar ge en frekvens på bara halva önskade frekvensen. Du önskar att en hel period, både tändning och släckning, ska ske på 26 mikrosekunder. Men koden gör att lysdioden växelvis är tänd 26 mikrosekunder och sedan släckt 26 mikrosekunder.
bearing
Inlägg: 11675
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Hjälp med kod för att blinka i 38kHz med 12F629

Inlägg av bearing »

Tillägg:
Det beror på att: förutom de 13 mikrosekunder som går mellan att värdet 243 laddas i TMR0 och att T0IF sätts, tar instruktionerna i loopen tid att exekvera. Sammanlagda tiden för ett varv i loopen blir 26 mikrosekunder.

Anledningen till att jag föreslog en loop med flera nop() (no operation) var för att skapa loop som tar 13 mikrosekunder per varv enbart från tiden instruktionerna tar att exekvera.
Skriv svar