Hvordan skriver/læser man til/fra en bestemt pin på Atmel's AVR?

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Danish to

Threaded View
Hejsa

Jeg har købt mig et STK500 fra Atmel samt downloadet CodeVision i en
evaluationversion til at skrive kode i.

Hvis jeg ønker at læse knapperne på boardet og bare skrive dem ud på
de respektive LED's kan man bare skrive:

PORTB=PIND;

hvilket jo er såre simpelt, men hvordan gør man det for en bestemt
pin? (både læse og skrive).

Håber, I kan hjælpe mig

--
Mvh.

Tomas


Re: Hvordan skriver/læser man til/fra en bestemt pin på Atmel's AVR?


Quoted text here. Click to load it

Du skal maske de ikke-relevante bits væk.
Hvis du er interesseret i D3, AND'er du med 08H, eller OR'er med F7H,
afhængig af hvordan din logik vender.

/Bo.

Re: Hvordan skriver/læser man til/fra en bestemt pin på Atmel's AVR?
Hej

Quoted text here. Click to load it


Jeg har ikke den store erfaring med AVR, men en mulighed til at lave
maskningen kunne være at definere nogle macroer som vist i følgende eks.:

// Define pin connections
#define DispDataOutPort   PORTB
#define DispDataOutBit    0


// Define IO macro's
#define DispDataOut_H     DispDataOutPort |=  (1<<DispDataOutBit)
#define DispDataOut_L     DispDataOutPort &= ~(1<<DispDataOutBit)


Så kan "PORTB.0 = 1;" funktionen opnås ved at skrive "DispDataOut_H"
og "PORTB.0 = 0" funktionen opnås ved at skrive "DispDataOut_L".

Håber at det letter lidt på maskningen af dine IO's

Hilsen Bjarke





Re: Hvordan skriver/læser man til/fra en bestemt pin på Atmel's AVR?
Quoted text here. Click to load it

Så på denne måde kan du måske hjælpe dig selv til at skabe en
sammenhængende port, du kan skrive til bit 0 - 7, hvis du rent
HW mæssigt har været nødsaget til at benytte enkelte pinne til
andre operationer (INTR, TIMER etc)?

--
Mvh.

Tomas


Re: Hvordan skriver/læser man til/fra en bestemt pin på Atmel's AVR?
Quoted text here. Click to load it

Du skriver f.eks. PORTB.6, for at skrive til PORTB, ben 6.
Tilsvarende f.eks. PINA.3 for læsning.

Alternativt som Bo skriver.

--
MVH Troels



Re: Hvordan skriver/læser man til/fra en bestemt pin på Atmel's AVR?
Troels B. Pedersen <mail[snabela]mitmellemnavn.dk> skrev:
Quoted text here. Click to load it


Denne metode synes jeg, jeg har forsøgt - men uden held. Må bare
prøve igen - ellers prøver jeg, som Bo foreslår :-)

--
Mvh.

Tomas


Re: Hvordan skriver/læser man til/fra en bestemt pin på Atmel's AVR?
hey, du skal jo lige huske at sætte direction regisrteret.... den er jo
lidt anderledes end en 8031......

/f

Tomas . wrote:
Quoted text here. Click to load it

Re: Hvordan skriver/læser man til/fra en bestemt pin på Atmel's AVR?
Quoted text here. Click to load it

Hvis dette virker:

Quoted text here. Click to load it

Går jeg ud fra at DDR er sat! ;)


Brian



Re: Hvordan skriver/læser man til/fra en bestemt pin på Atmel's AVR?
Quoted text here. Click to load it

Jeps,
DDRD=0x00;        
DDRB=0xff;
sætter jo hhv. port B som output og port D som input.

--
Mvh.

Tomas


Re: Hvordan skriver/læser man til/fra en bestemt pin på Atmel's AVR?
Quoted text here. Click to load it

