Läsa av ingång
Re: Läsa av ingång
Det beror ju på kompilern men dom jag har sett använder just detta bit-kommandon.
Re: Läsa av ingång
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.
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.
Re: Läsa av ingång
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;
"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;
Re: Läsa av ingång
Så självklart, men ändå ser man det inte direkt! (Jag irriterade mig verkligen på att jag behövde använda "if" där.)
Re: Läsa av ingång
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:
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?
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
}
Re: Läsa av ingång
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.
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.
Re: Läsa av ingång
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):
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)?
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
}
Re: Läsa av ingång
> (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 ?
Vad är "V" ?
Någon speciell anledning till att du formatterar koden så
att det blir svårt att läsa ?
Re: Läsa av ingång
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.
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.
Re: Läsa av ingång
Ser ut som ett vanlig RTFM ärende. Speciellt den lilla grå rutan
i kapitel "4.3 PORTB and TRISB Registers" i databladet...
i kapitel "4.3 PORTB and TRISB Registers" i databladet...
Re: Läsa av ingång
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.
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)sodjan skrev:Någon speciell anledning till att du formatterar koden så
att det blir svårt att läsa ?
Re: Läsa av ingång
??? 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.
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.
Re: Läsa av ingång
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?
Ä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?
Re: Läsa av ingång
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...)
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...)