Sida 1 av 2
HI-TECH C nybörjare
Postat: 31 juli 2009, 00:24:41
av Johaa
Hej. Jag försöker få pic'en att kolla om en knapp är intryckt men jag lyckas ingen bra med det..
Jag använder 16f690 och pickit2 och exprimentkortet.
Här är koden:
Kod: Markera allt
#include <pic.h>
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT & UNPROTECT & BORDIS & IESODIS & FCMDIS);
//Function----------------------------------------------------------------------------------------------------------------------------------------
#define FOSC 8000000L // Using Internal Clock of 8 Mhz
#define delay_us(x) { unsigned char us; \
us = (x)/(12000000/FOSC)|1; \
while(--us != 0) continue; }
void delay_ms(unsigned int ms) {
unsigned char i;
do {
i = 4;
do {
delay_us(164);
} while(--i);
} while(--ms);}
//--------------------------------------------------------------------------------------------------------------------------------------------------
void main(void) {
OSCCON=0x70; // Select 8 Mhz internal clock
ADON=0;
ANSEL = 0; // Set PORT ANS0 to ANS7 as Digital I/O
ANSELH = 0; // Set PORT ANS8 to ANS11 as Digital I/O
TRISC = 0b000000; // 1=input 0=output
TRISA = 0b111111; // PORTA input
for(;;) {
if(RA3==1) { PORTC = 0b0110; }
else if(RA3==0){ PORTC = 0b1001; }
} // end loop
} // end main
När jag provar koden så släcks alla led om man trycker in knappen.
Jag vill att pic'en ska tända led i mitten om knappen är intryckt annars på siderna.
Hurfår jag till det?
Re: HI-TECH C nybörjare
Postat: 31 juli 2009, 00:56:40
av sodjan
Några småsaker...
> PORTC = 0b0110;
PORTB är 8 bitar (varav 4 bitar används).
Ange alltid 8 bitar så blir det ingen tvekan om vilken bit som är vilken.
Alltså :
> PORTC = 0b01100000; }
> PORTC = 0b10010000; }
(om det var det som du menade)
> TRISA = 0b111111;
Vad har du anslutet till de andra ingångarna på PORTA förrutom RA3 ?
Behöver du inte ingångarna så låter du dom vara utgångar.
Och samma sak här, ange alltid 8 bitar...
Re: HI-TECH C nybörjare
Postat: 31 juli 2009, 02:15:27
av Johaa
sodjan jag använder bara det som finns på pickit2 experimentkort.
Jag satt TRISA = 0b11111111 för att jag inte vet vart RA3 ligger binärt. Tror det ska vara 0b000100.
Koden är ändrad men jag har samma problem
Kod: Markera allt
#include <pic.h>
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT & UNPROTECT & BORDIS & IESODIS & FCMDIS);
void main(void) {
OSCCON=0x70; // Select 8 Mhz internal clock
ADON=0;
ANSEL = 0; // Set PORT ANS0 to ANS7 as Digital I/O
ANSELH = 0; // Set PORT ANS8 to ANS11 as Digital I/O
TRISC = 0b000000; // 1=input 0=output
TRISA = 0b000100; // PORTA input
for(;;) {
if(RA3==0) { PORTC = 0b00000110; }
else if(RA3==1){ PORTC = 0b0001001; }
} // end loop
} // end main
Re: HI-TECH C nybörjare
Postat: 31 juli 2009, 02:47:02
av bearing
Nu har du bara angett 6 bitar. Bitarna numreras från höger: 0, 1, 2, 3, 4, 5, 6, 7. Det är alltså RA2 som är ingång i din kod.
Kod: Markera allt
TRISA = 0b00001000; // RA3 input
// #76543210
Re: HI-TECH C nybörjare
Postat: 31 juli 2009, 09:41:39
av sodjan
Nu har du skrivit :
> PORTC = 0b00000110
> PORTC = 0b0001001
För det första saknas det en bit i det andra fallet. Det är bara rent slarv,
och slarv kommer du ingenstans med om du ska pyssla med mikrokontrollers.
Sen, om du *LÄSER DATABLADET* (verkar slarvas tydligen en del där med) så ser
du tydligt nog att att du har skrivit bitarna helt fel, eller hur ?
Se "REGISTER 4-7: PORTB: PORTB REGISTER" på sidan 49.
> TRISC = 0b000000
> TRISA = 0b000100
Här är det bara 6 bitar angivna. Svårt att räkna ?

