ü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.
A:0101 -- önskat mönster
B:0001 -- läst mönster
C = A && B (pseudokod)
true ? C == A (pseudokod)
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.
Angående problemet är jag fortfarande osäker på vad du vill åstadkomma. Verkar handla om maskning, så jag gissar på något sånt här.
ü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.
Detta tycker jag blir fel. Jag har sett vad flera av dessa personer skrivit i andra trådar. De är duktiga och kan Sw. Tror mig. Ett problem som finns i denna tråd är att du anser dig övertydlig men jag uppfattar det du skriver som väldigt otydligt. Detta forum är en guldgruva om du vänder det ryggen gör du ett misstag. Du behöver göra en nystart och sakta och säkert inse att beskriva problem och tekniska lösningar skall man hantera med ödmjukhet. Jag har jobbet 20år på en systemavdelning på ett hyffsat stort svenskt telkombolag som inte gör mobiler längre. Mycket missförstånd var det trots att man satt i samma rum runt samma withboard. Oftas löste vi problemen, missförstånden. Man kommer långt med ödmjukthet och stora öron. Med sårade känslor hamnar man direkt i källaren. Där nere blir det inte mycket resultat.
Jag tror att resultatet bearings kod ger är rätt.
Originalkoden ger bara en etta, då både 0101 och 0001 är större än noll och är bara det som räknas med &&.
ie skrev:Nä, 4 & 1 blir 0. Ingen gemensam bit satt.
Edit: Vart tog inlägget jag svarade på vägen?
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.
Och du har helt rätt 4 & 1 blir 0 jag tänkte | i skallen.... Suck....
überfuzz skrev:Gissningsvis är det personer som aldrig sett programkod eller inte kan programmera som reagerat.
Det är väl snarare vi som kan något som reagerat.
Jag höll på med logikkretsar och lärde mig hur ABC80 fungerade inuti redan när jag gick högstadiet på 80-talet, på gymnasiet lärde jag mig Pascal, C, fortran och lite lisp, på högskolan sen blev det lite C++. Assembler och Basic kunde jag redan innan jag började på gymnasiet. Jag har debuggat en mikroprocessorlösning med en Z80 mha oscilloskop och identifierat två korsade adress-tåtar till ROM så jag fick den att fungera (detta gjorde jag som "praktik").
Och du menar att jag inte kan nåt? Det jag inte kan är möjligen "läsa tankar".
Mitt första datorbygge var på ett tejpat/belyst/etsat kretskort, med handassemblerad "boot"-programvara, som var handinknappad i ett EPROM.
Felsökningen skedde med oscilloskop som (pga databussmönstret) visade sig att det enda felet (innan det fungerade) var en jämförelse som inte skulle vara NOT.
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.
Det var för övrigt hackerns viktigaste kod-instruktion att lära sej näst efter x75, jne.
Mha hex-editorn byttes x75yy mot x90x90 på rätt ställe i pseudo-koden "cmp ax,pass-string, jne exit"
Det var bara att starta debuggern och stega fram till första jne. Det fungerade i de flesta fall.
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
Ibland får jag känslan av att en viss amerikansk skoförsäljare bjudit in hela släkten till forumet. Precis samma beteende att be om hjälp och sen totalt ignorera svaren.
input = PORTB; //Read I/O port
mask = 0x0101; //Set mask
if ((input & mask) == mask)
{
//We have a match!
//Do something!
}
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.
Edit: blandade ihop A och B. Det var ju B som var input som ska AND:as med 0xF.