# ATMEL mikrokontrolleri >  Atmega8 + AVR Studio 4

## Edzukins

Sveicināti, esmu pilnīgs iesācējs visās šajās lietās tapēc esat saudzīgi pret mani  :: 

Lai izprastu kā ieprogrammē MK izprovēju uztaisīt elementāru shēmu:

Kods:


```
#include <avr/io.h>          // this contains all the IO port definitions
#include <compat/ina90.h>    // among other things, contains _NOP()

void wait_some_time()
{
register unsigned short int t = 0;

while(++t) _NOP();
}

int main()
{
DDRC  = 0x0F;  // PC0..PC3 as output
PORTC = 0x00;  // all PORTC output pins Off

while(1)
{
PORTC ^= 0x01;
wait_some_time();
PORTC ^= 0x02;
wait_some_time();
PORTC ^= 0x04;
wait_some_time();
PORTC ^= 0x08;
wait_some_time();
}
return 0;
}
```

 šis kods darbībā:
http://berzerker.ucoz.net/Video3.wmv
tad es paeksperimentēju un pārtaisīju kodu uz šādu:


```
PORTC ^= 0x08;
wait_some_time();
PORTC ^= 0x04;
wait_some_time();
PORTC ^= 0x02;
wait_some_time();
PORTC ^= 0x01;
wait_some_time();
PORTC ^= 0x12;
wait_some_time();
```

 atttiecīgais video(P.S. nepievērsiet uzmanību tam, ka tur parādās vēl divi LED, par to vēlāk):
http://berzerker.ucoz.net/Video10.wmv

Pievienojot rindinju PORTC ^= 0x12; es cerēju ka ieslēgsies izslēgsies pirmā + otrāa LED (0x08 + 0x04 = 0x12) bet es kļūdījos, kāds man varētu izskaidrot šo principu, lūdzu? Kā jau teicu esmu pilnīgs iesācējs, nekā nesaprotu  ::

----------


## Edzukins

ja nu gadījumaa mani norādiitie video neiet, ieliku viņus iekš YouTube:
pirmais video - http://www.youtube.com/watch?v=4KGwDLmugQ0
otrais video - http://www.youtube.com/watch?v=1juIqHwyvVM

----------


## karloslv

1) NOP galīgi nav nepieciešams, arī attiecīgā #include. Kompilators pats prot izniekot laiku, ja vajag. Pietiek ar ciklu "while (++t);"
2) register - nu arī neredzu nepieciešamību, kādēļ tas ir jānorāda. GNU kompilators ir pietiekami gudrs un šādā ciklā, protams, mainīgais būs reģistrā.
3) wait_some_time vietā iesaku #include <util/delay.h> un _delay_ms(tikuntik); vai _delay_us(tikuntik); - tikai jāuzmanās, tām milisekundēm un mikrosekundēm ir limits, lasi .h failā komentāros. turklāt jābūt pareizi uzdotam makrosam F_CPU (takts frekvence hercos)

Citādi viss ir ļoti veiksmīgi.

Jautājums - kādā softā zīmēji shēmu?

----------


## karloslv

Atbilde uz Tavu pēdējo jautājumu ir gaužām triviāla: 0x04 + 0x08 = 0x0C, nevis 0x12.

 :: 

(Korektāk gan būtu rakstīt 0x04 | 0x08 = 0x0C, jo bitu maskas parasti nesaskaita)

----------


## Edzukins

shēmu es pats nezīmēju, dabuuju ar googli, taapat kaa kodu.
Par delay, jaa es jau biju atradis delay, bet iisti nezinaaju kuru lietot, tur bija arii kkaads long delay un nevareeju atrast limitus.

Papeetiiju citu kodus, un neredzeeju ka kaads liktu vairaak par 100, taapeec lai dabuutu 1/2 sec rakstiiju shaadi:


```
 
void wait_some_time()
{
uint8_t i;
for(i=0;i<5;i++) _delay_ms(100);
}
```

 Par to HEX kodu arii jau paspeeju saprast, ka galiigi auzaas esmu iebraucis, bet es vienalga nesapratu kapeec PORTC ^= 0x12; nostraadaaja tieshi taa...
Peex HEX 0x12 iznaak 18 decimaalajaa tas noziimee 0x10 + 0x2 kam teoreetiski buutu jaasanaak ka iesleedzas 5.ktaa LED un izsleedzas 2.traa LED, bet video redzams kkāds murgs.
P.S. Otrajaa video ir redzams ka es pielodeeju vēl divus LED pie 27. un 28. kājiņas.
Pēc dotā piemēra man likās ka jābūt tā:
PORTC ^= 0x01; // 23. kājiņa | PC0
PORTC ^= 0x02; // 24. kājiņa | PC1
PORTC ^= 0x04; // 25. kājiņa | PC2
PORTC ^= 0x08; // 26. kājiņa | PC3
PORTC ^= 0x10; // 27. kājiņa | PC4
PORTC ^= 0x20; // 28. kājiņa | PC5
PORTC ^= 0x12;  // 26. kājiņa  // 25. kājiņa EDIT: [nepareizi]
Vai tomēr mans domu gājiens ir galīgi garām, jo PC4 un PC5 vispaar nereaģēja?

Un par to saskaitīšanu - katru nākamo vērtību liek 2x lielaaku par ieprieksheejo, tajos gadiijumos lai vareetu saskaitiit un ieguut unikaalu apvienojumu, bet es tochna no shitaa nekaa nezinu, tapeec droshi vien kljuudos, bet kaapeec gan tad veertiibas buutu 1;2;4;8;... nevis 1;2;3;4;5;...

Bet mani interesē arī cita lieta - vēlos shēmai pievienot parastu podziņu, ar kuru varētu pārslēgt mirgošanas režīmus. Par šo lietu es nevienu piemēru netā nespēju atrast, t.i. kā uztaisiit panākt lai mikrokontrolieris kko dara atkarībā no āriejiem apstākļiem (nu, piemēram, pogas nospieshana, sensora darbība, utt)

es šo lietu vēlos izprast lai varētu uztaisīt līnijsekotāj robotiņu.

P.S. Manas spējas programmēšanā ir par švaku lai "iebrauktu" URMASA kodā...  ::

----------


## karloslv

Par _delay esi pareizi izdomājis, es arī tos lieku ciklā. Maksimālās vērtības skaties šeit: http://www.nongnu.org/avr-libc/user-man ... delay.html

PORTC ^= 0x12 būtu reizē jāpārslēdz 24. un 27. kāja (PC1 un PC4). Taču vai esi uzstādījis DDRB = 0x2F pirms tam, jo tagad jau Tev ir sešas izvadkājas?

----------


## karloslv

Par saskaitīšanu - tā ir binārā aritmētika. Jebkuru skaitli var izteikt kā summu no 1,2,4,8,16,32,64,..., katru no saskaitāmajiem izmantojot vienu vai nevienu reizi, turklāt katru skaitli var izteikt tikai vienā vienīgā veidā. Tāpēc arī no šiem skaitļiem vienmēr var iegūt unikālas kombinācijas. Vērtīgi iemācīties arī šos pašus skaitļus heksadecimālajā: 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x100 u.t.t. Vienkārši palasi kaut kur par bināro un sešpadsmitnieku sistēmu, gan pieleks ar laiku. 

No otras puses skatoties - mikrokontrolieris neko nezina par skaitļiem, un rindiņa PORTC ^= 0x12 nozīmē PORTC = PORTC ^ 0x12, jeb bināri 00010010, kas savukārt dzelžu līmenī nozīmē - nolasām PORTC stāvokli un izmainām 1. un 4. bitu (skaitot no 0), vērtību ierakstām atpakaļ PORTC.

----------


## karloslv

Hm, nu URMASam nevajadzētu būt biesmīgi sarežģītam, ja iziet cauri un paskaidro nesaprotamās vietas. Tur varētu būt dažādi C programmēšanas triki, kuri varbūt sākumā šķiet nesaprotami. Ja kas, vari jautāt, palīdzēšu iziet cauri.

----------


## Edzukins

> Taču vai esi uzstādījis DDRB = 0x2F pirms tam, jo tagad jau Tev ir sešas izvadkājas?


 Neesmu gan  :: , jo to lietu arī es īsti nesaprotu  ::

----------


## karloslv

Ar pogām ir tā:

1) Dzelžu daļa - poga ir "jāpievelk" caur rezistoru pie VCC vai GND. Principā var likt pa tiešo pret GND un izmantot AVRā iebūvētos rezistorus.
2) Programmas daļa - lai nolasītu pogas stāvokli, jāpārbauda PINC vērtība (vai PINB, PIND atkarībā no porta burta). Pašā programmas sākumā jāuzstāda attiecībās kājas režīms - PORTC uz nulli, bet DDRC uz vieninieku, tad tiks pieslēgts iebūvētais rezistors pret VCC.

