C programmering till PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Vilka "lampor" ??

> porta = 0xf;
> trisa = 0xf;

PORTA och TRISA är 8-bitars register.
Det är lite oklart vad du sätter dom till...
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg av newbadboy »

Ska försöka förklara

Jag använder mig av Welleman kortet K8048 och Pic 16f627. På experiment kortet är 6st led kopplade till RB0-RB6. På RA0-RA4 är det 4 strömbrytare kopplade.

Det fanns ett ex i MikroC där man satte hela port B till utgångar genom att skriva portb=0 trisb=0. 0hex = 00000000binärt tänkte jag då.

Satte därför 11111111bin = 0xFF. Antog att man därför kanske kan sätt porta=0xFF trisa=0xFF för att definiera hela porta som ingångar.

oops ser nu att det ska va 0xFF inte 0xF
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> oops ser nu att det ska va 0xFF inte 0xF

Någon skillnad ?
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg av newbadboy »

nope tyvärr inte :(
Johan.o
EF Sponsor
Inlägg: 2387
Blev medlem: 18 juni 2003, 01:08:50
Ort: Jönköping

Inlägg av Johan.o »

Jag tycker det är lite lustigt att
du har if (porta.f0 == 1) utanför while(1), tycker tvärtom verkar mer riktigt.
Eller är jag helt ute och snorklar?
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg av newbadboy »

Det funkade inte heller. Har även provat if(porta==1) både i och utanför whilesatssen. Skumt skumt. Om jag tar bort själva if-satsen så blinkar dioderna i takt utan problem.



Länk till experimentkortet med ritning. Jag använder 18pins sockeln.

http://www.kjell.com/filarkiv/SUPPORTPD ... manual.pdf
Senast redigerad av newbadboy 29 september 2006, 15:44:18, redigerad totalt 1 gång.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46933
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Inlägg av TomasL »

utan att känna till vilken kompilator du använder,

Är definitionen för Port a riktig, dvs skall det vara porta eller portA eller nått liknande.

Brytarna på port A går dessa till jord eller matningen, finns det några pull-up eller pull-down på port A.

Det är tydligt att vilkoret i IF satsen inte blir uppfyllt. Kan det bero på att du inte läst på tillräckligt om hur pic'en är kopplad.
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg av newbadboy »

Använder MikroC, det finns pulldown på porta.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46933
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Inlägg av TomasL »

Olika C-Kompilatorer använder olika syntax och definitioner, eftersom jag inte använder den kompilatorn som du gör så.

om man tittar på schemat så ger det vid hand att RA4 inte är ansluten därför kan aldrig if(porta==1) bli sann eftersom det förutsätter att samtliga ingångar är 1, vilket de ej kan bli.

Om du istället använder dig av if(porta||0x01) eller if(porta&&0x01) beroende på vilken knapp(ar) du skall trycka på kan det nog fungera bättre.

Har aldrig sett "porta.F0" vad betyder det?
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jag använder PORTA.F0 (alltså versaler) till portarna, de är definierat så.

PORTA.F0 betyder PortA bit 0 i MikroC, det går tydligen inte att använda enbart '0' men det är ett minimalt problem.

Sen försöker jag även att ersätta hårdvaru-hänvisningar med ett beskrivande namn:
#define LED_Green PORTA.F0
#define LED_Red PORTA.F1
varefter man använder
LED_Green = 1;
LED_Red = 0;
Det blir, i mitt tycke, mycket enklare att "läsa" programmet. Flyttar man sedan en bit på en port är det bara att ändra den definition varpå resten av programmet är ändrat.
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg av newbadboy »

nää det gick inte. om jag provar if(porta||0x01) så blinkar det utan att jag trycker på ngn knap. det bror väl då på att ||1 är alltid uppfyllt.

Med if(porta&&0x01) är det stendött. har det ngt med min def i början kanske som är skumt?

void main(){
porta = 0xff;
trisa = 0xff; //ingång
portb = 0;
trisb = 0; //utgång

if (porta.f0==1){

while(1){


portb = ~ portb;
delay_ms(500);

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

Inlägg av sodjan »

Om du verkligen vill VETA vad din kod gör, så är det bara att studera
assembler-listan från C-kompilatorn. Det är en av de bästa metoderna
att felsöka C-kod, speciellt små "test-case"...
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Alltså, det finns en stor skillnad:
'&' är bitmässig AND
'&&' är logisk AND

PORTA & 0x01 är sant om PORTA är 'xxxxxxx1'.
PORTA && 0x01 är sant om PORTA är annat än '00000000'
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg av newbadboy »

Om man tar

if((porta.f0 ==1) || (porta.f1==1) ||............(porta.f7==1))

så borde man ju ha garderat sig, men inte fanken fungerar det ens.

Det känns nästan som om programmet inte ens tar hänsyn till vad som finns på porta, har jag verkligen def porta rätt i början?
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Testa med versaler kanske....
Inte porta men PORTA, precis om jag skrev tidigare.
C är case-sensetive och då portarna är definierat som PORTA (osv) är porta inte det samma som PORTA.
Skriv svar