[AVR] Extern interrupt, men omvänd?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
toffie
Inlägg: 1888
Blev medlem: 22 juli 2004, 21:38:07
Ort: Töreboda / Stockholm
Kontakt:

[AVR] Extern interrupt, men omvänd?

Inlägg av toffie »

Hej på er, som ni säkert förstår av titeln på tråden så vet jag inte riktigt själv vad jag pratar om, skoj va? ;)

Hur som helst, jag har nu suttit 3 nätter och kollat på kodexempel och försökt lära mig om interrupts och för er som
jobbar med det, så är det givetvis väldigt enkelt och ni förstår inte hur jag inte kan klara av något så lätt..

Problemet är ju att jag kör detta som hobby och jag har ingen som helst utbildning så jag försöker lära mig :)

Det jag vill åstadkomma med min ATmega32, som för närvarande fortfarande bor hemma hos STK500, är att jag vill
bygga ett enkelt larm liknande system. Den absolut enklaste delen må ju vara en sluten kontakt som bryts, tänk på en dörr
som har två magnetkontakter. När man öppnar dörren bryts kontakten och det är nu detta jag vill avläsa.

Vad jag har förstått av alla kodexempel så fungerar de interrupt koder jag sett som så att om man trycker på en knapp
exempelvis så kan man trigga en interrupt och då tända en lysdiod eller vad man nu tänkt göra. Men en NC kontakt gör
ju tvärtom, den är ju "knappen som är intryckt" hela tiden, så hur gör man här?

Vad är brukligt i andra larmsystem, är det NC eller NO kontakter som används?
Vilket är det jag bör rikta in mig på för att få en enkel men ändå "universell" lösning?

Sen undrar jag även hur ni skulle tänka för skapa ett "larm" som inte bara går att återställa genom att ansluta
"magnetkontakten" igen utan att man måste återställa larmet med ytterliggare en knapp, en "nollställningsknapp".

Jag ber er inte om kod, om ni nu inte vill skriva koden förstås, men något jag verkligen har lätt för att lära
mig med är "synonymkod".. Det vill säga ren text och ingen kod, mer som att man beskriver stegen men utan att
avslöja koderna.

Jag ber givetvis inte om det heller, utan alla tips som gör att jag kan lära mig något uppskattas väldigt mycket!

Tackar på förhand :D
Användarvisningsbild
jonnorberg
Inlägg: 850
Blev medlem: 19 mars 2008, 17:45:40
Ort: Årsta

Re: [AVR] Extern interrupt, men omvänd?

Inlägg av jonnorberg »

Skitbra att du vill lära dig istället för att vi ska göra jobbet åt dig.
OM du behöver en logisk etta vid brytning så får du se till att den är logisk nolla när dörren är stängd genom att koppla kontakten mellan ingången och 0V. Detta gör du att du drar ingången mot 0V med din kontakt och kopplar även ett 10k motstånd mot +5V. Då blir det en logisk etta när kontakten släpper. Med hjälp av motståndet gör du ingen kortslutning mellan 0V och 5V.
Ibland finns dessa motstånd inbyggda och kallas pullup-motstånd och kan programmeras.
Norpan
Inlägg: 2229
Blev medlem: 12 april 2008, 18:20:27
Ort: Småland

Re: [AVR] Extern interrupt, men omvänd?

Inlägg av Norpan »

Det går att trigga en extern interrupt på antingen stigande eller fallande flank, eller på båda för den delen.

Edit:
Nc är säkrare då den reagerar på en avklippt anslutningsledning.
Användarvisningsbild
toffie
Inlägg: 1888
Blev medlem: 22 juli 2004, 21:38:07
Ort: Töreboda / Stockholm
Kontakt:

Re: [AVR] Extern interrupt, men omvänd?

Inlägg av toffie »