Kods (poga ieslēgta pret zemi, izmantojam iebūvēto rezistoru):


```
// šādi ērtības labad es definēju, ko man katra kāja nozīmē
#define PIN_POGA PC1

// programmas sākumā uzstādām portu režīmus
PORTC = 0;
DDRC = (1 << PIN_POGA);

// kad gribam pārbaudīt, vai poga nospiesta
if (PINC & (1 << PIN_POGA) == 0) {
  // poga ir nospiesta - darām kaut ko
}
```

 Ceru, ka saproti, kā strādā #define. Tie "1 <<" pārvērš 0, 1, 2, 3, 4, 5 par 1, 2, 4, 8, 16, 32, u.t.t.

----------


## Edzukins

Apskaties savus privātos ziņojumus, es tur ieliku savu skype niku, cerams ka tev ir skype? Es pamēģināšu vēl drusku ar šo shēmu, tad papētīšu URMASA kodu un tad uzdošu jautājumus, ok?

----------


## karloslv

> Taču vai esi uzstādījis DDRB = 0x2F pirms tam, jo tagad jau Tev ir sešas izvadkājas?
> 
> 
>  Neesmu gan , jo to lietu arī es īsti nesaprotu


 Aha, nu tas ir jāizurbj pašam. 0x2F binārā sistēmā ir 00111111, un tas pārslēdz 6 kājas uz izejas režīmu.

----------


## Edzukins

Liels tev paldies pagaidām, dod man mazu brītiņu lai šo sagremotu... tad es nāks jautājumi par urmasu  :: 
tagad ņemšu lodāmuru un likšu klāt pogu.

----------


## karloslv

Ui, tikai viena kļūda - tur, kur rakstīju 0x2F, jābūt 0x3F.

----------


## Edzukins

Panācu lai visas 6 lampinjas deg  ::

----------


## Velko

> 2) Programmas daļa - lai nolasītu pogas stāvokli, jāpārbauda PINC vērtība (vai PINB, PIND atkarībā no porta burta). Pašā programmas sākumā jāuzstāda attiecībās kājas režīms - PORTC uz nulli, bet DDRC uz vieninieku, tad tiks pieslēgts iebūvētais rezistors pret VCC.


 Inputs ar pullupu? Vai tad ne otrādi? Attiecīgais DDRC bits uz 0 (input), bet PORTCx - uz vieninieku (ieslēgt pull-up).

----------


## Edzukins

Man sāp jau galva - visu dienu pa googli rakos, es vairs neko nespēju uztvert... Ieshu labāk ārā paelpot svaigu gaisu. un tad izmēģināšu šito  ::

----------


## karloslv

> Inputs ar pullupu? Vai tad ne otrādi? Attiecīgais DDRC bits uz 0 (input), bet PORTCx - uz vieninieku (ieslēgt pull-up).


 Pareizi, pareizi Tu saki. Man jāiet jāatpūšas  ::

----------


## Edzukins

> PORTC ^= 0x12 būtu reizē jāpārslēdz 24. un 27. kāja (PC1 un PC4).


 Taču video redzams ka murgs sākas ar 24. un 25. kāju(PC1 un PC2)
Secinājums: saskaitīt nedrīkst  ::

----------


## Edzukins

> ```
> // šādi ērtības labad es definēju, ko man katra kāja nozīmē
> #define PIN_POGA PC1
> 
> // programmas sākumā uzstādām portu režīmus
> PORTC = 0;
> DDRC = (1 << PIN_POGA);
> 
> // kad gribam pārbaudīt, vai poga nospiesta
> ...


 
Tas noziimee ka tagad poga buus pie PC1 kaajas, ja?

Es varu vinju pielikt pie PD1 kaajas? 
kas tad kodaa mainiisies?

Tas varētu būt šāds?


```
// šādi ērtības labad es definēju, ko man katra kāja nozīmē
#define PIN_POGA PD1

// programmas sākumā uzstādām portu režīmus
PORTD = 1;
DDRD = (1 << PIN_POGA);

// kad gribam pārbaudīt, vai poga nospiesta
if (PIND & (1 << PIN_POGA) == 0) {
  // poga ir nospiesta - darām kaut ko
}
```

----------


## karloslv

Jā, tikai inicializācijas rindiņas (kā Velko pareizi norādīja) būs:



```
PORTD = (1 << PIN_POGA);
DDRD = 0;
```

 Un nospiešanas pārbaude būs uz 0, nevis 1, jo pogas nospiešana šajā gadījumā nozīmē loģisko 0 ieejā.

----------


## Edzukins

```
#include <avr/io.h>          // this contains all the IO port definitions
#include <util/delay.h>           // this contains all the IO port definitions

// šādi ērtības labad es definēju, ko man katra kāja nozīmē
#define PIN_POGA PD1
uint8_t k;
void wait_some_time()
{
 uint8_t i;
 for(i=0;i<5;i++) _delay_ms(100); 
}

int main()
{
k=1;
PORTD = (1 << PIN_POGA);
DDRD = 0;
DDRB = 0x3F;
PORTC = 0x00;  // all PORTC output pins Off
// programmas sākumā uzstādām portu režīmus

while(1)
{
// kad gribam pārbaudīt, vai poga nospiesta
if (PIND & (1 << PIN_POGA) == 0) k++;
if (k==1){
PORTC ^= 0x08;
wait_some_time();
PORTC ^= 0x04;
wait_some_time();
PORTC ^= 0x02;
wait_some_time();
PORTC ^= 0x01;
wait_some_time();
PORTC ^= 0x10;
wait_some_time();
PORTC ^= 0x20;
wait_some_time();
}
if (k==2){
PORTC ^= 0x02;
PORTC ^= 0x01;
wait_some_time();
PORTC ^= 0x08;
PORTC ^= 0x04;
wait_some_time();
PORTC ^= 0x10;
PORTC ^= 0x20;
wait_some_time();
}
if (k>2) k=1;
}
return 0;
}
```

 kur ir kļūda?
šādi man k visu laiku ir 1...

es pielodēju pogas vienu kāju pie GND otru pie PD1.

----------


## karloslv

Hm, man pagaidām izskatās, ka kods ir pareizs... Tikai ņem vērā, ka to, vai poga ir nospiesta, kods pārbauda tikai reizi pāris sekundēs. Ieejām nav atmiņas, un tas, ko nolasa no PIND ir momentānais stāvoklis.

----------


## Edzukins

es pogu tureeju visu laiku nospiestu, un nekas nemainiijaas.... nu pamēģināšu vēl...

----------


## Edzukins

itkaa viss pareizi salodeets, bet neiet... kkad veelaak pameeginaashu pie citaam kaajinjaam... varbuut kkas mainaas.

----------


## karloslv

Rindiņu ar k>2 pārbaudi gan labāk liec uzreiz aiz k++, citādi pie pārbaudes uz 1 vai 2 k patiesībā var būt arī 3.

----------


## Velko

Vēlviens moments ir tas, ka output pinus sakonfigurē DDRB, bet LEDus slēdzelē PORTC. Bet tam nevajadzētu ietekmēt pogas nolasīšanu.

----------


## Edzukins

> Rindiņu ar k>2 pārbaudi gan labāk liec uzreiz aiz k++, citādi pie pārbaudes uz 1 vai 2 k patiesībā var būt arī 3.


 Jā, pareizi. sākumā domāju likt tur if(k=2) bet nez kapeec uzliku if(k>2)  :: 
A nevar gadīties tā, ka kādu asvevišķu kājiņu esmu nodedzinājis? Vai tādā gadījumā nestrādātu visa mikrene?
Šī gandīz sanāk pirmā reize kad es vispār kko lodēju, tāpēc tas nebūtu pārsteigums ja tā būtu  ::

----------


## Velko

Vispār jau vaina ir kodā. Uz aci  tā uzreiz nevarēja pamanīt, nokompilēju ko līdzīgu. Šķiet, ka pārāk optimistiski esam skatījušies uz operāciju prioritāti  :: 

Nomaini pina pārbaudes rindiņu:


```
if ((PIND & (1 << PIN_POGA)) == 0) k++;
```

----------


## Edzukins

> Vispār jau vaina ir kodā. Uz aci  tā uzreiz nevarēja pamanīt, nokompilēju ko līdzīgu. Šķiet, ka pārāk optimistiski esam skatījušies uz operāciju prioritāti 
> 
> Nomaini pina pārbaudes rindiņu:
> 
> 
> ```
> if ((PIND & (1 << PIN_POGA)) == 0) k++;
> ```


 Jā,  ::  

Bet tagad k mainaas pats no savas gribas... gandrīz kā random princips. Es pogu neaistieku, bet k mainās no 1 uz 2 kad un kā vien ienāk prātā   ::  
EDIT: Nē, kļūdījos. k mainās pēc vienkārša principa, k=2;k=1;k=2;k=1;... nevis pēc random.

Uzlabots kods:


```
#include <avr/io.h>          // this contains all the IO port definitions
#include <util/delay.h>           // this contains all the IO port definitions

