# ATMEL mikrokontrolleri >  Kā Atmegai dot signālu "1" vai "0"

## marcina

```
main: 
ldi r16,0         
out DDRB, r16 ; tas jau it kā pēc defaulta
ir_signals:
in r19,PINB
cpi r19,1
breq ir_signals
; te ir skrejošo lampiņu kods
rjmp main
```

 šīs rindiņas uzrakstot (AVR Studio assemblers), es biju cerējis, ka, ja uz Porta B pirmās kājiņas būs "1", lampiņas neskries
Izmēģinot, t.i. pie šīs kājiņas pieliku vadiņu ar +4.5 voltiem, nekas nenotika - itkā signāla nemaz nebūtu. Kāpēc? Arī pats čips barojas no šiem 4.5 voltiem.

----------


## Velko

Un kas tev iekš PORTB (pēc tā skrienošo lampiņu koda)? Ir tāda lieta, kā pull-up rezistori, kas tiek aktivizēti, ja DDRB(x) = 0, bet PORTB(x) = 1. Tādā gadījumā arī šie pin-i lasās kā 1 (ja ārēji netiek "sazemēti").

"Atfiltrē" tikai to vienu bitu:

```
andi r19, 1
cpi r19, 1
breq ir_signals
```

 Var uzrakstīt īsāk, bet tad kods nav tik paš-paskaidrojošs: 

```
andi r19, 1
brne ir_signals
```

----------


## M_J

Jautaajums - kas ir ar paareejaam porta ieejaam? Ja taas vienkaarsi karaajas gaisaa, tad loti ticams, ka vieninieks ir ne tikai tajaa ieejaa, kur pielikti tie 4.5V bet veel citaas. Un tad nu nolasot ieks r19 PINB, tur nekad nebuus 1. Ja ir slinkums taas paareejaas ieejas caur rezistoriem seedinaat uz zemi, tad peec 

in r19,PINB

var pievienot vienu komandu, kas atfiltree neintereseejosaaa ieejas

andi r19,1

----------


## marcina

Paldies par padomiem! Tik tiešām palīdzēja!   ::  
Citas porta kājas karājas gaisā..
Taču tik un tā ir jautājums:
ja es turu vadu pie kājiņas, bet tad pieslēdzu vada otru galu pie baterijas, viss ok
bet ja es sākumā turu pie baterijas un tad pielieku pie kājiņas, tad bez reset nekas tālāk nedarbosies   ::  
Kur tad tagad problēma?
iezemēt vajag?

----------


## marcina

Nu es sapratu tā, bet cik tad lielu to rezistoru likt, ja 4.5 voltu liels spriegums?

----------


## M_J

Ne mazaaku par 125 omiem. Ja kluudiisies programmeejot, nokonfigureesi pinu kaa izeju un padosi tur logisko 1, netiks paarsniegti 40mA, kas ir maksimaalaa pielaujamaa straava piemeeram ATMEGA8535 vienam izvadam. Ja neizmanto pull-up, tad viss straadaas arii, ja rezistors buus 1Mom un lielaaks. Pull-up rezistori ja nemaldos tika definēti kā dazi desmiti kiloomu lieli. Ja izmanto pull-up, tad rezistors vareetu buut 1kom. Taa kaa robezas ir diezgan plasas.

----------


## Velko

Parasti gan taisa drusku savādāk: slēdzi pievieno starp pinu un GND un ieslēdz pull-up. Drošības pēc (M_J minētais piemērs) var ielikt virknē kādu 1K rezistoru. Programmas loģika, protams, mainās uz pretējo.

Shēma tā sanāk vienkāršāka - nav jāvelk lieka VCC līnija.

----------


## marcina

Velko piedāvājums tik tiešām visizdevīgākais, tai skaitā arī M_J   ::  
Bet praktiski pielietojot, sapratu, ka ja es virknē lieku  jebkādu rezistoru,  tad ne par ko neies   ::  
Nu labi, iztiksim arī bez tā   ::

----------


## janispu

> ```
> main: 
> ldi r16,0         
> out DDRB, r16 ; tas jau it kā pēc defaulta
> ir_signals:
> in r19,PINB
> cpi r19,1
> breq ir_signals
> ; te ir skrejošo lampiņu kods
> ...


 Ierakstot 0 DDRB reģistrā šis ports tiek ieprogrammēts uz datu ievadu un tad cerēt, ka ar porta B palīdzību varēs vadīt kādu ārējo ierīci, piemēram, gaismas diodi, ir naivi. Mirgojošai lampiņai kods varētu būt šāds:
ldi r16,1
out DDRB,16
m1:
ldi r16,0
out PORTB,r16
pauze ~1sek
ldi r16,1
out PORTB,r16
rjmp m1

Slēgums:
+4,5V---rezistors 150...240omi---(A)gaismas diode(K)---PORTB jaunākais izvads (PB0).

----------

