
C programmering till PIC
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. 

> 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...
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...

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.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
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);
}
}
}
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);
}
}
}
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.
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.
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) :
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);
}
OK, och en tredje frekvens om *ingen* knapp är nedtryckt ??
Kanske :
Eller något i den stilen.
Men det är enklast att du som vet hur det ska fungera fixar det själv...
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);
Men det är enklast att du som vet hur det ska fungera fixar det själv...