// šādi ērtības labad es definēju, ko man katra kāja nozīmē
#define PIN_POGA PD1
uint8_t k;
void wait_some_time()
{
 uint8_t i;
 for(i=0;i<5;i++) _delay_ms(100); 
}

int main()
{
k=1;
PORTD = (1 << PIN_POGA);
DDRD = 0;
DDRB = 0x3F;
PORTC = 0x00;  // all PORTC output pins Off
// programmas sākumā uzstādām portu režīmus

while(1)
{
// kad gribam pārbaudīt, vai poga nospiesta
if ((PIND & (1 << PIN_POGA)) == 0) k++;
if (k>2) k=1;
if (k==1){
PORTC ^= 0x08;
wait_some_time();
PORTC ^= 0x04;
wait_some_time();
PORTC ^= 0x02;
wait_some_time();
PORTC ^= 0x01;
wait_some_time();
PORTC ^= 0x10;
wait_some_time();
PORTC ^= 0x20;
wait_some_time();
}
if (k==2){
PORTC ^= 0x02;
PORTC ^= 0x01;
wait_some_time();
PORTC ^= 0x08;
PORTC ^= 0x04;
wait_some_time();
PORTC ^= 0x10;
PORTC ^= 0x20;
wait_some_time();
}

}
return 0;
}
```

 Šodien es padodos, mēģināšu rīt  ::

----------


## karloslv

Parasti haotiski brīnumi notiek, ja ieeja nav pietiekami pievilkta pie VCC vai GND - nāk iekšā trokšņi. Bet ar iebūvēto pullup rezistoru nav man bijušas problēmas. Varbūt Tev barošanas avots ir trokšņains? Katrā gadījumā pamēģini pievienot vēl 4k7 vai 10k rezistoru starp PD1 un VCC.

----------


## Edzukins

> Parasti haotiski brīnumi notiek, ja ieeja nav pietiekami pievilkta pie VCC vai GND - nāk iekšā trokšņi. Bet ar iebūvēto pullup rezistoru nav man bijušas problēmas. Varbūt Tev barošanas avots ir trokšņains? Katrā gadījumā pamēģini pievienot vēl 4k7 vai 10k rezistoru starp PD1 un VCC.


 Nu ar barošanu man ir tā kā ir, maigi sakot  :: 
3 x pustukšas pirkstinj baterijas kopā varbūt 4V sanāk, iespējams mazāk.
Rīt nopirkšu normālas, ja sanāks uz veikalu aiziet...
Bet nu trokšņu nav.

----------


## karloslv

Nu, tad gan ir atkarīgs. Ja Tev ir atmega8, tad tai barošana ir tikai līdz 4.5V, Atmega8L vai Atmega88 modelim jau pieļaujams daudz zemāk. Var jau būt, ka vairākas gaismasdiodes ieslēdzot reizē, shēma patērē pietiekami daudz strāvas, lai nosēdinātu spriegumu, un programma restartējas. 

Visērtāk ir ar 4 lādējamām baterijām, tām spriegums būs ļoti tuvu 5V. 4 gab. akaline baterijām gan būs kādi 6V.

----------


## Edzukins

Es atradu vēlvienu pustukšu bateriju un sabīdiju tās tā, ka tagad man ir 5,1V.
Sākumā, kad bija tikai 4 LED tās dega diezgan spoži, bet kā pieslēdzu vēl divas tā visas dega kā pusmirušas, neatkarīgi no tā cik ir ieslēgtas. Un tagad kad pieliku vēlvienu bateriju spožums nemainijās. Tam tač tā nevajadzēja būt, ne?

EDIT: Tikko pieliku 10k rezistoru, nekas nemainiijaas....

----------


## Raimonds1

Saliec regulējamu stabilizatoru ar voltmetru, lai izslēgtu barošanas avotu kā traucējumu rašanās cēloni.

----------


## Edzukins

Lai ko es arī darītu,...


```
(1 << PIN_POGA) == 0
```

 šī daļa vienmēr ir false, jeb (1 << PIN_POGA) == 1...  ::

----------


## Edzukins

Yipiiii!!! Man beidzot sanāca  :: 

Nevarēšu pateikt kas bija par vainu, bet es visu nolodeju nost un uzlodēju pa jaunam, un uzminiet kas notika?  ::  Viss strādā...
Liels paldies jums  :: 

Ir tikai viena probēma ar kuru es netieku galā, - lai cik baterijas es arī neliktu, visas LED deg kā pusmirušas. Nevar būt tā ka mikroshēmas iekšējā pretestība (ko programmatoriski pieslēdzu) kkādā veidā arī iespaido LED?

----------


## Velko

Arī tur ir vaina kodā  :: 

Atkārtošos: Tu output režīmu ieslēdz DDRB - tas ir "B" portam, tomēr tālāk darbojies ar "C" portu.

Nomaini DDRB ar DDRC un viss notiks.

----------


## Edzukins

> Arī tur ir vaina kodā 
> 
> Atkārtošos: Tu output režīmu ieslēdz DDRB - tas ir "B" portam, tomēr tālāk darbojies ar "C" portu.
> 
> Nomaini DDRB ar DDRC un viss notiks.


 Ej, tu nost... Jūs esat dievi!  ::  TNX A LOT!!!!!

Beidzot  :: 

Tagad iet viss  :: 
Izstudēšu šo piemēru, un centīšos visu saprast....
SUPER!!!  :: 

Galaprodukts

----------


## Edzukins

Sveikiņi atkal...

Es te mazliet vēlējos paspēlēties ar sensoriem (QRD1114) bet nemāku  :: 
Laikam esmu par stulbu lai saprastu  visu šito...

Domāju ka varēšu pēc līdzības principa uztaisīt sensors + LED kā poga + LED, bet man nesanāk...

Uzklabināju šādu shēmu:


Tā lampiņa kas ir pie sensora deg (kad pieliek baltu papīru) bet es vēlējos lai iedegas arī otra lampiņa.

Lūk kods (Vismaz man likās ka tas tā varētu izskatīties..)


```
#include <avr/io.h> 

#define PIN_SENS PC0

