Läsa av ingång

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Icecap
Inlägg: 26658
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Läsa av ingång

Inlägg av Icecap »

Det beror ju på kompilern men dom jag har sett använder just detta bit-kommandon.
Användarvisningsbild
mri
Inlägg: 1165
Blev medlem: 15 mars 2007, 13:20:50
Ort: Jakobstad, Finland
Kontakt:

Re: Läsa av ingång

Inlägg av mri »

Yepp, samma observation här.
Kompilatorn jag använder märker dessutom om man sätter ensilda bitar efter varandra som råkar finnas i samma byte. I det fallet slås instruktionerna ihop och alla bitarna i byten sätts samtidigt.

Här måste man givetvis vara på sin vakt, ifall den optimeringen inte är önskvärd. Kompilatortillverkarna brukar rekommendera nån metod hur man kan tvinga vissa operationer att utföras sekventiellt istället för att optimeras.
Användarvisningsbild
mri
Inlägg: 1165
Blev medlem: 15 mars 2007, 13:20:50
Ort: Jakobstad, Finland
Kontakt:

Re: Läsa av ingång

Inlägg av mri »

Föresten, följande kan göras utan test/hopp om man vill:

"läs byte; om (bit==1) gör OR (1<<bit_position) annars gör AND ~(1<<bit_position); spara byte "

läs byte;
byte &= ~(1 << bit_position);
byte |= bit << bit_position;
spara byte;
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Läsa av ingång

Inlägg av jesse »

Så självklart, men ändå ser man det inte direkt! (Jag irriterade mig verkligen på att jag behövde använda "if" där.)
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

Re: Läsa av ingång

Inlägg av Bola »

Oj så många som har skrivit, har varit borta ett tag så har inte hunnit med att kolla men har läst igenom och det verkar som det mesta kanske inte handlar direkt om mitt fall. Ivilket fall som helst så har jag försökt mig på interrupt utan att lyckas. Har verkligen läst igenom databladet flera gånger och kollat så att alla bitar som behövs ska vara 1 eller 0 osv. Dett va vad det blev av det:

Kod: Markera allt

#define _XTAL_FREQ 4000000
#include <htc.h>



void interrupt blinka(void);
int a=0;

void main()
{

TRISA=0x04; //Sätter RA2 till ingång
TRISC=0;  //Sätter C portar till utgångar
INTEDG=1; //Interrupt on rising edge of RA2/INT pin ( som jag fattat det att den kör interrupt om man ökar V)
GIE=1;    //Enablar Global interrupt
INTE=1;	  //Tillåter Interrupt på RA2/INT
INTF=0;   //Nollställer flaggan
RC0=a;		// Sälckt så länge ingen interrupt har verkat (a=1 om det någongång skett en interrupt)
while(1);
}  //  End

void interrupt bilnka(void){
	a=1; //interrupt sätter a=1
INTF=0; //Nollställer flaggan
}
Så länge man lägger en spänning på RA2 benet borde väl en interrupt komma? Är det någon som ser nått fel/skumt i koden?
JustNeed
Inlägg: 799
Blev medlem: 7 november 2007, 22:07:01
Ort: 08

Re: Läsa av ingång

Inlägg av JustNeed »

RC0=a; ligger utanför while(1)-loopen. Det kommer alltså genomföras en enda gång precis när processorn har startat.
Det innebär att förutsatt att resten funkar som du vill så kan du tända RC0 om du kopplar RA2 hög från början, men om du försöker dra den hög efteråt kommer processorn med all sannolikhet ha hunnit ned till while(1); och därför kommer inte RC0 att påverkas.

För att lösa det kan du antingen sätta RC0=a; inom while(1)-loopen (ex. while(1)RC0=a;) eller sätta RC0 direkt i interruptrutinen.
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

Re: Läsa av ingång

Inlägg av Bola »

Dum miss, tyvärr så har jag uppenbarligen inte bara missat detta utan något mer.

Såhär ser koden ut nu (har ändrat utgången men det borde inte spela någon roll):

Kod: Markera allt

#define _XTAL_FREQ 4000000
#include <htc.h>



void interrupt blinka(void);
int a=0;

void main()
{

TRISA=0x04; //Sätter RA2 till ingång
TRISB=0;  //Sätter C portar till utgångar
INTEDG=1; //Interrupt on rising edge of RA2/INT pin (som jag fattat det att den kör interrupt om man ökar V)
GIE=1;    //Tillåter Global interrupt
INTE=1;	  //Tillåter Interrupt på RA2/INT
INTF=0;   //Nollställer flaggan

while(1){
RB4=a;		// Sälckt så länge ingen interrupt har verkat (a=1 om det någongång skett en interrupt)
}
}  //  End cButton

