C programmering till PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg av newbadboy »

Jag har testat med PORTA men det vill inte. Det kluriga är att jag kan leka hursom med portb Tex PORTB.f2 och bara tända den biten utan några problem. Jag kan tända led i alla tänkbara kombinationer, bara så länge det inte beror på portA. Så jävla skumt. Lite tråkigt, nu har jag strulat med detta i ca en vecka. :(
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Nu har jag inte kolla databladet men på många PIC är det kopplat antingen AD eller komparatorer på porta och de ska slås av innan man har digital tillgång till porten.
Användarvisningsbild
Xyzzy
Inlägg: 1260
Blev medlem: 30 januari 2004, 22:31:07
Ort: Uppsala, Sweden

Inlägg av Xyzzy »

I vissa C-kompilatorer ska man använda "PINB" för att läsa porten, vet inte om det är så i den kompilator du använder, men kanske värt ett test?
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Och i MikroC är det PORTA!

newbadboy: Databladet (40044D.pfd), sid 31, den gråa "note"-rutan! Kanske dags att läsa databladet ordentligt?
Senast redigerad av Icecap 30 september 2006, 15:27:54, redigerad totalt 1 gång.
Användarvisningsbild
Xyzzy
Inlägg: 1260
Blev medlem: 30 januari 2004, 22:31:07
Ort: Uppsala, Sweden

Inlägg av Xyzzy »

Okay, bra att veta, då är det väl inget som han behöver testa iaf :)
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg av newbadboy »

NU funka det ju, ja det är ju lättare när man vet vad man ska kolla efter i databladet.... måste skriva ut det på papper. Det värsta jag vet är att läsa större datablad på skärmen.

Tack
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Du är inte den första som går i den fälla, det finns MÅNGA innan.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Det värsta jag vet är att läsa större datablad på skärmen....

Kanske det, men nu gäller det ju bara databladet för 16F628A, inget
av de *större* databladen. Dessutom igentligen bara de 2-3 sidor
där info om portarna står.

> Lite tråkigt, nu har jag strulat med detta i ca en vecka.

Glöm inte de som du dessutom har engagerat här... :-)
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46933
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Inlägg av TomasL »

newbadboy skrev:NU funka det ju, ja det är ju lättare när man vet vad man ska kolla efter i databladet.... måste skriva ut det på papper. Det värsta jag vet är att läsa större datablad på skärmen.

Tack
Det var ju det vi sa i början, läs databladen först, lär dig dem, pula sedan, mycket enklare, och en sak till, läs Erratan, mycket viktigare än databladen faktiskt.
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg av newbadboy »

Jaha nu har ett nytt problem dykt upp. Varje gång den första if satsen används så blir det ett dubbelblink. Med samma frekvens som else satsen. Det verkar alltså som det hela tiden hoppar in vidare till else satsen och utför den en gång/blinkning så att säga. Detta sker INTE med den andra if satsen. Hmmmm, vad har jag missat?






void main(){



CMCON = 0x07; //stäng av komparator funktion på RA
PORTA = 0xff;
TRISA = 0xff; //ingång
PORTB = 0;
TRISB = 0; //utgång




while(1){


if (PORTA.f0 == 1){

PORTB.f1 = 0;
delay_ms(200);
PORTB.f1 = 1;
delay_ms(200);
}

if (PORTA.f1 == 1){

PORTB.f1 = 0;
delay_ms(200);
PORTB.f1 = 1;
delay_ms(200);
}

else {

PORTB.f1 = 0;
delay_ms(500);
PORTB.f1 = 1;
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 »

Du har skrivit :

först :

om <något> gör <1>

och sedan :

om <något_annat> för <2> annars <3>.

<2> *eller* <3> kommer *alltid* att urföras.

Kan du beskriva igen vad som gå fel ?
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg av newbadboy »

Portbf1 skall blinka med olika frekvenser beroende på knaptryckningar.

om ingen knapp är nedtryck skall den blinkas av else satsen. om jag trycker ner PORTA.f1 så blinkar den som den skall.

Trycker jag däremot ner PORTA.f0 så blinkar den elsesatsen varannan gång och ifsatsen varannan gång. (ser det ut som)

Jag vill inte att den överhuvudtaget skall hoppa in i elsesatsen om jag har ngn knapp nedtryckt.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Om f1 inte är nertryck (=0) så körs else satsen, så som du har skrivit det.
Oavsett vad som händer med f0...

Prova (om det är så du vill ha det) :

Kod: Markera allt

 if (PORTA.f0 == 1) or (PORTA.f1 == 1){

PORTB.f1 = 0;
delay_ms(200);
PORTB.f1 = 1;
delay_ms(200);
}

else {

PORTB.f1 = 0;
delay_ms(500);
PORTB.f1 = 1;
delay_ms(500);
}
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Inlägg av newbadboy »

Tyvärr lurade jag nog dig lite...

När programmet väl skall användas så skall PORTA.f0 och PORTA.f1 generera olika frekvenser. Det är därför jag har två if satser. Sorry my bad
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, och en tredje frekvens om *ingen* knapp är nedtryckt ??

Kanske :

Kod: Markera allt

if (PORTA.f0 == 1){

PORTB.f1 = 0;
delay_ms(200);
PORTB.f1 = 1;
delay_ms(200);
}

else if (PORTA.f1 == 1){

PORTB.f1 = 0;
delay_ms(200);
PORTB.f1 = 1;
delay_ms(200);
}

else {

PORTB.f1 = 0;
delay_ms(500);
PORTB.f1 = 1;
delay_ms(500); 
Eller något i den stilen.
Men det är enklast att du som vet hur det ska fungera fixar det själv... :-)
Skriv svar