int main()
{
PORTC = (1 << PIN_SENS);
DDRD = 0x3F;
PORTD = 0x00; 

while(1) { if ((PINC & (1 << PIN_SENS)) == 0) PORTD ^= 0x04; }
return 0;
}
```

 Es īsti neizprotu to kā nodefinēt kura kājiņa būs IN un kura OUT, droši vien tāpēc arī nestrādā.
laikam esmu sapratis to galīgi savādāk..

----------


## karloslv

Nu, pirmkārt nezinu, kāpēc esi pieķēries operatoram XOR (^). Ja gribi ieslēgt vienu bitu, lieto PORTD |= 0x04, ja gribi izslēgt, lieto PORTD &= ~0x04. Šobrīd tava programma ar milzīgu ātrumu pārslēgtu izeju, kad PC0 būtu nulle.

Otrkārt, no shēmas viedokļa tu rīkojies galīgi dīvaini - kādēļ ieslēdz iebūvēto Pull-up rezistoru, ja tev shēmā ieejai jau ir pilna piesaiste gan VCC, gan GND? Otrkārt, nav skaidrs, kā Tu iedomājies, ka shēma strādā. It kā esi ieeju pieslēdzis pie PC0, kurš kalpo arī kā analogā ieeja ADC0, taču izmanto tu to kā loģisko ieeju. Tajā nulle būs tikai tad, kad spriegums nokritīs zem aptuveni 1,5V. Šobrīd kamēr atstarotās gaismas nav, ieejā ir ~5V, bet kad ir - zemāks, taču cik zemāk, dievs vien zina.

----------


## Edzukins

> Nu, pirmkārt nezinu, kāpēc esi pieķēries operatoram XOR (^). Ja gribi ieslēgt vienu bitu, lieto PORTD |= 0x04, ja gribi izslēgt, lieto PORTD &= ~0x04. Šobrīd tava programma ar milzīgu ātrumu pārslēgtu izeju, kad PC0 būtu nulle.


 Atbilde visai vnk - tas bija vienīgais ko mācēju (sapratu), pateicoties tev, tagad tā vairs nedarīšu  :: 




> Otrkārt, no shēmas viedokļa tu rīkojies galīgi dīvaini - kādēļ ieslēdz iebūvēto Pull-up rezistoru, ja tev shēmā ieejai jau ir pilna piesaiste gan VCC, gan GND?


 Atbilde : 


> Es īsti neizprotu to kā nodefinēt kura kājiņa būs IN un kura OUT, droši vien tāpēc arī nestrādā.
> laikam esmu sapratis to galīgi savādāk..


  - mazliet sajaucu, jo biju iedomaajies ka, ... nolādēts pat neatceros kā biju to iedomājies. 




> Treškārt, nav skaidrs, kā Tu iedomājies, ka shēma strādā. It kā esi ieeju pieslēdzis pie PC0, kurš kalpo arī kā analogā ieeja ADC0, taču izmanto tu to kā loģisko ieeju.


 Es biju iedomājies ka notiek tā - ja snensors uztver atstaroto gaismu tad automātiski pie PC0 parādās spriegums ( nu tā pat kā pogai - ir / nav ) un tāpēc biju iedomājies ka varēšu uzprogrammēt tieši ar to pašu kodu... un līdzko PC0 parādās spriegums, vēlējos lai iek ieslēgta LED kas ir pie PD2.

Es kko tādu daru pirmo reizi, tāpat arī lodāmuru nebiju turējis rokās kādus gadus X, īsi sakot - es nezinu kā noprogrammēt pareizi. 
Katru reizi kad rokos pa AVRfreeks man rodas sajūta ka man jāsāk mācīties kkur citur, kad atveru datasheet nekā tur nesaprotu, tapēc ar to arī nevaru sākt...
Nezinu kur lai visu šo iemācos... Līdz sāku interesēties par elektroniku es domāju ka protu programmēt... nu vairs tā nedomāju.... Tāpēc uzbāžos jums ar tizliem piemēriem un jautājumiem (ceru ka nekrītu uz nerviem  ::  )




> Šobrīd kamēr atstarotās gaismas nav, ieejā ir ~5V


 Gadījumā nav otrādi? Jo ja ir atstarotā gaisma, tad man iedegās LED pie sensora (tas nozīmē ka tur ir spriegums, ne?)

----------


## Velko

Ar IN un OUT viss ir vienkārši. Ja attiecīgā DDR attiecīgais bits ir 1, tad OUT. Ja šis bits ir 0, tad IN.

Par to spriegumu - sanāk tā, kā karloslv teica. Kad sensors ir "vaļā", tad uz LEDa abiem galiem ir 5V potenciāls (starpība - 0), tāpēc nedeg. kad sensoru noslēdz - tad gals, kurš pie sensora "tuvojas" GND un līdz ar to parādās spriegums uz LEDa.

Pamēģini pieslēgt sensoru tāpat kā darīji ar pogu (atvieno to LEDu), protams ieslēdz pull-up.

----------


## Edzukins

> Ar IN un OUT viss ir vienkārši. Ja attiecīgā DDR attiecīgais bits ir 1, tad OUT. Ja šis bits ir 0, tad IN.


 tātad ja es gribētu uzlikt 6 x Porta "C" kājas kā OUT es lieku  *DDRC = 0x3F;* bet ja es lieku *DDRC = 0x00;* tad visas kājiņas kā IN, bet kas notiek piemēram ar PC6 (Reset)? Tad jau sanāk ka tur ar ieliek 0 ne? Bet to taču nedrīkst aiztikt, vai kā?




> Pamēģini pieslēgt sensoru tāpat kā darīji ar pogu (atvieno to LEDu), protams ieslēdz pull-up..


 Tas tad būtu šādi ja?
PORTC = (1 << PIN_SENS);

Un kopējais kods varētu izskatīties šādi?


```
#include <avr/io.h> 

#define PIN_SENS PC0

int main()
{
PORTD = (1 << PIN_SENS);
DDRD = 0x04;
DDRC = 0x00;

while(1)
{
	if ((PINC & (1 << PIN_SENS)) == 0) 
         {
                PORTD |= 0x04;
	 }else{
                PORTD &= ~0x04;
	 }
}
return 0;
}
```

 šodien ir jau par vēlu lai es šito izmēģinātu, cerams ka rīt izmēģināšu.

----------


## Velko

Par RESET nesatraucies. Ja tas pins ir kā reset, tad tajos bitos var rakstīt kā patīk - jamais vienkārši neņems vērā.

Par kodu - redzu, ka vēl joprojām putrojies ar portiem. Tātad: Atmega8 ir 3 porti - B, C un D.

Par B portu atbild PORTB, DDRB un PINB reģistri
Par C portu - PORTC, DDRC un PINC
Par D portu - domājams, ka jau nojaut pats...

Katram no šiem reģistriem ir 8 biti, kurus apzīmē:
Portam B: PB0, PB1, PB2 ... PB7
Portam C:  PC0, PC1, PC2 ... PC7

Faktiski zem tiem slēpjas cipariņi 0, 1, 2 .. 7, tomēr lai saglabātu stilu parasti izmanto šos apzīmējumus.

Un lūk kods:


```
#include <avr/io.h>

#define PIN_SENS PC0
#define PIN_OUT PD2