Ah tackar för svaren!
Jo men självklart vill jag ju lära mig, annars ska man inte hålla på, inte på den nivån som jag vill åtminstone..
Jag har inga direkta problem att lära mig, om man kan ta jämna steg, vilket verkar vara lite smått svårt med
mikroprocessorer då jag inte har någon utbildning i ämnet..

Tidigare har jag lärt mig PHP och andra saker som jag inte kommer på just nu, men om man jämför PHP med
C / Assembler så är ju PHP i stort sett ren engelska.. Visserligen så blir väl C / Assembler lättare ju mer man
lär sig, men ta denna exempelkod;

Kod: Markera allt

// Enable ADC
ADCSRA = (1<<ADEN);

// Select ADC0
ADMUX |= (0<<MUX0);

// Use Vcc as voltage reference
ADMUX &= ~(1<<REFS1) | ~(1<<REFS0);
Jag förstår inte koden speciellt bra, men jag förstår vad den gör på ett ungefär, så jag har en del att lära
när det gäller C förstås..


En sak jag glömde att fråga var om de exempelkoder / projekt jag tittat på de tidigare nätterna, i flera av
koderna använder de INT0 och INT1 pinnarna på processorn, det blir ju totalt två interrupt pinnar och det är ju
lite väl få per processor!?

Exempelvis denna som jag sett någon av de tidigare nätterna;
http://www.windmeadow.com/node/19

Är det något helt annat mot vad jonnorberg har förklarat?
För vad jag förstår så ska man kunna koppla jonnorbergs exempel till i stort sett alla I/O pinnarna och kunna läsa
av det i mjukvaran på processorn, stämmer det?

Logisk nolla, genom att koppla ingången mot jord (0V)? genom min kontakt plus ett 10K motstånd mot +5 Volt..
Utan att titta på några exempel så försöker jag mig på att lösa uppgiften som jag tror att jag har sett tidigare,
plus genom att tolka jonnorbergs exempel, är jag i närheten? :oops:

Bild

I ATmega32 finns ju inbyggda pullup motstånd, med hjälp av exempel så vet jag att jag kan sätta på dem..
Om nu mitt schema ovan är korrekt, hur skulle det i sådant fall se ut om jag koppla in med pullup motstånd istället
för ett riktigt motstånd, som på mitt schema? Inget schema behövs, bara hur det kopplas.

NC får det bli då, även fast det blir ett hobbyprojekt så måste det ju verkar seriöst och fungera så bra som möjligt ;)


Det var något mer jag tänkte fråga om, men jag kommer inte på det just nu :(
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: [AVR] Extern interrupt, men omvänd?

Inlägg av Swech »

Du kopplar exakt som på din bild men sätter inte dit det externa motståndet R1.
Intern pullup funkar så att det alltså finns ett motstånd kopplat på samma sätt som just R1

Sen om du skall göra ett larm så tänk såhär
Du har R1 10k. Ena sidan till +5V, andra sidan till AVR och även ut till din larmkontakt via en kabel.
I änden där din larmkontakt sitter så sätter du även ett 10K motstån i serie med larmkontakten.

Då får du en spänningsdelare, till din AVR får du 2.5V istället.
Så använder du dig av ADn istället för att kolla att spänningen är 2.5V
När larmkontakten är öppen får du 5V

Varför krångla till det?
Jo om någon klipper av din larmtråd och byglar den så känner ditt system av detta eftersom du då
får 0V som insignal.... Tom Cruise står där med lång näsa då han klippt ditt larm men det startar ändå :wink:

Swech
Användarvisningsbild
toffie
Inlägg: 1888
Blev medlem: 22 juli 2004, 21:38:07
Ort: Töreboda / Stockholm
Kontakt:

Re: [AVR] Extern interrupt, men omvänd?

Inlägg av toffie »

Haha hallå Swech, tack för svaret!
Tänk om man hade någon som dig som förklarade sånt här, då skulle du förmodligen vara helt död men jag skulle lära
mig hur lätt som helst ;)

Absolut inget negativt till er andra, men det måste ju få vara roligt att lära sig ibland också ;)
Därför är det perfekt med forum där det finns så många som kan hjälpa :D

