» »

Branje vhoda, posamezen bit

Branje vhoda, posamezen bit

mirch ::

V C-ju potrebujem malo pomoči. Namreč imam razvojno ploščo, ter na njo vezanih 8 diod, katere posamično svetijo od leve proti desni. Z delay_loop lahko nastaviš kolikšno hitrost od leve proti desni želiš.

Jaz bi namesto vrednosti v delay_loop-u uporabil spremenljivko - da bi večal hitrost utripanja, ter bral z porta B - en bit je hitrejše utripanje, drugi je počasnejše, tretji reset

DDRB &= ~0xD0; // set bits 4, 6 and 7 to input
	PORTB |= 0xD0; // Enable pull ups on bits 4, 6 and 7


pač bral sem samo z bitov 4, 6 in 7, ker več ne potrebujem

kako pozneje te berem?

Naprimer hočem prebrat bit 7 uporabim verjetno if(DDRB=0x80 ... ? Ali kako?


Prosim za podrobno pomoč :)

bosto ::

Port b se bere z x=PINB.

mirch ::

kaj pa posamezen bit POrt-a b?:)

mirch ::

Bom podal kar celo kodo, namreč sem zelo slab v C jeziku. Prosim ne se norčevat.

#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>
#include <avr/signal.h>
#include <inttypes.h>
#define PINB_MASK ((1<<PINB6)|(1<<PINB7))

int main (void)
{
	int i = 0;
	int b = 0;
	int c = 0;
	int reset = 0;
	unsigned long T = 30000; // Set delay to 30000 milisec

	DDRD = 0xFF; //set PORTD for output
	DDRB &= ~0xC0; // set bits 6 and 7 to input
	PORTB.6 = 0;
	PORTB.7 = 0;
	PORTB |= 0xD8;
	PORTB |= PINB_MASK;

	while(1)
	{
		for(b = PORTB6; b > 0)
		{
			T = T*10;
		}

		for(c = PORTB7; c > 0)
		{
			T = T/10;
		}
	}


	while(1)
	{
		for(i = 1; i < 128; i = i*2)
		{
			PORTD = i;
			_delay_loop_2(T);
		}
		
		for(i = 128; i > 1; i -=i/2)
		{
			PORTD = i;
			_delay_loop_2(T);
		}
	}
	return 1;
}


Rad bi z bitoma 6 in 7 porta B krmilil velikost spremenljivke T.


Prosim za pomoč

bosto ::

Ahjej. V principu, ti hočeš namesto unih dveh for zank neki takega:

if(PINB && !(_BV(PINB6))
{
   ++T;
}

if(PINB && !(_BV(PIN7))
{
   --T;
}


V praksi to ne bo dobro delalo, ker kontakti tipk skačejo, kar pomeni da ti bo ta koda zaznala več pritiskov namesto enega. Če hočeš to rešit, moraš dodat debouncing. Pa malo pomatraj google na to temo ;)

edit: pozabu da si naštimal pull up upore na vhode.

Zgodovina sprememb…

  • spremenilo: bosto ()

mirch ::

Nucam kakšen dan (googlanje + razmišljanje + pisanje + preizkus + neznanje) :) sporočim :)

Hvala za nasvete in pomoč bosto!

mirch ::

Trenutno imam tole, vendar ne deluje:

// CylonEyes.c

#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>
#include <avr/signal.h>
#include <inttypes.h>

int main (void)
{
	int i = 0;
	unsigned long T = 15000; // Set delay to 30000 milisec


	DDRD = 0xFF; //set PORTD for output
	DDRB = 0x00; // set PORTB to input

	while(1) {

	
		for(i = 1; i < 128; i = i*2)
		{   if(PINB && !(_BV(PINB6)) )
			{
				T=30000;
			}

			if(PINB && !(_BV(PIN7)) )
			{
				T=1000;
			}
			PORTD = i;
			_delay_loop_2(T);

		}
		
		for(i = 128; i > 1; i -=i/2)
		{    if( PINB && !(_BV(PINB6)) )
			{
				T=30000;
			}

			if(PINB && !(_BV(PIN7)) )
			{
				T=1000;
			}
			PORTD = i;
			_delay_loop_2(T);
		}
	}
	return 1;
}


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Arduino in luči (strani: 1 2 )

Oddelek: Elektrotehnika in elektronika
9812054 (9680) FX6300B
»

Vprašanje v zvezi z rand() funkcijo

Oddelek: Programiranje
495385 (4575) fireice
»

C strukture, kazalci naloga pomoc

Oddelek: Programiranje
51461 (1356) DavidJ
»

[C] random do poljubne številke

Oddelek: Programiranje
172151 (1818) napsy
»

interupti in merjenje frekvence v picu

Oddelek: Elektrotehnika in elektronika
262185 (1941) neoto

Več podobnih tem