int main()
{
    /* vispirms uzliekam visu portu kā input, un ieslēdzam attiecīgo pull-up */
    DDRC = 0x00;
    PORTC = (1 << PIN_SENS);

    /* uzliekam, kurš pins būs output, un lai nedeg sākumā  */
    PORTD = 0;
    DDRD = (1 << PIN_OUT);
    
    while(1) {
        if ((PINC & (1 << PIN_SENS)) == 0) {
                PORTD |= (1 << PIN_OUT);
        }else{
                PORTD &= ~(1 << PIN_OUT);
        }
    }
    return 0;
}
```

----------


## karloslv

Ja programmā neko nedari ar DDRx un PORTx reģistriem, tajos pēc reset būs nulles - visas kājas sākumā jau ir nodefinētas kā IN bez pull-up rezistoriem. Tas ir sākotnējais stāvoklis. Kad izpildās rindiņa DDRD = 0x3F, 6 porta D kājas kļūst par OUT kājām un viss, pārējais nemainās. 

Šis gaismas sensors strādā tā - kad ir gaisma, tajā plūst strāva. Ja kolektoru pieslēdz caur pretestību pie +5V, tad ar spriegumu viss ir otrādi - kamēr fototranzistors ciet, uz kolektora ir +5V, kad vaļā - mazāk.

Manuprāt tev ir pārslogots tas fototranzistors. Es liktu 4k7 vai 10k rezistoru un izslēgtu iebūvēto pull-up. No otras puses, var kā velko teica - nelikt nekādu rezistoru, pa taisno uz kāju un atļaut iebūvēto pull-up (tas arī varētu būt aptuveni 5-10k rezistors).

----------


## Edzukins

> Par kodu - redzu, ka vēl joprojām putrojies ar portiem. Tātad: Atmega8 ir 3 porti - B, C un D.
> 
> Par B portu atbild PORTB, DDRB un PINB reģistri
> Par C portu - PORTC, DDRC un PINC
> Par D portu - domājams, ka jau nojaut pats...
> 
> Katram no šiem reģistriem ir 8 biti, kurus apzīmē:
> Portam B: PB0, PB1, PB2 ... PB7
> Portam C:  PC0, PC1, PC2 ... PC7
> ...


 Sry, šī bija viena no retajām lietām ko sapratu, vnk ne no tā faila iekopēju šeit..

Tātad pēc Karloslv teiktā es DDRC = 0x00; varu nerakstīt jo tas jau pēc noklusējuma ie 0, ja?

Būtībā ir redzams ka es nesaprotu kad ir jālieto PORTX, DDRX un kad PINX, īsti nesaprotu ko katrs dara..
Pagaidām cik noprotu DDRX Lieto lai saliktu IN vai OUT, PORTX lieto lai piesleegtu pull-up un PINX lieto lai nolasītu PIN stāvokli. Tā ir?




> Manuprāt tev ir pārslogots tas fototranzistors. Es liktu 4k7 vai 10k rezistoru un izslēgtu iebūvēto pull-up.


 Orģināli tur kur man ir LED un 100 omi buutu jaabuut vnk 10k. (Vismaz tur kur viņi tika pirkti nāca līdz tāda shēma)
Tā arī es biju izmēģinājis pašā sākumā, tikai ar nepareizu kodu, LED pieliku lai pārbaudītu vai sensors vispār strādā.

P.S. Velko kods aizgāja, TNX!

----------


## karloslv

Par to, kas notiek attiecīgajās PORTx un DDRx kombinācijās, lasi datašītā. Principā ir tā:

PORT 0, DDR 0 -> kāja karājas 'gaisā', tā kalpo par ieeju, stāvokli var nolasīt no PINx
PORT 1, DDR 0 -> kāja ir pievilkta pie VCC ar iebūvēto pull-up, kalpo par ieeju, var nolasīt stāvokli no PINx
PORT 0, DDR 1 -> kāja ir izejas kāja, izejā ir 0
PORT 1, DDR 1 -> kāja ir izejas kāja, izejā ir 1

Principā ieeja/izeja ir tikai nosacīti. Jebkurā brīdī drīkst lasīt PINx, un tas parādīs, kas uz kājas stāv, pat, ja tā ir izejas kāja. Tāpat arī PORT=1, DDR = 0 principā ir arī izeja, jo pieliekot gaismasdiodi pret zemi, tā degs.

----------


## Edzukins

Paldies, tagad mēģināšu shēmai pievienot motoru un kkādā veidā to kontrolēt.

Varbūt varat jau tagad dot kādu vērtīgu padomu kamēr mēģinu pielikt?  :: 

Jā un vēl - ko jūs domājat par to ka sensors jau strādā pie gadrīz 3 cm attāluma? Nevajadzēja būt pāris mm? nevarētu būt tā ka iebūvētā pretestība ir par mazu?

----------


## karloslv

Vispār jau jo lielāka pretestība tam fototranzistoram kolektorā, jo kolektora spriegums ir jūtīgāks pret gaismas (strāvas) izmaiņām. Manuprāt normāli, ka strādā tik tālu.

Motoru kontrolēt sākumā iesaku vienkārši caur kādu npn tranzistoru TO-220 korpusā (tāds būs pietiekami jaudīgs). Motoru tad slēdz kolektora ķēdē. Motoram paralēli pieslēdz diodi pretslēgumā. Uz tranzistora bāzi padod vadības signālu caur 10k pretestību.

Alternatīvi var arī ņemt kādu no "logic level" mosfet, piemēram, IRLxxx sērijas. Tam gan uz aizvaru daudz mazāka pretestība nepieciešama, kādi pārdesmit omi.

Nezinu, vai esi pazīstams ar PWM (impulsu platuma modulāciju) motoru ātruma vadīšanai? Šobrīd uz tranzistoru padodot "1", palaidīsi motoru pilnā gaitā, padodot "0" motors stāsies. Ar PWM var uzstādīt jebkādu režīmu (sauksim to nosacīti par ātrumu) starp šīm galējībām.

----------


## Edzukins

Jau pirms kāda laiciņa nopirku 2 x BD139 un 2 x BD140 tranzistorus man itkaa teica ka tos otros vajag motoram ( Itkā esmu lasīji ko tranzistorzs dara, un kā kas viņā tur notiek, bet venalga īsti nesaprotu, kam viņs konkrētajā gadījumā vajadzīgs, bet pašlaik varbūt labāk tajā neiedziļināties, jo laika vairs nav daudz. )




> Nezinu, vai esi pazīstams ar PWM (impulsu platuma modulāciju) motoru ātruma vadīšanai?


 Jā, ideju es saprotu, bet kā to noprogrammēt vēl jāpadomā  :: 

tūlīt uzzīmēšu shēmu un ielikšu šeit ( nu tūlīt tas protams nebūs  :: , kamēr pieleks  ::  )

----------


## dmd

nnesmu speciālists, bet kā pirmais tuvinājums nāk prātā aptuveni tāda doma:
uztaisi ciklu teiksim uz 10 atkārtojumiem.
X atkārtojumos uz izeju dod 1 pārējos: 0
to visu loopo bezgalīgajā cilpā

----------


## Edzukins

> nnesmu speciālists, bet kā pirmais tuvinājums nāk prātā aptuveni tāda doma:
> uztaisi ciklu teiksim uz 10 atkārtojumiem.
> X atkārtojumos uz izeju dod 1 pārējos: 0
> to visu loopo bezgalīgajā cilpā


 Jā, ja viss būtu tik vnk.....
Redzi, motora vadiiba ir cikls, un sensoru nolasiishana arii ir cikls ( turklaat divi dažādi) īsti nezinu kā viņus apvienot...


Ak jā, lūk arī solītā shēma:

----------


## Velko

> Jā, ja viss būtu tik vnk.....
> Redzi, motora vadiiba ir cikls, un sensoru nolasiishana arii ir cikls ( turklaat divi dažādi) īsti nezinu kā viņus apvienot...


 Man tāda sajūta, ka jamos var mierīgi apvienot. Katrā cikla izpildē no sākuma nolasi sensoru, pēc tam skaties vai jāieslēdz/jāizslēdz outputs (vai otrādi). Pāris papildus mainīgie, varbūt kāds _if_s un vajadzētu sanākt.

Protams, parokoties dziļāk var uztaisīt, ka ne sensora nolasīšanai, ne arī PWM ģenerēšanai nav vajadzīgs cikls. ATmegai iekšā ir "dzelži", kas to var darīt paši - tikai jāieslēdz  ::  Vienīgais - no sākuma tas var šķist šausmīgi sarežģīti.

Iesaku pārslēgt sensoru uz INT0 pinu (PD2) un sensora izmaiņu detektēšanai izmantot _pārtraukumu_. Kas tas par zvēru? Īsumā - ja notiek kāds "dzelzisks" notikums, tad galvenās programmas izpilde tiek pārtraukta un procesors pāriet pie pārtraukuma vektora apstrādes. Kad no tā atgriežas, tad galvenā programma tiek turpināta tālāk no tās vietas, kur tika pārtraukta.

Sensora nolasīšanai var izmantot INT0 pārtraukumu, kurš nostrādās, ja notiks kādas izmaiņas uz PD2 (INT0) pina. Piemērs:


```
/* konfigurējam pārtraukumu. Šis ir kautkur
   galvenajā programmā, pirms sākam cikloties */
PORTD |= (1 << PD2); // pull-up pinam

/* pārtraukumu izsauksim uz falling edge - brīdī, kad inputs "nokrīt" uz 0 */
MCUCR |= (1 << ISC01); 

/* pasakam, ka gribam izmantot INT0 pārtraukumu */
GICR |= (1 << INT0); 

/* pasakam, ka vispār gribam izmantot pārtraukumus */
sei(); 



/* lūk arī pats INT0 pārtraukuma vektors. Šis kodā atrodas ārpus main() vai citām f-jām */
ISR(INT0_vect) 
{
// daram kautko, ja pins "nokrīt" uz 0
}
```

 Par dzelzisko PWM citā reizē - tāpat jau ir pietiekoši daudz informācijas ko "gremot".  Man arī nav uzreiz pie rokas gatava piemēra.

----------


## karloslv

Par to, kā strādā tranzistors, šobrīd nemaz nav tik svarīgi detaļās zināt, daudz svarīgāk ir atšķirt strāvu no sprieguma  ::  Pavisam tuvināti tranzistors tāds slēdzis vien ir. Kad caur bāzi plūdīs neliela strāva, tranzistors atvērsies un starp kolektoru un emiteru arī plūdīs strāva, kas var jau būt daudz lielāka. 

Par PWM - protams, ka daudz prātīgāk būtu to darīt uz AVR iebūvētajiem dzelžiem, jo tad procesoram nav ar to jākrāmējas, jātērē laiks un galvenais arī nav jāprogrammē. Bet tas varbūt tiešām vēlākai reizei. Ja esi pietiekami attapīgs programmētājs, arī "softiskā" līmenī var uzrakstīt un uzturēt PWM. Tas gan būs tāds nedaudz gļukains un neprecīzs. 

Tātad, es darītu līdzīgi kā AVR jau dara dzelžos - ieviestu cikliskus skaitītājus un sliekšņa vērtības. 



```
uint8_t skaititajs = 0;
uint8_t slieksnis = 16; // piemeeram, ja veertiiba ir 16, izejaa 16/256 dalju no laika buus "1", paareejo laiku "0"

uint16_t skaititajs2 = 0;