Hur som helst, nu ska jag inte drifta iväg för mycket..

Det var en smart lösning, men du tänker då att jag ändå använder R1 i din förklaring, som på schemat?
Man kan väl ha ett externt motstånd hur som helst ändå, mest för att skydda sig om man råkar koppla bort
det interna pull-up motståndet, det kan väl vara smart?

Motståndet vid larmkontakten måste ju då vara väl dold, inte sant? Annars ser väl tjuven att han ska koppla
efter motståndet så det inte blir något aktiverat larm? ( Om han är smart det vill säga ;))

Men om man då kopplar till ADCn, så har man max 8 portar på en AVR, vad gör man om man vill ha mer inkopplat?
Ska man koppla på externa ADC kretsar då? Är de dyra eller är det bara jag som inte hittar så bra? ;)
Nu blir väl inte Swech glad, men hittade faktiskt ingen sån krets hos dig! ;)

Electrokit, artnr. 40350118
http://www.electrokit.se/ic-linjara-max ... s_40350118

Swech's exempel kan jag nog ordna i mjukvaran, men jag måste efterfråga en guide eller beskrivning på
hur man kan läsa av fler ADC portar samtidigt, för jag har bara lyckats med att läsa av en port.
Vad jag gjort är att jag kopplat en pot på vardera tre ADC pinnar (0-2), sen med koden lyckats läsa av
en pot och visa värdet på en LCD display. Jag kan även ändra koden till en annan pinne (0-2) och då fungerar
den potten som sitter på vald pinne, men inte de andra två.

Nu har jag visserligen ingen kod att posta då allt ligger på andra datorn, men jag postar mer än gärna koden
imorgon så kanske ni kan ge mig någon ledtråd till hur jag kan lösa det :)


Sen kvarstår frågan när det gäller interrupts, kan man bara ha två externa interrupts om man ska gå på INT0/INT1?
Eller går det på något sätt att använda interrupts med de resterande pinnarna också?


Kom på nu vad det var jag glömde i förra inlägget..
Hur långa avstånd kan man använda sig av? Mellan central och larmkontakt det vill säga, beror det på kabeln?
Jag tänker på, kablar är ju "motstånd" också, så ju tunnare kabel desto bättre eller?
Men vilket totalavstånd kan man tänka sig? 10 meter? 50 meter?
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: [AVR] Extern interrupt, men omvänd?

Inlägg av vfr »

På "larmspråk" kallas det för en balanserad ingång med två, eller flera, motstånd på det viset. Man kan då känna av larm och larmfritt läge, oavsett slutande eller brytande kontakt. Plus avbrott och kortslutning, vilket blir "fel" eller "sabotage".

Edit: Stavfel
Senast redigerad av vfr 4 oktober 2009, 14:11:50, redigerad totalt 1 gång.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: [AVR] Extern interrupt, men omvänd?

Inlägg av Swech »

Kul att svaren uppskattas :D
ADC har jag inte..... vem vet, kanske jag får lägga upp några :D
Oavsett blir jag inte sur när man köper från andra :wink:

Det finns flera AVR som har mer än 8 AD ingånger.
T.ex Tiny26 har 11..

Man kan även i ditt fall använda komparatorer eftersom du
bara är ute efter 3 nivåer, ca 0V ca 2.5V och ca 5V

Sen din fråga om kabel.. säg att kabeln har 0.05 ohm /meter
50 meter kabel blir 2.5 ohm... Dina andra motstånd är på ca 10.000 ohm :vissla:
Detta inverkar inte MEN... :humm: Om Tom Cruise kommer på besök igen
så kan han ju ta en elektrisk flugsmälla, generera 10.000V och Zappa rätt in
på din signal. Detta kan effektivt slå ihjäl hela ditt system

Du måste alltså om du skall dra iväg kablar så långt skydda dem mot spikar och andra störningar.