Det fungerar att skriva färre bitar men det förrutsätter att du är bombsäker
på i vilken "ände" som de saknade bitarna hängs på. Är du det ? För att
undvika alla missförstånd, ANGE ALLTID 8 BITAR till alla register.
Bearing> Bitarna numreras från höger: 0, 1, 2, 3, 4, 5, 6, 7...
Kanske lite opedagogiskt och det kan lätt misstolkas. "Bitarna numreras
från vänster: 76543210" är mer så som kan läser det i koden och i databladet.
Allra bäst är att inte försöka beskriva det alls, det är tydligt nog i databladet.
Re: HI-TECH C nybörjare
Postat: 31 juli 2009, 12:00:47
av Johaa
Jag var lite trött igår.
Sådär nu är det inget mer man kan klaga på men problemet återstår fortfarande
Kod: Markera allt
#include <pic.h>
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT & UNPROTECT & BORDIS & IESODIS & FCMDIS);
void main(void) {
OSCCON=0x70; // Select 8 Mhz internal clock
ADON=0;
ANSEL = 0; // Set PORT ANS0 to ANS7 as Digital I/O
ANSELH = 0; // Set PORT ANS8 to ANS11 as Digital I/O
TRISC = 0b00000000; // RC7 RC6 RC5 RC4 DS3 DS2 DS1 DS0
TRISA = 0b00001000; // 7 6 RA5 RA4 SW3 RA2 RA1 RA0
for(;;) {
if(RA3==0) { // 0 0 0 0 0 1 1 0
PORTC = 0b00000110;// RC7 RC6 RC5 RC4 DS3 DS2 DS1 DS0
}
else if(RA3==1) { // 0 0 0 0 1 0 0 1
PORTC = 0b00001001; // RC7 RC6 RC5 RC4 DS3 DS2 DS1 DS0
}
} // end loop
} // end main
Har ni ingen exempel kod som använder switch så jag kan se hur det ska vara?
Re: HI-TECH C nybörjare
Postat: 31 juli 2009, 12:08:55
av Eson
Prova att skriva till LATx istället för PORTx. Det löste många problem på vårat mek2 projekt där när man skrev flera saker samtidigt till PORTx registret så tog den inte in allt.
Re: HI-TECH C nybörjare
Postat: 31 juli 2009, 12:11:03
av bearing
Har läst att andra haft problem med knappen eftersom att den sitter på MCLR. MCLR måste vara avstängd i CONFIG.
Jag skulle som felsökning lagt till kod i loopen som gör att en LED blinkar. Det skulle visa om loopen körs alls, och om processorn startas om av knappen.
Re: HI-TECH C nybörjare
Postat: 31 juli 2009, 12:15:54
av sodjan
Sorry !! Shit också...
Jag blandade ihop PORTB och PORTC i tidigare inlägg.
Bara att börja om från början alltså...
Bearing har nog hittat det... Varför i jösse namn har du satt knappen på MCLR ??
*Det* tänkte jag inte på att kolla...
Sen lite onödig kod:
Om inte RA3 == 0 (d.v.s efter "else") så behöver du inte testa om RA3 == 1,
vad skulle den annars vara ? Så följande är nog :
Kod: Markera allt
for(;;) {
if(RA3==0) { // 0 0 0 0 0 1 1 0
PORTC = 0b00000110;// RC7 RC6 RC5 RC4 DS3 DS2 DS1 DS0
}
else { // 0 0 0 0 1 0 0 1
PORTC = 0b00001001; // RC7 RC6 RC5 RC4 DS3 DS2 DS1 DS0
}
> Prova att skriva till LATx istället för PORTx.
LATx ? Visa hur det går till på en PIC16...

Re: HI-TECH C nybörjare
Postat: 31 juli 2009, 12:44:09
av Icecap
Och sedan en liten observation jag har haft: Vissa kompilers kan inte kolla helt rätt med ==! (Ska inte nämna MikroC här)
Hela grejen med att kolla RA3 == 1 blir då fel då vissa kompilere på något jävla vis läser porten men inte flyttar ner bitten till att vara 0 eller 1. Då det är RA3 blir resultatet alltså 0b00001000 eller 0b00000000. Just i detta exempel kommer det att fungera bra då det är enkla ASM-instruktioner men i andra sammanhang kan det fallera kapitalt.
Detta är anledningen till att jag alltid testar med "if(RA3)" som ger sant om RA3 är icke-noll, därför hade jag skrivit:
Kod: Markera allt
for(;;)
{
if(RA3)
{ // 0 0 0 0 1 0 0 1
PORTC = 0b00001001; // RC7 RC6 RC5 RC4 DS3 DS2 DS1 DS0
}
else
{ // 0 0 0 0 0 1 1 0
PORTC = 0b00000110;// RC7 RC6 RC5 RC4 DS3 DS2 DS1 DS0
}
} // end loop
Re: HI-TECH C nybörjare
Postat: 31 juli 2009, 13:29:40
av Eson
sodjan skrev:LATx ? Visa hur det går till på en PIC16...

16F var tydligen annorlunda än 18F och det går inte att skriva till pinnen som på 18F. PORTx på 16F gör vad LATx gör på 18F, dvs skriver till latchen.
Re: HI-TECH C nybörjare
Postat: 31 juli 2009, 13:58:00
av sodjan
> 16F var tydligen annorlunda än 18F och det går inte att skriva till pinnen som på 18F.
Jorå, det går alldeles utmärkt, det är det som man gör när man skriver till PORTx.
Skrivning till PORTx skriver igentligen till latcharna, läsning från PORTx läser
direkt från de fysiska I/O pinnarna. Lite förvillande ibland. Skillnaden är att
PIC18 även kan *läsa* direkt från latcharna. Att skriva till PORTx eller LATx
är igentligen samma sak på PIC18, båda skriver till latcharna. Saken är
den att vissa skrivoperationer (speciellt BCF/BSF) både skriver och läser.
> PORTx på 16F gör vad LATx gör på 18F, dvs skriver till latchen.
Ja, men det gör även PORTx på PIC18.
Re: HI-TECH C nybörjare
Postat: 31 juli 2009, 14:59:00
av Eson
Men ändå kan det bli fel om man skriver till PORTx istället för LATx på pic18. Jag vet att det ser ut att vara samma punkt i kretsschemat men någonting gör att det inte blir samma sak.
Re: HI-TECH C nybörjare
Postat: 31 juli 2009, 15:07:46
av Icecap
Om det är en R-M-W instruktion kan det just gå lite knasigt med en (även liten) kapacitiv belastning på porten men är det en PORTx = Någon_Jävla_Byte är det ingen skillnad!
Re: HI-TECH C nybörjare
Postat: 31 juli 2009, 15:46:05
av sodjan
> Men ändå kan det bli fel om man skriver till PORTx istället för LATx på pic18.
Inte vid en ren skrivning, då fungerar PORTx och LATx på exakt samma sätt.
Men alla instruktioner som både läser och skriver (kommer inte på någon mer
än BCG/BSF just nu på rak arm) kan ha problem med PORTx. Därför la man
till på PIC18 att även latcharna är mappade som SFR via LATx registren. Mot
LATx fungerar BCF/BSF utan risk att man råkar ändra en annan bit än den
aktuella av misstag.
Och i och för sig gäller det naturligstvis även om man enbart läser, det beror
lite på vad man sedan gör med det "lästa"...