// muuzhiigais cikls
while (1) {
  if (++skaititajs2 == 1000) {
    skaititajs2 = 0;
    // te daraam kaut ko veertiigu, piemeeram, lasaam sensorus 
    // uzstaadaam skaititajs veertiibu atbilstoshi tam, cik aatri vajag motoriem griezties
    // shii vieta izpildaas daudz retaak nekaa pamatcikls, bet taa arii vajag
  }

  // te kontroleejam motorus
  if (skaititajs == 0) PORTB |= 0x01;
  if (skaititajs == slieksnis) PORTB &= ~0x01;
  skaititajs++; // izmantojam to, ka skaitiitajs pats paarleks no 255 uz 0
}
```

----------


## Edzukins

Nu taa..... Iedevāt man petiekami ko gremot  :: 




> Protams, parokoties dziļāk var uztaisīt, ka ne sensora nolasīšanai, ne arī PWM ģenerēšanai nav vajadzīgs cikls. ATmegai iekšā ir "dzelži", kas to var darīt paši - tikai jāieslēdz  Vienīgais - no sākuma tas var šķist šausmīgi sarežģīti.
> ..
> Par dzelzisko PWM citā reizē - tāpat jau ir pietiekoši daudz informācijas ko "gremot".  Man arī nav uzreiz pie rokas gatava piemēra.


 Uz nākamā gada sacensībām  :: 




> Iesaku pārslēgt sensoru uz INT0 pinu (PD2) un sensora izmaiņu detektēšanai izmantot _pārtraukumu_.


 Atmega8 ir tikai 2 * INTX pini, bet es biju plānojis ar 5 vai 6 sensoriem (man ir 6, bet viens laikam nestraadaa)
citiem piniem jau to nevar dariit ne?




> Par to, kā strādā tranzistors,..


 Apskatotes veelreiz uz sheemu man laikam drusku pieleca, bet tas tieshaam tagad nav svariigi...


Aizieshu uz RTU karjeras dienām, savākšos pildspalvas, un kad atnākšu atpakaļ sākšu ieciklētes ciklos  ::

----------


## Edzukins

Man paliek drusku neērti to teikt, bet man atkal kkas neiet  :: 

Es mēģināju uztaisīt to šādi - ja sensors uztver atstaroto gaismu, tad, kamēr uztver, tikmeer palielina ātrumu (no 0 līdz slieksnim (200) ), ja vairs neuztver tad apstaajas.




```
    #include <avr/io.h>

    #define PIN_SENS PC0
    #define PIN_LED PD2
    #define PIN_MOT PB1

    uint8_t skaititajs = 0;
    uint8_t slieksnis = 200; // piemeeram, ja veertiiba ir 16, izejaa 16/256 dalju no laika buus "1", paareejo laiku "0"
	uint8_t atrums = 0;

    uint16_t skaititajs2 = 0;

    int main()
    {
        /* vispirms uzliekam visu portu kā input, un ieslēdzam attiecīgo pull-up */
        DDRC = 0x00;
        PORTC = (1 << PIN_SENS);

 

        /* uzliekam, kurš pins būs output, un lai nedeg sākumā  */
        PORTD = 0;
        DDRD = (1 << PIN_LED);
		PORTB = 0;
		DDRB =  (1 << PIN_MOT);;
       

    // muuzhiigais cikls
    while (1) {
      if (++skaititajs2 == 1000) {
        skaititajs2 = 0;
        // te daraam kaut ko veertiigu, piemeeram, lasaam sensorus
        // uzstaadaam skaititajs veertiibu atbilstoshi tam, cik aatri vajag motoriem griezties
        // shii vieta izpildaas daudz retaak nekaa pamatcikls, bet taa arii vajag
		if ((PINC & (1 << PIN_SENS)) == 0) {
                    PORTD |= (1 << PIN_LED);
					if (atrums < slieksnis) atrums++;
            }else{
                    PORTD &= ~(1 << PIN_LED);
					atrums = 0;
            }
      }

      // te kontroleejam motorus
      if (atrums) PORTB |= 0x01;
      if (skaititajs == atrums) PORTB &= ~0x01;
      skaititajs++; // izmantojam to, ka skaitiitajs pats paarleks no 255 uz 0
    }
	}
```

----------


## karloslv

Jā, tikai PIN_MOT būtu jābūt PB0, jo kodā tālāk esmu rakstījis 0x01  ::  Labāk tā 0x01 vietā liec (1 << PIN_MOT) un tad būs korekti jebkurai PB kājai.

Tāpat arī rindiņa if (atrums) ... ir nepareiza, būtu jābūt if (skaititajs == 0)

----------


## Edzukins

> Jā, tikai PIN_MOT būtu jābūt PB0, jo kodā tālāk esmu rakstījis 0x01  Labāk tā 0x01 vietā liec (1 << PIN_MOT) un tad būs korekti jebkurai PB kājai.
> 
> Tāpat arī rindiņa if (atrums) ... ir nepareiza, būtu jābūt if (skaititajs == 0)


 Ak vai  ::  tā ir ka nodarbojas ar pilnīgu plaģiātismu  :: 

Njaa bet vienalga... motors nereaģē ... Paspēlēšos vēl..

----------


## Edzukins

pieliku motora un tranzistora vietaa LED, un tas protams straadaaja.

Varbūt es vnk esmu sajaucis kaadaa seciibaa jaaliek?
vinjam tajaa pusee, kur uzraksts ir 3 punkti un datasheetaa ar bija kkas liidziigs, tapeec padomaaju ka taa priekshpuse, moshka es kljuudiijos?

Lūk datasheets http://pdf1.alldatasheet.com/datashe...IPS/BD140.html

trancistoram otraa pusee ir iegraveets aplītis ar "5" centrā, moška tā ir priekšpuse?

----------


## karloslv

Ui, nav ne specenes, ne bildes. Cik noprotu, Tev tur ir BD139 (NPN), tātad pēc specenes kājas no kreisās puses: emiters, kolektors, bāze. Jāskatās no plastmasas puses (otrā parasti ir ar metāla plāksnīti, lai siltumu novadītu). Varbūt ka šim tranzistoram nav metāliskās plāksnes, bet nu kaut kādiem uzrakstiem jābūt. Ja ne, pamēri ar testeri diodes testa režīmā, kur plūst strāva (no bāzes uz kolektoru, no bāzes uz emiteru). Vēl ir variants izmēģināt gan tā, gan tā  ::

----------


## Edzukins

Man ir BD139, bet es liku BD140 ( vinjam arii ir taa pati seciiba - emiters, kolektors, bāze), un abas puses ir melnas, vienaa ir uzraksts un 3 apliish, otraa tikai 1 apliits stuuriitii

sorry web camera paaraak shvaka, nevaru nofotjeet taa lai kko redz.

----------


## marizo

tie ir pretējas struktūras! (npn-pnp)

----------


## Edzukins

> tie ir pretējas struktūras! (npn-pnp)


 Kā jau teicu - pat īsti nesaprotu kas notiek tranzistorā, tāpēc tāds jautājums: 

BD140 tad man neder? Likt BD139 vai kā?   ::

----------


## marizo

nu teiksim tā - tie tranzistori tiek vadīti un pieslēgti pavisam savādāk. Tie nav savstarpēji aizvietojami (npn un pnp) bez shēmas izmaiņām.
Tajā shēmā šeit forumā ir uzzīpēts pareizais tranzistors, tādu Tev arī vajadzēs likt.
Tranzistora tips, apzīmējums shēmā un citi parametri ir norādīti datu lapā, kas parasti ir pdf dokuments. Visvienkāršākais veids, kā atrast datus par kādu detaļu, ir meklēt google.lv, norādot bd140 datasheet. Vēl var meklēt iekš alldatasheet.com.

----------


## Edzukins

> nu teiksim tā - tie tranzistori tiek vadīti un pieslēgti pavisam savādāk. Tie nav savstarpēji aizvietojami (npn un pnp) bez shēmas izmaiņām.
> Tajā shēmā šeit forumā ir uzzīpēts pareizais tranzistors, tādu Tev arī vajadzēs likt.
> Tranzistora tips, apzīmējums shēmā un citi parametri ir norādīti datu lapā, kas parasti ir pdf dokuments. Visvienkāršākais veids, kā atrast datus par kādu detaļu, ir meklēt google.lv, norādot bd140 datasheet. Vēl var meklēt iekš alldatasheet.com.


 
Kā jau minēju iepriekš, es pielodēju pēc datasheet http://pdf1.alldatasheet.com/datashe...IPS/BD140.html

bet motors vispaar nereagjee, tapeec domaaju vaai neesmu sajaucis aizmuguri ar priekshu, bet pagaidaam izskataas ka neesmu... da velns vinj zin...

Varbuut diodi esmu uzlicis otraadaak, bet tas tachu netrauceetu motoram griezsties, ne?

----------


## marizo

Gan bd140 likšana shēmā bd139 vietā, gan diodes ielodēšana otrā virzienā būs par iemeslu tam, ka shēma nedarbosies!

----------


## Edzukins

izmēģināju visus iespējamos variantus...  ::

----------


## karloslv

Nē, kādi tur varianti, der tikai BD139. Kolektora ķēdē motors uz VCC. Sākumā to diodi var vispār nelodēt. Emiters pie GND. Bāze caur 10k rezistoru pie mikrokontroliera.

Iesaku iemācīties pārbaudīt lietas modulāri - uzlodē šādu tranzistora slēgumu un vēl nepieslēdzot pie mikrokontroliera, pamēģini, kas notiek, ja uz bāzi caur rezistoru padod +5V. Tā vismaz zināsi, kurā daļā ir problēma. Protams, motors pats par sevi arī jāpārbauda pie +5V.

----------


## Edzukins

> Nē, kādi tur varianti, der tikai BD139. Kolektora ķēdē motors uz VCC. Sākumā to diodi var vispār nelodēt. Emiters pie GND. Bāze caur 10k rezistoru pie mikrokontroliera.
> 
> Iesaku iemācīties pārbaudīt lietas modulāri - uzlodē šādu tranzistora slēgumu un vēl nepieslēdzot pie mikrokontroliera, pamēģini, kas notiek, ja uz bāzi caur rezistoru padod +5V. Tā vismaz zināsi, kurā daļā ir problēma. Protams, motors pats par sevi arī jāpārbauda pie +5V.


 Nu bļāviens... es sapratu ka vajag BD140  ::  Tūlīt pārlodēšu.

Jā un es jau pārbaudīju visu atsevišķi un nonācu pie slēdziena ka Tranis nestrādā kā vajag, tāpēc arī domāju ka nepareizi salodeejis, a izraadaas vispaar ne to trani panjeemis  ::

----------


## Edzukins

ak shausmas... arii ar to nekas nesanaak, arii bez diodes

----------


## Edzukins

Es mazliet novenkāršoju piemēru 



```
    #include <avr/io.h>

    #define PIN_SENS PC0
    #define PIN_LED PD2
    #define PIN_MOT PB1

    int main()
    {
        /* vispirms uzliekam visu portu kā input, un ieslēdzam attiecīgo pull-up */
        DDRC = 0x00;
        PORTC = (1 << PIN_SENS);

 

        /* uzliekam, kurš pins būs output, un lai nedeg sākumā  */
        PORTD = 0;
        DDRD = (1 << PIN_LED);
		PORTB = 0;
		DDRB =  (1 << PIN_MOT);;
       

    // muuzhiigais cikls
    while (1) {

		if ((PINC & (1 << PIN_SENS)) == 0) {
                    PORTD |= (1 << PIN_LED);
					PORTB |= (1 << PIN_MOT);
            }else{
                    PORTD &= ~(1 << PIN_LED);
					PORTB &= ~(1 << PIN_MOT);
            }
      }

	}