Der er åbenbart ingen der kan svare dig!? - Jeg roder selv meget med AVR men
jeg roder ikke med det der C-pjat! ;) Jeg kan godt fortælle dig hvordan du
kan gøre det i assembler hvis det er?
Tilmeld dig evt. på http://www.avrfreaks.net/ og spørg der!


Brian



Re: Hvordan skriver/læser man til/fra en bestemt pin på Atmel's AVR?
Quoted text here. Click to load it

Det er jo lidt som religion, om man vælger Assembler eller C Jeg
ved dog godt, at skal man programmere et system i Real-time er
assembler helt klart at foretrække, da du har fat i hardwaren
helt anderledes, men er ikke videre stærk i assembler, så jeg
holder mig til C :-)

Jeg prøver avrfreak - takker

--
Mvh.

Tomas


Re: Hvordan skriver/læser man til/fra en bestemt pin på Atmel's AVR?
Hej Tomas

En lille hurtig guide, som dybest set ikke indeholder mere end hvad
andre allerede har skrevet:

LE6%se ben 3 (Bit 2, siger vi bare) fra port D:
input 3D% PIND & (1 << 2);
Giver 0000 0100 3D% 4 3D% (1 << 2) for logisk hF8%j, 0 for logisk lav.
Eventuelt _kan_ man gF8%re:
input 3D% (PIND & (1<<2)) ? 1 : 0;
Men oftest er det ganske unF8%dvendigt.


TE6%nde bit 2 og 3 pE5% port B:
DDRB |3D% (1<<2) | (1<<3);  // Skal kun gF8%res en gang i starten :-)
PORTB |3D% (1<<2) | (1<<3) ;
OR-operatoren gF8%r, at andre ben pE5% samme port er upE5%virkede.

Slukke bit 2 og 3 pE5% port B:
DDRB |3D% (1<<2) | (1<<3);  // Skal kun gF8%res en gang i starten
PORTB &3D% ~( (1<<2) | (1<<3) );

Toggle bit 2 pE5% port B:
DDRB |3D% (1<<2) ;  // Skal kun gF8%res en gang i starten
PORTB ^3D% (1<<2);


TE6%nde bit 2 pE5% port B, hvis bit 4 pE5% port D er hF8%j, slukke ellers
(et bud i alt fald):
DDRB |3D% (1<<2) ;  // Skal kun gF8%res en gang i starten
if ( PIND & (1<<4) )
{
  PORTB |3D% (1<<2);
}
else
{
  PORTB &3D% ~(1<<2);
}

Mvh
Jesper
--
http://fdf.dk/landsdel1 /


Tomas . wrote:
We've slightly trimmed the long signature. Click to see the full one.
Re: Hvordan skriver/læser man til/fra en bestemt pin på Atmel's AVR?
Hej Jesper

Tak for din udførlige guide. Lige lidt kommentarer/spørgsmål:

Quoted text here. Click to load it

Hvordan fungererer dette? Jeg troede << var til left shift.
Hvordan virker det med 1 << 2)

Quoted text here. Click to load it

OK. Her vil input så være = 1, hvis PIND = 4dec og 0, hvis den
antager alle andre værdier, korrekt?

Quoted text here. Click to load it

| er logisk OR, hvad er |= Excl-OR?


Quoted text here. Click to load it

&= Hvad giver det af logisk operation?
hvordan med ~?
Quoted text here. Click to load it

Den er smart!
^= betyder?
Quoted text here. Click to load it

Det skal prøves.

Rigtig mange tak for hjælpen ellers. Det er fedt, at få noget
starthjælp ind i denne spændende verden, fedest :-)

--
Mvh.

Tomas


Re: Hvordan skriver/læser man til/fra en bestemt pin på Atmel's AVR?
Hej Tomas

Lidt kommentarer/svar:

Quoted text here. Click to load it