void interrupt bilnka(void){
	a=1; //interrupt sätter a=1
INTF=0; //Nollställer flaggan
}
Ingen som gjort en interrupt på RA2 pinnen på en pic16f690 som eventuellt skulle kunna upptäcka felet (eller någon annan för den delen)?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Läsa av ingång

Inlägg av sodjan »

> (som jag fattat det att den kör interrupt om man ökar V)

Vad är "V" ?

Någon speciell anledning till att du formatterar koden så
att det blir svårt att läsa ?
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Läsa av ingång

Inlägg av v-g »

Tror han menar volten dvs att nivån blir hög.
JustNeed
Inlägg: 799
Blev medlem: 7 november 2007, 22:07:01
Ort: 08

Re: Läsa av ingång

Inlägg av JustNeed »

Hur långt har du felsökt?
Har du över huvud taget lyckats läsa av en ingång än?
Pröva att sätta RB4 = RA2; i while(1)-loopen och se om RB4 följer RA2 när du manipulerar den.
Om inte så bör du först försäkra dig om du kan ställa RB4 som du vill (t.ex.kan man testa genom att göra en blink-loop).
Se till att RA2 är ställd som digital ingång. Ofta är delar av A-porten komparatorer vid uppstart och man måste därför slå av funktionen i koden när man vill använda de pinnarna som digital ingång.
Om RB4 = RA2; fungerar så bör du fokusera på att felsöka interrupt-delen.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Läsa av ingång

Inlägg av sodjan »

Ser ut som ett vanlig RTFM ärende. Speciellt den lilla grå rutan
i kapitel "4.3 PORTB and TRISB Registers" i databladet...
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

Re: Läsa av ingång

Inlägg av Bola »

Nu jar jag ändrat lite i koden och det jag lagt till är ANS2=0; och satt RB4=RA2; detta verka ha gjort susen för nu när man tar lite med fingret på RA2 benet (ska ju vara en knapp där såklart) så blinkar led lampan till (antar att man ger ut lite spänning och pinnen märker detta och 1 ställer RA2 rätta mig om jag har fel). Det som jag undrar är varför den ibland "hänger kvar" alltså leden slutar lysa ett tag efter man tagit bort fingret eller liknande är det för att spänningen fortfarande håller på och ändras? Hur kommer man runt det problemet? Om man trycker på en knapp vill man ju inte att RA2 ska vara 1 ställd när man släppt knappen osv.

sodjan skrev:Någon speciell anledning till att du formatterar koden så
att det blir svårt att läsa ?
Detta får du gärna förklara närmare menar du här eller i MPLab? Vad gör den svårläst? (jag frågar för att lära mig inte ifrågasätta dina frågor)
Användarvisningsbild
Icecap
Inlägg: 26658
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Läsa av ingång

Inlägg av Icecap »

??? Du menar alltså att du har ingångar som "svävar"??? BIG NO NO!

Detta är grunden till att man använder pull-up/down motstånd, då säkrar man att ingångar ligger på kända nivåer.
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

Re: Läsa av ingång

Inlägg av Bola »

Ingångar som svävar vet jag inte men den verkar ju väldigt känslig på magnetfält så det är säkert vad du kallar "svävande ingångar".
Är detta en komponent? Eller är det WEAK PULL-UPS som man ska kolla på, om jag har läst rätt så är detta inte alls samma sak som interrupt eller är det bara en säkrare väg till en interrupt?
sneaky
Inlägg: 1621
Blev medlem: 22 juni 2009, 18:38:42

Re: Läsa av ingång

Inlägg av sneaky »

Pull-up/down-motstånd används, som Icecap säger, för att försäkra sig om att en ingång har ett känt "läge". Om du bara låter ingången hänga i luften så kan du aldrig vara säker på vilket "läge" ingången befinner sig i, den kan lika gärna vara hög som låg, den flyter/svävar. Om du lägger till ett pull-up-motstånd till ingången tillsammans med din knapp så vet du att så länge knappen inte är intryckt så kommer ingången att vara "hög" eftersom ingången "dras" till den höga nivån av motståndet. När knappen trycks ner så dras ingången starkare till en låg nivå (vägen genom knappen till jord är lättare för strömmen att ta än genom det starka motståndet i pull-uppen).

Weak pull-ups som du snubblade över i databladet är helt enkelt inbyggda motstånd i processorn som du kan koppla in via mjukvaran. På så vis slipper du använda externa motstånd vilket sparar plats/kostnad.

Interrupt och pull-ups har inte med varandra att göra, det är två skillda saker.

Försökte skriva med lite enklare ord och generaliserade lite, hoppas att det tände någon liten lampa. (och att de som verkligen vet vad de talar om, samt ordmärkarna, inte halshugger mig fullständigt...)
Skriv svar