HI-TECH C nybörjare

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Johaa
Inlägg: 7
Blev medlem: 1 augusti 2007, 12:56:34
Ort: Sundsvall

HI-TECH C nybörjare

Inlägg 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?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: HI-TECH C nybörjare

Inlägg 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...
Johaa
Inlägg: 7
Blev medlem: 1 augusti 2007, 12:56:34
Ort: Sundsvall

Re: HI-TECH C nybörjare

Inlägg 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
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: HI-TECH C nybörjare

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: HI-TECH C nybörjare

Inlägg 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.
Johaa
Inlägg: 7
Blev medlem: 1 augusti 2007, 12:56:34
Ort: Sundsvall

Re: HI-TECH C nybörjare

Inlägg 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?
Användarvisningsbild
Eson
Inlägg: 397
Blev medlem: 30 september 2004, 08:31:51
Ort: Huddinge - STHLM
Kontakt:

Re: HI-TECH C nybörjare

Inlägg 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.
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: HI-TECH C nybörjare

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: HI-TECH C nybörjare

Inlägg 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... :shock:

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... :roll:
Användarvisningsbild
Icecap
Inlägg: 26660
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: HI-TECH C nybörjare

Inlägg 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
Användarvisningsbild
Eson
Inlägg: 397
Blev medlem: 30 september 2004, 08:31:51
Ort: Huddinge - STHLM
Kontakt:

Re: HI-TECH C nybörjare

Inlägg av Eson »

sodjan skrev:LATx ? Visa hur det går till på en PIC16... :roll:
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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: HI-TECH C nybörjare

Inlägg 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.
Användarvisningsbild
Eson
Inlägg: 397
Blev medlem: 30 september 2004, 08:31:51
Ort: Huddinge - STHLM
Kontakt:

Re: HI-TECH C nybörjare

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26660
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: HI-TECH C nybörjare

Inlägg 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!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: HI-TECH C nybörjare

Inlägg 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"...
Skriv svar