Interrupt....
Bra tänkt men fel :D (eller iallafall inte smartast)

Du har x antal ingångar du vill kolla.. Istället för att huvudprogrammet bara rullar tummarna och väntar på interrupt
så använd en intern timer och kolla alla ingångar säg. 100 ggr / sek.

Då kan du ha obegränsat med larmtrådar (i princip)
INT0 och INT1 är istället tänkt att t.ex. väcka en battridriven processor som sover

Swech
Användarvisningsbild
E85
Inlägg: 1274
Blev medlem: 29 maj 2007, 16:24:19
Ort: Övik

Re: [AVR] Extern interrupt, men omvänd?

Inlägg av E85 »

toffie skrev:

Kod: Markera allt

// Enable ADC
ADCSRA = (1<<ADEN);

// Select ADC0
ADMUX |= (0<<MUX0);

// Use Vcc as voltage reference
ADMUX &= ~(1<<REFS1) | ~(1<<REFS0);
Jag förstår inte koden speciellt bra, men jag förstår vad den gör på ett ungefär, så jag har en del att lära
när det gäller C förstås..
Du får kolla upp i databladet vad dom olika bitarna gör (ADEN, REFS1 osv). Det finns ett fel i koden på den här raden:
ADMUX |= (0<<MUX0);
Den kommer inte sätta MUX0-biten till 0 ifall den redan är 1 eftersom det är en OR-operator som används. Korrekt skulle vara:
ADMUX &= ~(1<<MUX0);
Användarvisningsbild
toffie
Inlägg: 1888
Blev medlem: 22 juli 2004, 21:38:07
Ort: Töreboda / Stockholm
Kontakt:

Re: [AVR] Extern interrupt, men omvänd?

Inlägg av toffie »

vfr;
Menar du med motståndet vid "larmkontakten"? Eller menar du det tillsammans med mitt schema kanske?

Swech;
Nej det förstår jag också, lite svårt att tillfredsställa alla genom att ha alla komponenter som
finns på marknaden hemma ;) Blir lite väl stort lager då kanske :D

Ja det förstås, jag ska ju inte låsa mig fast vid just ATmega32, men menade bara att eftersom jag har
den hemma så blir det den första jag arbetar mot. Sen skulle man ju kunna tänka sig att ATmega32 sitter i en
"central" dit man kopplar "undercentraler".

Ungefär som att varje ADC pinne på ATmega32an i huvudcentralen utgör ett rum, i varje rum sitter sedan en
undercentral baserad på valfri ny atmel som har en sladd som går till huvudcentralen. I varje undercentral kan
man då koppla in flera olika sensorer.

Det går säkerligen att ordna så man kan se vilken sensor som triggar i undercentralen på en display på huvudcentralen
men i enklaste fallet så ser man bara vilken undercentral som larmar. Då får man gå dit och på undercentralen kanske
det sitter en lysdiod för varje inkopplad sensor så man ser vilken som larmar, alternativt ser man att ett fönster
står öppet ;)

Lite överkurs nu innan man får ordning på det första ;)
Men om vi säger att jag börjar med att scanna alla ingångar, 100 ggr/sek, då är det mitt schema jag ska gå
efter och skapa en logisk etta för att kunna använda så många I/O pinnar som möjligt?

Ja det förstås, jag blandar säkert ihop det med tjocka högtalarkablar som i sig är motstånd, inte sant?
Så för att skydda sig, vad kan man använda då? Gud det känns som om jag glömt allt från när jag jobbade med elektronik.

10.000V är ju rätt mycket, men det är ju klart att man ska skydda sig för att vara så säker som möjligt.
Jag tänkte på kondensator som stabiliserar kraftiga spikar, men det är väl inte det man ska använda sig av?
Om man nu tänker på att en vanlig kondensator ligger på mellan 16-300V? Så borde en 10kV vara rätt dyr ;)