```

 Visu laiku motoram es liku atseviahtju baroshanu - 9V, un tad nekas nestraadaaja.
Bet kaa es pievienoju motoru pie taas pashas baroshanas kaada ir MK viss saaka straadaat, bet kapeec?...

EDIT, nu vairs arii tas nestraadaa... murgs kkaads

----------


## marizo

atsevišķu barošanu pie kā? Vajag uC (mikrokontrolleram) vienu, bet motoram otru -bet zemes savienot kopā. Savādāk Tev nevadīsies tranzistors.

----------


## Edzukins

> atsevišķu barošanu pie kā? Vajag uC (mikrokontrolleram) vienu, bet motoram otru -bet zemes savienot kopā. Savādāk Tev nevadīsies tranzistors.


 Tad lūk kur tas suns aprakts  ::  - zemes vajadzēja savienot kopā....

*IDEĀLI, VISS STRĀDĀ!!!!!!! PALDIES!!!!!!!*

----------


## karloslv

Ja zemes nesavieno kopā, padomā pats, kā gan tranzistora bāzē strāva varētu plūst? Pa vienu pašu vadu turp?

----------


## Edzukins

> Ja zemes nesavieno kopā, padomā pats, kā gan tranzistora bāzē strāva varētu plūst? Pa vienu pašu vadu turp?


 Jā atdzīšos, tas man likās dīvaini, bet nu es sevi mierināju ar domu ka es tač nekā nesaprotu no tā, un gan jau ka tur kāds prikols ir  :: 


Šeit var arī noskatītes video.

P.S. Nezināju, ka ar web kameru var nofilmēt infrasarkanos starus  :: 
Šajā video tie ir redzami.

----------


## Edzukins

Ja kādam, tik pat lielam neprašam kā es, rodas jautājums par to kāpēc sākuma shēmā man bija bija standarts 6 pini - VCC, GND, SCK, MISO, MOSI bet tālākās shēmās parādās vēl LED, tad tas ir tāpēc ka ja lieto 6 Pinus pārprogramēšanai, tad shēmā vēl jāpielodē quartz, bet es dzīvoju Valkā un tuvāko 100Km rādiusā neko vairāk par rezistoriem nopirkt nevar, ja nu vienīgi privāti no kāda. (Būtu pateicīgs ja kāds varētu mani izlabot, jo es Visu Valmieru izbraukāju un tur visi mani pasūtīja 3 mājas tālāk -> uz Argus  ::  ) Tad nu es nejauš uzzināju ka Atmeliem ir iekšējais oscilators, kuru var izmantot ja pievieno LED izvadu.

Bet nu robotiņam man jau tā kā vajadzēs to quartz cik es sapratu kopā ar 22pF katraa pusee, bet es argusaa ieraudziiju šos http://www.argus.lv/product_info.php...e0fc1e9338593d un tos arī nopirku. Viņiem katrā pusē ir 30pF, ceru ka tas netraucēs?
Un mans otrs jautājums ir kā viņu pielodēt? jo viņam ir 3 kājas? 
Malējās divas uz mikreni un vidējā uz GND?

----------


## karloslv

Pa, pa, iekšējais oscilators strādā, neko nepievienojot pie XTAL1/XTAL2 kājām - paskaties specenē. Tas pat sākumā no rūpnīcas nākušā čipā tieši ir uzstādīts - "The device is shipped with CKSEL = “0001” and SUT = “10” (1 MHz Internal RC Oscillator, slowly rising power)." 

Arī URMAS izmantoja Atmega88 iebūvēto 8 MHz oscilatoru, jo līnijsekošanai nav nepieciešama milzīga laika precizitāte.

Tas, ko nopirki, ir keramiskais rezonators. Darbība līdzīga kvarcam, taču slēdz nedaudz atšķirīgi. Arī par to ir Atmega8 specenē (27. lpp). Principā jā - malējās kājas uzreiz uz XTAL1/XTAL2, vidus uz zemi. Tikai atkal neaizmirsti visas zemes savienot  :: 

Par detaļām - ja visādi sīkumi ir nepieciešami, varu savākt kādu "starterpaku" un nosūtīt pa pastu. Par to sarakstāmies privātajā.

----------


## Edzukins

> Pa, pa, iekšējais oscilators strādā, neko nepievienojot pie XTAL1/XTAL2 kājām - paskaties specenē. Tas pat sākumā no rūpnīcas nākušā čipā tieši ir uzstādīts - "The device is shipped with CKSEL = “0001” and SUT = “10” (1 MHz Internal RC Oscillator, slowly rising power)."


 Hmm, a kur tad es to atradu.... tātad būtībā es varēju iztikt ar 6 Pinu štekeri?  :: 
Tagad jāskrien uz lekciju, vēlāk papētīšu..

----------


## Edzukins

http://img81.imageshack.us/img81/207/zhurkafr4.jpg
Tātad šī ir shēma.

Man ir divas baroshanas ( katra ap 5V) un divi motorinji

Ieprogrammeeju visu shaadi:


```
    #include <avr/io.h>
	#include <util/delay.h> 

    #define PIN_MOT1 PB1
    #define PIN_MOT2 PB2

uint8_t skaititajs = 0;

void wait_some_time()
{
 uint8_t i;
 for(i=0;i<20;i++) _delay_ms(100); 
}
    int main()
    {
        /* uzliekam, kurš pins būs output, un lai nedeg sākumā  */
		PORTB = 0;
		DDRB =  (1 << PIN_MOT1)| (1 << PIN_MOT2);


    // muuzhiigais cikls
    while (1) {
      // te kontroleejam motorus
PORTB |= (1 << PIN_MOT1);
PORTB &= ~(1 << PIN_MOT2);
wait_some_time();
PORTB |= (1 << PIN_MOT2);
PORTB &= ~(1 << PIN_MOT1);
wait_some_time();
    }
	}
