Re: 8 biter till en byte
Postat: 24 februari 2016, 16:16:54
überfuzz skrev:Tack RoPa!
Jag har skaplig koll på var, mjukvara/hårdvara, olika saker görs, enklast. Känns som att det du kallar alt 1 sitter väl med min applikation.

Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
überfuzz skrev:Tack RoPa!
Jag har skaplig koll på var, mjukvara/hårdvara, olika saker görs, enklast. Känns som att det du kallar alt 1 sitter väl med min applikation.
Det några försökte påpeka var att du har fel i att det är de logiska operationerna && och || som används på bytes i C. På bytes används aritmetiska operationer. Dessa har inte dubbla tecken, utan enkla, d.v.s & samt |. Logiska operationer görs på "bitar" (true / false) i C, inte bytes. Om du ändå använder en byte i en logisk operation kommer alla värden utom noll räknas som true, och 0 räknas som false.überfuzz skrev:Ja precis! I C låter sig logiska and (&&) och or (||) operationer göras på 'bytearna' jag skickar till mjukvaran. Där kan jag alltså söka efter konstigheter utan problem. Utan papper och penna till hands drar jag till med att && gör det jag vill.Kod: Markera allt
A:0101 -- önskat mönster B:0001 -- läst mönster C = A && B (pseudokod) true ? C == A (pseudokod)
Kod: Markera allt
input = PORTB; //Read I/O port
mask = 0b0101; //Set mask
if ((input & mask) == mask)
{
//We have a match!
//Do something!
}
På svenska, om A och B är identiska så gör det ena annars gör det andra.A:0101 -- önskat mönster
B:0001 -- läst mönster
C = A && B (pseudokod)
true ? C == A (pseudokod)
überfuzz skrev: Oj än en gång tycks jag retat upp en och annan person här. Detta trots att jag skrev övertydligt. Jag ber om ursäkt, jag trodde att jag var övertydlig i de pseudobegrepp använde, vidare att jag utryckte mig på ett extremt basalt sätt. Jag skrev ju till och med ut att det rörde sig om pseudokod... Gissningsvis är det personer som aldrig sett programkod eller inte kan programmera som reagerat. Nå ja, vi låter udda vara jämt, det är ju trots allt ett elektronikforum, inte programmeringsforum. Läs om and och or operatorer så kommer psuedokoden att bli kristallklar, gissningsvis även för er som aldrig sett progrmkod for.![]()
jag antar att jag gör bäst i att sluta skriva mer på det här inlägget.
Sorry jag tog bort det direkt då jag såg att bearing hade skrivit exakt samma sak som jag missat. Trodde inte någon skulle ha hunnit läsa det på de 10 sek som det låg där, än mindre kommentera det.ie skrev:Nä, 4 & 1 blir 0. Ingen gemensam bit satt.
Edit: Vart tog inlägget jag svarade på vägen?
Det är väl snarare vi som kan något som reagerat.überfuzz skrev:Gissningsvis är det personer som aldrig sett programkod eller inte kan programmera som reagerat.
En bra artikel som tydliggör detta:bearing skrev: Det några försökte påpeka var att du har fel i att det är de logiska operationerna && och || som används på bytes i C. På bytes används aritmetiska operationer. Dessa har inte dubbla tecken, utan enkla, d.v.s & samt |. Logiska operationer görs på "bitar" (true / false) i C, inte bytes. Om du ändå använder en byte i en logisk operation kommer alla värden utom noll räknas som true, och 0 räknas som false.
Dubbel negation=NOP eller x90 på 86 assembleren jämförelse som inte skulle vara NOT.
Kod: Markera allt
Jag har 8 st strömbrytare som jag vill läsa av med en uC.
Beroende på strömbrytrnas äge vill jag att olika saker skall hända i programmet.
Om brytare 1 är dragen, men ingen annan skall händelse 1 ske.
Om brytare 3 är dragen, men inte brytare 2, de andra spelar ingen roll, skall händelse 2 ske.
osv, osv
Det där blev nog ett litet tankefel. 0x101 är ju 100000001 binärt. Men om man bortser från det och antar att det var 0101 binärt som menades så matchar koden önskat värde = x1x1. Lillahusets förslag A==B är det som fungerar. Eventuellt A==(B & 0xF) för att begränsa till 4 bitar.bearing skrev:Kod: Markera allt
input = PORTB; //Read I/O port mask = 0x0101; //Set mask if ((input & mask) == mask) { //We have a match! //Do something! }