Ampere kan man inte räkna med heller eftersom det förmodligen är väldigt lågt, inte direkt så att tjuven tar med
sig larmsystemet till ett elkraftverk för att slå ut det med största möjliga effekt ;)
Så säkringar är inte att tänka på, eller hur?

Men om nu någon drar in 10kV i en signalkabel och vi har ett lämpligt skydd mot det, då borde man väl kunna
upptäcka det och dra larmet ändå?

Bara en tanke med kodningen för att läsa av pinnarna och se om något är fel;

Kod: Markera allt

startpinne = 0;
maxpinnar = 20;
räknare = 0;
while(1)
{
	if ( pinne[räknare] == 0 )
	{
		larma(räknare);
	}

	if ( räknare == maxpinnar )
	{
		räknare=0;
	}
	else
	{
		räknare++;
	}
}

funktion larma(larmpinne)
{
	aktivera_utpinne_siren;
	skriv_till_lcd('Larm på pinne'.larmpinne);
	** vänta
}
Har jag förstått det någorlunda rätt med ovanstående kod? Hur ska jag se till att processorn väntar på "** vänta"
utan att stoppa processorn så den inte går vidare med att söka av pinnar?

Fast å andra sidan kanske den ska fortsätta söka av pinnar utifall mer händer, kanske rörelsesensor går av, annat
fönster öppnas och så vidare?

Kod: Markera allt

startpinne = 0;
maxpinnar = 20;
räknare = 0;
antal_larm = 0;
while(1)
{
	if ( pinne[räknare] == 0 )
	{
		larma(räknare);
	}
	
	if ( räknare == maxpinnar )
	{
		räknare=0;
	}
	else
	{
		räknare++;
	}
}

funktion larma(larmpinne)
{
	if ( register[larmpinne] != 1 )
	{
		antal_larm++;
		aktivera_utpinne_siren;
		if ( antal_larm > 1 )
		{
			skriv_till_lcd('Flera larm utlösta!');
		}
		else
		{
			skriv_till_lcd('Larm på pinne'.larmpinne);
		}
	}
}
Ovanstående kod gör ju så att scannern fortsätter att scanna av, men larmar bara en gång per pinne, till det att
man återställt larmet. Då flera larm har blivit utlösta så visas att flera larm utlöst och sen får man gå in i en
meny för att se samtliga larm, altenativt att man har en larmpanel med lysdioder för varje larmpinne/sektion.

Förresten, vad tror / tycker ni fungerar bäst, en integer man plussar på, som i mina exempel eller byter ut det
mot en For loop? En integer som adderas gör ju att while loopen är öppen, medan en For loop gör så att koden fastnar
i For tills det att den har räknat igenom alla pinnar. Eller fungerar det inte så i C?

Jag jämför lite med PHP och tänker på hur det fungerar där, därför kanske jag tänker fel.


Här som lovat trycker jag även in koden som jag hade på programmeringsdatorn, såg att ADMUX var satt till

Kod: Markera allt

ADMUX |= (1<<MUX0);
Har inte hunnit testa vad skillnaden blir med ett & och ett ~ tecken gör, men får ta och testa det sen! :)

Koden nedan är hur som helst den jag pratade om där jag bara kunde läsa av en ADC kanal åt gången, tanken är att
när jag rör på en pot så ska displayen visa värdet från potten medan man ändrar värdet samt vänta kvar 2-3 sekunder
för att sen återgå till ett "standby" läge.

Visst det gör den, i stort sett, fast att vänta 2-3 sekunder vill den inte. Jag la det projektet lite åt sidan nu när
jag fastnade i det här "larm" projektet :D Men kan ju vara roligt om det nu är så enkelt att bara ändra ADC pinne med
en while loop och på så sätt kunna lyckas läsa av alla tre pottar :D

Men men, nu ska jag sluta svamla med en massa idéer och frågor, här kommer koden, dock inte headers och så, men i
stort sett allt är väl med;

Kod: Markera allt