```

 Tātad ik pēc 2 vām sekundēm vnk samainās motoriņi vietām (izslēgts/ieslēgts).

Kad nepievienoju motorus, bet nomeeru tikai ar testeri man padod aaraa visu straavu (0.1V zudumi)
kad pielieku motoru klaat tur ir tikai 0.4V (zudumos gandriiz viss...)

Kad pielieku akuci atsevishtji pie motora (bez sheemas) zudumi ir 0.1V


Kur varētu būt vaina?


P.S. Sensori nav pielodeeti.

----------


## karloslv

Pirmkārt, kur tieši ko tu mēri? Procesora izejā? Uz tranzistora kolektora? Un ko nozīmē 'zudumi'??? Loģiskais 1 nav noteikti +5V, tas drīkst būt jebkur no aptuveni 3,3V līdz 5V.

----------


## Edzukins

es meeriiju starp akumolaatora(VCC2) (+) un starp tranzistora kolektoru.
zudumi - nu labi izteikshos savaadaak - tiiri akucim ir 5,5V bet ik peec divaam sekundeem paraadaas 5,4V (kad nav piesleegts motors)
Bet kad ir pielēgts motors man (tajā pašā vietā) ir 0.4V - jeb motors praktiski negriezhas.

----------


## Edzukins

jā, aizmirsu pieminēt ka diodes nav pielodētas, bet tam tak nevaidzētu traucēt ne?
Kad pieliesleedz akuci pa taisno pie motora, tas griezaas un testeris raada 5,4V.
Jā un vēl shēmā nav parādīts stabilizators (mikrenes baterijai).

----------


## karloslv

Slēgt voltmetru starp kolektoru un VCC2 ir nekorekti, un tas, ko tu nolasi, pilnīgi neko nepasaka. Tikpat labi varēja rādīt 3,2V, un tas neko neliecinātu. Kamēr nav slodzes kolektora ķēdē, nedrīkst tā mērīt spriegumu. Spriegums korekti ir mērīt UZ kaut kā, nevis STARP kaut ko.

Bet es nesapratu, kas tad ir problēma? Kas nestrādā? Uz PB1/PB2 nāk ārā un mainās 0/1?

----------


## Edzukins

> Kamēr nav slodzes kolektora ķēdē, nedrīkst tā mērīt spriegumu.


 Kā jau teicu - es pieslēdzu motoru (slodzi), un tad aaraa naaca 0.4V, jeb motors griezaas kaa mironis - luuk arii probleema.



> Uz PB1/PB2 nāk ārā un mainās 0/1?


 Jā

----------


## Edzukins

http://img87.imageshack.us/my.php?image=zhurka2ns0.jpg
šādi es pieliku testeri.
ar un bez slodzes.

----------


## karloslv

Bez slodzes nevar tā likt, jeb pareizāk - mērījumam nav nekādas jēgas. Tranzistors komutē strāvu, nevis spriegumu.

Ja griežas kā mironis - samazini bāzes pretestību. Cik liela tā ir?

----------


## Edzukins

ak jaa pareizi....
Liku kaa tu teici - 10k, bet saakumaa itkaa bija paredzeets 1k. Cik tad man likt?

----------


## karloslv

Var likt līdz pat kādam puskiloomam, bet pamēģini 1k, vajadzētu pietikt.

----------


## Edzukins

Ok, kamēr es lodēju, iedošu tev vēl vielu pārdomām  :: 

Kad es taisīju vienkāršu shēmu - sensors + LED + MK pprogrammējot man bija tāda problēma ka nevarēja ieprogrammēt, kamēr neatvienoju sensoram baroshanu.
un tagad arī, lai gan man nav sensoru, tomēr es nevaru ieprogrammēt neko (Entering programming mode: FAILED). Tādēl uzlodēju citu plati prieksh ieprogrammēšanas, pārspraužu mikreni robota platē un viss iet....

----------


## karloslv

Tam kas sēž uz PC0-PC7, nekāda iespaida uz programmēšanu nevar būt. Tur varbūt kāds cits āķis ir bijis.

----------


## Lemings

Neesi uz savas plates piekāris kaut ko uz programmēšanas līnijām MISO MOSI SCK?

----------


## Edzukins

> Neesi uz savas plates piekāris kaut ko uz programmēšanas līnijām MISO MOSI SCK?


 nē

----------


## Edzukins

O jaa, tagad aizgaaja, tnx  ::  
(ar paarprogrammeeshanu veeljoprojaam ir probleemas.)
Karlos, moshka var sarunaat ka 15.04 tu pasties kas tur pa lietu?  ::

----------


## Edzukins

```
    #include <avr/io.h>

    #define Sen1 PC0 //1. sensors
    #define Sen2 PC1 //2. sensors
    #define Sen3 PC2 //3. sensors
    #define Sen4 PC3 //4. sensors
    
    #define Sens_LEDs PD0//Izvads uz sensora gaismas diodēm (+5V) 
    
    #define MOTL PB1//Kreisais(Left) Motors
    #define MOTR PB2//Labais(Rght) Motors

    uint8_t skaititajs = 0,atrumsL = 0,atrumsR = 0;
    uint16_t Taimers = 0;


    int main()
    {    
        /* Vispirms uzliekam visu portu kā input, un ieslēdzam attiecīgo pull-up */
        DDRC = 0x00;
        PORTC = (1 << Sen1)|(1 << Sen2)|(1 << Sen3)|(1 << Sen4);

		
		        
        /* Uzliekam, kur pini būs output, un lai nedeg sākumā  */

        PORTD = 0;
        DDRD = (1 << Sens_LEDs);
        PORTB = 0;
        DDRB =  (1 << MOTL)|(1 << MOTR);
       
PORTD |= (1 << Sens_LEDs);

    // Muuzhiigais cikls
    while (1) 
	{
{atrumsL=0; atrumsR=0;}
		if ((PINC & (1 << Sen1)) == 1)//!!!!!!!!!!!!!!!!!!!SHEIT - Mainu Sen1 uz Sen2,Sen3,Sen4!!!!!!!!!!!!!!!!!!!!!!!!
                 {atrumsL=250; atrumsR=250;}

      // Te kontroleejam motorus
      if (skaititajs == 0) {PORTB |= (1 << MOTL); PORTB |= (1 << MOTR);}
      if (skaititajs == atrumsL) PORTB &= ~(1 << MOTL);
      if (skaititajs == atrumsR) PORTB &= ~(1 << MOTR);
      skaititajs++; // Izmantojam to, ka skaitiitajs pats paarleks no 255 uz 0

    }
	}
```

 Lai paarbaudiitu savu sheemu ar sensoriem, uzliku shaadu kodu, kuru testeeju vairaakas reizes paarprogrammējot  rindiņu (lai nomainiitu sensoru, kuru paarbaudu)
_if ((PINC & (1 << Sen1)) == 1)  {atrumsL=250; atrumsR=250;}_


Lieta tāda, ka tikai pirmais sensors strādāja. Pārējie nestrādāja. Bet pārbaudot atsevishtji(pieliekot LED) tie strādā.
Pārbaudīju arī kādu strāvu tie dod ārā pie mikrenes - kad atstarojas - 5V, kad neatstarojas 2,8-3V. Otrajā gadījumā nevajadzēja būt 0V?

Tātad problēma - motori griežas tikai tad ja ieprogrammēju _if ((PINC & (1 << Sen1)) == 1)  {atrumsL=250; atrumsR=250;}_
bet piemēram ja _if ((PINC & (1 << Sen2)) == 1)  {atrumsL=250; atrumsR=250;}_ tad neiet.

Manuprāt jābūt vaina kodā, ne?

----------


## karloslv

Diez vai kodā, drīzāk elektriski tie sensori nedaudz atšķiras. 

Kāds ir spriegums uz tā sensora, kurš darbojas (PC0)? 

0V tur nav jābūt un nebūs, tā tev nav programmēšana, bet reāla elektronika.

Visdrīzāk iebūvētie pull-up ir pārāk nikni priekš tiem pārējiem sensoriem, vajadzēs izņemt rindiņu PORTC = ... un pielodēt vien savus rezistorus.

----------


## Edzukins

tam kursh darbojas ir 2,8V.

Hmm, dīvaini... Tagad ortajam ir 2,8, trešajam 2,6 un ceturtajam arī 2,6..
pārbaudīšu visu vēlreiz.

----------


## Edzukins

Viens jautājums ne pa tēmu:

Sanāca tā kā sanāca, ka kompakti lodējot salodēju + ar - kopā un + gāja no mikrenes izvadkājas.
Tad nu tiku  pie savas pirmā nosvilinātā MK  ::   Vismaz es tā domāju...
Jo cits MK pie tās pašas shēmas programmējas, bet šim uzmet šādu text:
_Reading FLASH input file.. OK
Setting mode and device parameters.. OK!
Entering programming mode.. FAILED!
Leaving programming mode.. OK!_

Varu viņu droši mest ārā, vai ne?

----------


## karloslv

Nu, ja tev vienos un tajos pašos apstākļos (tajā pašā programmētājā un shēmā) viens programmējas, bet otrs nē, tad met vien ārā.

----------


## Velko

> Nu, ja tev vienos un tajos pašos apstākļos (tajā pašā programmētājā un shēmā) viens programmējas, bet otrs nē, tad met vien ārā.


 Protams, ja katrm čipam nav savādākas fuses. Ja tur sabarots "sviests", tad var mēģināt barot kā external oscillator kādu ~32kHz ģeneratoru. 

Vēl: man pašam ir gadījies viens joks - programmēju ATmega8 un visu laiku spraudelēju no vienas (kurā programmēju) shēmas otrā (kurā testēju). Beidzās viss ar to, ka pamanījos nolocīt RESET pinu. Stulbi,bet pirms mešanas miskastē tomēr pamanīju, Mega strādā vēljoprojām  :: 

Protams, ja vienkārši esi nosvilinājis izeju, tad gan tur neko daudz nevar darīt.

----------


## karloslv

Velko, tiesa par to ārējo pulksteni. Es tā vienu ATMega16 uzcēlu, kuru saimnieks bija nodēvējis jau par mirušu. Tā ka var atlikt maliņā vēlākam laikam  ::

----------