(1 << 2) 3D% 1*2^2 3D% 4dec 3D% 0000 0100 bin
Det betyder rigtig nok left shift, og det giver ogsE5% mening her. LE6%g20%
mE6%rke til, at jeg var interesseret i informationen pE5% ben 3, dvs. Bit20%
22E% Det, jeg fE5%r tilbage, er et 1-tal pE5% ben 3's plads, som jeg sE5%20
AND'er med inputtet. Det kalder man at maske, da det kun lukker input20%
fra ben 3 igennem. Uanset hvad der er pE5% alle de andre ben, vil de20%
give nul nE5%r man AND'er med masken.
  xxxx x0xx
& 0000 0100
-----------
  0000 0000   dvs. logisk lavt dvs. "slukket"

  xxxx x1xx
& 0000 0100
-----------
  0000 0100   dvs. logisk hF8%jt dvs. "tE6%ndt"

At skrive det pE5% formen (1 << 2) er bare dovenskab i stedet for at20%
skrive 4. HVIS man nu ville lukke inputtet fra flere ben igennem,20%
kunne man skrive f.eks. PIND & 37   eller mere intuitivt   PIND &20%
((1<<5) | (1<<2) | (1<<0)) , hvilket er Bit5 3D% ben 6, Bit2 3D% ben 3 og20%
Bit0 3D% ben 1. Det er mere lE6%sevenligt og man er fri for at skulle20%
regne de 37 ud pE5% forhE5%nd. Det er ikke beregningsmE6%ssigt tungere for20%
processoren, for compileren sF8%rge for at regne konstanterne i20%
sidstnE6%vnte udtryk til fF8%rstnE6%vnte udtryk.


Quoted text here. Click to load it

Ikke helt. Den vil vE6%re 1 hvis PIND har Bit2 3D% ben 3 tE6%ndt, og 0 hvis20%
PIND har Bit2 3D% ben 3 slukket, uanset om de andre ben er tE6%ndte eller20%
slukkede. De bliver jo masket ud, nE5%r man AND'er med (1<<2), sE5% deres20%
status er ubetydelig.

Quoted text here. Click to load it

a |3D% b;
betyder det samme som
a 3D% a | b;
Ligesom
a +3D%b;
er det samme som
a 3D% a + b;

DDRB |3D% (1<<2) | (1<<3);
betyder sE5%
DDRB 3D% DDRB | (1<<2) | (1<<3);
Dvs., uanset hvad DDRB er i forvejen, sE5% skal Bit2 og Bit3 vE6%re20%
udgange:

  xxxx xxxx
| 0000 1100
-----------
  xxxx 11xx

Quoted text here. Click to load it

Tjah, ligesom forrige.

Quoted text here. Click to load it

a &3D% b;
er det samme som
a 3D% a & b;

  ( (1<<2) | (1<<3) ) 3D% 0000 1100bin
~( (1<<2) | (1<<3) ) 3D% 1111 0011bin
Det kaldes binE6%rt negeret, og betyder at der bliver byttet om pE5% 0 og20%
12E%
LE6%g sE5% mE6%rke til, at uanset hvad PORTB's status er i forvejen, sE5%20
bliver Bit2 og Bit3 sat til slukket:
  xxxx xxxx
& 1111 0011
-----------
  xxxx 00xx


Quoted text here. Click to load it

a ^3D% b;
er det samme som
a 3D% a ^ b;
LE6%g mE6%rke til, at ^ ikke betyder "eksponentionelt oplF8%ftet til", men20%
Exclusive OR.

Beviset for at den virker er simpelt:
Hvis Bit2 er tE6%ndt, skal toggle slukke den:
  xxxx x1xx
^ 0000 0100
-----------
  xxxx x0xx

Hvis Bit2 er slukket, skal toggle tE6%nde den:
  xxxx x0xx
^ 0000 0100
-----------
  xxxx x1xx

Overbevis dig om dette ved at kigge sandhedstabellen for Exclusive OR.

Quoted text here. Click to load it

No problem, beklager den lange svartid.

Quoted text here. Click to load it

Mvh
Jesper
--
http://fdf.dk/landsdel1 /


Site Timeline