int main(void)
{
	DDRD = 0xFF;
	PORTD = 0x00;

	// Value for the register, placeholder
	uint8_t value = 0;
	uint8_t valuecompare = 0;

	uint16_t countTime = 32000;
	uint16_t icount = 0;
	uint16_t icountduplicator = 0;

	char intstr;
	int firststart = 0;
	char buffer [33];

	// -------------------------
	// Initialize PWM

	// 8-bit PWM, Phase correct
	// 8 bits give us 256 levels of brightness
	TCCR1A |= (1<<WGM10);

	// Clear OC1A/OC1B on Compare Match
	// Set OC1A/OC1B at BOTTOM (non-inverting mode)
	TCCR1A |= (1<<COM1A1);

	// Set prescaler to 8
	// 1 MHz / 8*256 = ~490 Hz PWM frequency
	TCCR1B |= (1<<CS11);

	// -------------------------
	// Initialize ADC

	// Enable ADC
	ADCSRA = (1<<ADEN);

	// Select ADC0
	ADMUX |= (1<<MUX0);

	// Use Vcc as voltage reference
	ADMUX &= ~(1<<REFS1) | ~(1<<REFS0);

	// Select divider factor 8, so we get 1 MHz/8 = 125 kHz ADC clock
	//ADCSRA |= (1<<ADPS1) | (1<<ADPS0);
	ADCSRA = 0xEE;

	// Left adjust ADC result to allow easy 8 bit reading
	ADMUX |= (1 << ADLAR);

    /* initialize display, cursor off */
    lcd_init(LCD_DISP_ON);

	lcd_clrscr();
	lcd_puts("Startup message\nHello World?!");
	_delay_ms(6000);

    // Clear display and cursor position
    lcd_clrscr();

    // Put string to display
    //lcd_puts("Controller\n");

    while (1)                           // loop forever
	{
		// Write the value to the Output Compare Register A
		//OCR1A = value;
		OCR1B = value;
		OCR2 = value;

		// what happens here??
		value = ADCH;

		// Start ADC conversion
		ADCSRA |= (1<<ADSC);

		// has the value changed? if so, update the LCD display
		if ( value != valuecompare )
		{
			lcd_gotoxy(0,0);
			lcd_puts("Action done..   ");

			// Goto this position; Character 1, Line 2
			lcd_gotoxy(0,1);

			// Put string to display
			lcd_puts("Volume:");

			// Goto this position; Character 9, Line 2
			lcd_gotoxy(8,1);

			// Convert string to integer
			intstr = itoa(value,buffer,10);

			// Write buffer to display
			lcd_puts("   ");
			lcd_gotoxy(8,1);
			lcd_puts(buffer);

			// Set the value to compare with, to see if value has changed
			// if it has changed it will update the LCD display
			valuecompare = value;
			icount=0;
		}

		if ( icount != countTime )
		{
			while( icount <= countTime )
			{
				if ( icount == countTime )
				{
					lcd_clrscr();
					lcd_puts("Controller ready!:");

					icountduplicator=0;
				}

				icount++;
			}
		}

		if ( firststart == 0 )
		{
			lcd_clrscr();
			lcd_puts("Controller ready!:");
			firststart = 1;
		}
    }
}
Användarvisningsbild
toffie
Inlägg: 1888
Blev medlem: 22 juli 2004, 21:38:07
Ort: Töreboda / Stockholm
Kontakt:

Re: [AVR] Extern interrupt, men omvänd?

Inlägg av toffie »

Förresten, hur fungerar en magnet/larmkontakt? Fungerar den som en bygel eller sitter det något motstånd i den eller
annat som gör att det inte blir direkt kortslutning mot avläsningspinnarna?

Varför jag frågar är då jag tänkte använda vanliga pin-byglar för att "simulera" magnetkontakter innan jag köper dem :)
Om någon vet så skulle det vara underbart :D
Användarvisningsbild
E85
Inlägg: 1274
Blev medlem: 29 maj 2007, 16:24:19
Ort: Övik

