Sida 1 av 4

Läsa av ingång

Postat: 20 december 2009, 19:39:28
av Bola
Jag har sökt men iten hittat nått svar varken här eller på google (har ni någon länk till ett liknande bra exempel så posta gärna den)

Jag har kopplat en knapp till RB4 när denna är nedtryckt ska programmet utföras som står i if-satsen. Men när jag trycker på knappen så händer ingentin (förutom att RC0 fortfarande är hög). Den verkar alltås inte känna av knapptryckningen. Verkar det finnas något fel i koden? Och är det så att ingången känner av om det ligger en spänning på ingången och vet att den är 1 då?

Kod: Markera allt

#define _XTAL_FREQ  4000000
#include <htc.h>


void main(void) {

   OSCCON  = 0x60; 
   ANSEL   = 0;

   TRISC = 0;		//C output
	TRISB=1;		//B input
	PORTC=0x00;     //All C low
	
   while(1) {       //Loop
      RC0=1;  		//C0 High
		if (RB4==1){			
			RC0=0;
			RC1=1;
			__delay_ms(100);
			__delay_ms(100);
		}

  }
}

Re: Läsa av ingång

Postat: 20 december 2009, 19:45:26
av baron3d
TRISB=1; sätter endast bit0 till ingång.
Vill du att alla pinnar på PORTB skall vara ingångar skall du ha:
TRISB=255; eller TRISB=0b11111111;

Re: Läsa av ingång

Postat: 20 december 2009, 19:45:41
av TomasL
tja, elektrisk inkoppling vore bra att se.

Re: Läsa av ingång

Postat: 20 december 2009, 20:59:14
av sodjan
> Jag har sökt men iten hittat nått svar varken här eller på google

Du letar på helt fel ställen, databladet har svaret.
Dessutom kan du enkelt kolla vilken kod som ditt lilla program
genererar och sannolikt ganska snabbt se om det gör det som du tror.

Re: Läsa av ingång

Postat: 21 december 2009, 16:58:37
av Bola
tja, elektrisk inkoppling vore bra att se.
Glömde detta. Såhär är iallfall knappen inkopplad:
Bild

När jag mäter mellan knappen(RB4 sidan av knappen) när den är nedtryckt och till jord så har jag en spänning på 4,9V mäter jag mellan RB4 och +5V så har jag ingen spänning. Tänkte då att jag hade tänkt fel och kollade meller RB4 och jord men även noll där vilket det borde vara efter som den är en ingång. Så därför tänkte jag att det borde vara nått i koden.

Re: Läsa av ingång

Postat: 21 december 2009, 17:02:24
av vfr
Det där är felkopplat. Ingången skall kopplas till 5V via motståndet och samtidigt till nolla via brytaren.

Re: Läsa av ingång

Postat: 21 december 2009, 17:04:31
av sodjan
Felkopplat.
10 kohm ska ligga direkt från 5V till RB4.
Och knappen mellan RB4 och GND.
Har du funderat på vad som händer då knappen *inte* är
nertryckt ? Ingången är "öppen" vilket den aldrig får vara...

> ...och kollade meller RB4 och jord men
> även noll där vilket det borde vara efter som den är en ingång.

Helt feltänkt...

Re: Läsa av ingång

Postat: 21 december 2009, 18:23:48
av Bola
Ok hur tänkte jag fel där? (kan vara bra att veta varför också för att lära sig nått.)

Jag har iallfall kopplat det så som ni beskrivit och det fungerar fortfarande inte. När man trycker in knappen blir det 0 volt mellan pinnen och jorde vilket borde innebära att RB4 blir en nolla och därmed uppfyller if-statmentet(har ändrat så det står RB4==0, kanske är det detta du menar med "feltänkt"?). Har läst lite om interrupt, vad är skillnaden på interrupt och denna metoden jag försöker köra?

Re: Läsa av ingång

Postat: 21 december 2009, 18:35:56
av sodjan
> Jag har iallfall kopplat det så som ni beskrivit och det fungerar fortfarande inte.

Nej, och det var det ingen som sa heller. Vi sa bara att det var felkopplat, inte
att det skulle fungera om du kopplade rätt, det kan ju vara helt andra fel också.

> Har läst lite om interrupt, vad är skillnaden på interrupt och denna metoden jag försöker köra?

Jag har inte kollat hur du försöker göra, men generellt brukar man skilja
på metoderna interrupt resp pollning.

> kanske är det detta du menar med "feltänkt"?)

Nej, det var "...men även noll där vilket det borde vara efter som den är en ingång."
som var feltänkt.

Re: Läsa av ingång

Postat: 22 december 2009, 10:03:57
av sebgus
Bola:

Som du har kodat nu innebär det att PICen hela tiden kollar om RB4 är tänd, dvs. all processorkraft går åt att köra while-loopen hela tiden.

Med interrupt så kan man göra annat under tiden och bara när t.ex. RB4 så kommer den exekvera en viss kod.

Man kan jämföra detta med en ringsignal på mobil. Om du inte hade haft någon indikation på att någon ringer så måste du hela tiden kolla på telefonen om någon ringer dig. Med interrupt så får du en ringsignal/vibration som talar om att någon ringer dig. Typ...

Re: Läsa av ingång

Postat: 22 december 2009, 12:22:25
av jesse
Jag gissar att det handlar om en PIC-processor ?
Kan man verkligen adressera en bit direkt i en PIC med
RC0=0; // nollställa bit i port
eller med
(RB4==1) // läsa av bit i port
???
I AVR-världen är beteckningarna PB1 osv.. bara konstanter som anger bitens position.

Annars tror jag det är en bra väg att börja med polling - sen, när man behärskar den metoden kan man ju försöka sig på interrupt om man vill.

Re: Läsa av ingång

Postat: 22 december 2009, 12:31:02
av sodjan
> Kan man verkligen adressera en bit direkt i en PIC med.....

Det har ju inte något med processorn att göra, utan det beror helt
vilken kod som olika kompilatorer väljer att generera. Det är ju helt
upp till kompilatorn hur den väljer att göra.

Re: Läsa av ingång

Postat: 22 december 2009, 13:11:40
av Nerre
I det här fallet är det väl inte något som handlar om att kompilatorn väljer att göra något, det måste ju till 100% handla om hur RB4 är definierat i include-filerna? Jag gissar att det är ett makro som gör att det går att använda sådär. Men jag är nyfiken på hur de lyckas få tilldelningsoperationen att fungera.

Re: Läsa av ingång

Postat: 22 december 2009, 13:21:14
av sodjan
> det måste ju [...] handla om hur RB4 är definierat i include-filerna?

Och vad kompilatorn väljer att göra av det, så klart.

Men, vi vet ju inte ens vilken kompilator det är, så det blir bara spekulationer.

> Men jag är nyfiken på hur de lyckas få tilldelningsoperationen att fungera.

Jag ser inget problem, det är bara att generera rätt BCF eller BSF instruktion
när en tilldelning till (t.ex) RB4 dyker upp i koden. Eller rätt BTFSC/BTFSS
när en test sker på t.ex RB4. Varför skulle det vara ett problem ?

Re: Läsa av ingång

Postat: 22 december 2009, 14:10:11
av Nerre
RB4 måste ju på något sätt expanderas till C-kod (det är ju en C-kompilator), och jag kan inte komma på nån C-kod som fungerar som avsett. Just därför är jag alltså väldigt nyfiken på hur de får det att fungera.

Problemet här är ju det sätt som C-kompilatorer jobbar på.