Re: [AVR] Extern interrupt, men omvänd?

Inlägg av E85 »

Du får tänka på att varje bitnamn, t.ex MUX2 inte är nåt magiskt utan bara definierat som den position i ADMUX-registret där man finner biten. Om nu MUX2 är bit 2 i ADMUX-registret för din processor så blir (1 << MUX2) samma sak som (1 << 2), alltså binärt 00000100.

Om du nu använder |= så tar den det ursprungliga värdet på ADMUX och gör bitvis OR. Om ADMUX var 10100000 och du skriver:

Kod: Markera allt

ADMUX |= (1 << MUX2); //Rätt
så blir resultatet 10100000 OR 00000100 = 10100100.

Kod: Markera allt

ADMUX |= (0 << MUX2); //Fel
I det fallet blir resultatet 10100000 OR 00000000 = 10100000. Alltså ingen skillnad på ADMUX. Det blir inte heller nån skillnad om ursprunget var 1 eftersom det är OR.

Om man då tar AND:

Kod: Markera allt

ADMUX &= ~(1 << MUX2); //Rätt
~ betyder invertera byten, så ~(1 << 2) blir 11111011. Resultatet blir 10100000 AND 11111011 = 10100000. Ingen skillnad alltså eftersom bit 2 redan var 0 men om den var 1 skulle den bli 0.

Kod: Markera allt

ADMUX &= ~(0 << MUX2); //Fel
Här får vi 10100000 AND 11111111 = 10100000. ADMUX ändras inte.

Det man kan dra som slutsats är att |= används för att sätta en bit till 1 och &= med invertering (~) för att sätta en bit till 0. Kanske långt och krångligt men hoppas nån fattar.
Användarvisningsbild
toffie
Inlägg: 1888
Blev medlem: 22 juli 2004, 21:38:07
Ort: Töreboda / Stockholm
Kontakt:

Re: [AVR] Extern interrupt, men omvänd?

Inlägg av toffie »

Oj vilken förklaring, lite förstod jag, men jag har verkligen seriösa problem med bitwise, jag tycker verkligen det är svårt..
Jag har läst både nybörjarguider för bitwise och andra guider men jag kan bara inte lära mig det..

~ delen förstod jag, att det inverterar..

Det känns fel på något sätt med OR, för det känns som om det blir ihopsättning bara..
Eftersom 10100000 OR 00000100 blir 10100100, det är ju inte som ett vanligt OR, liknande;

Kod: Markera allt

if ( int == 10100000 OR int == 00000100 )
Någon som vet en enormt enkel guide/tutorial ( /slå in i huvudet på toffie guide) som ni kan rekommendera?
Användarvisningsbild
E85
Inlägg: 1274
Blev medlem: 29 maj 2007, 16:24:19
Ort: Övik

Re: [AVR] Extern interrupt, men omvänd?

Inlägg av E85 »

Nja jag tycker inte bitwise är så svårt. Det är ju bara att ta bit för bit OR/AND.

00010101 | 00110110 blir

0 OR 0 = 0
0 OR 0 = 0
0 OR 1 = 1
1 OR 1 = 1
0 OR 0 = 0
1 OR 1 = 1
0 OR 1 = 1
1 OR 0 = 1

Alltså 00010101 | 00110110 = 00110111

Och samma princip för &...
Användarvisningsbild
toffie
Inlägg: 1888
Blev medlem: 22 juli 2004, 21:38:07
Ort: Töreboda / Stockholm
Kontakt:

Re: [AVR] Extern interrupt, men omvänd?

Inlägg av toffie »

Ah ok, det där var ju rätt lätt att förstå, men hur menar du att det blir samma med & tecknet?
Menar du att 00010101 | 00110110 = 00110111 är samma som 00010101 & 00110110 = 00110111?

Vad gör de i sådant fall för skillnad? Ursäkta om jag frågar, men måste ta chansen när någon lyckas lära mig något :D
Skriv svar