# ATMEL mikrokontrolleri >  Datu sūtīšana no COM porta uz ATMega32

## Imi

Palīdziet lūdzu ar programmas c kodu mikokontrolierim ATMega32. Ideja sekojoša:
Caur COM portu mikrokontrolierim sūta 4 integer skaitļus. Tiklīdz kā dati pienāk no datora uz mikrokontrolieri,kontrolieris pārtrauc izpildīt galveno programmu, un pakšprogrammā tiek piešķirtas 4 mainīgajiem saņemtās vērtības. Tiklīdz vērtības ir piešķirtas, galvenā programma atkal atsāk strādāt jau ar jaunajām mainīgo vērtībām.

----------


## australia

nu, jāsāk ar to, ka COM portā datu bitiem ir citi sprieguma līmeņi.
vajadzēs starp COM un ATmega vienu MAX232

kas tieši izsūtīs tos skaitļus?

----------


## Imi

To es saprotu un tā arī domāju izmantot MAX 232 mikreni Gribēju dabūt DS275 ar to būtu vienkāršāk, nevajadzētu kondensātorus, diemžēl elfa lapā neatradu.

Skaitļus sūtīs mana programma. Vēl pagaidām neesmu viņu uzprogrammējis, bet domāju ka tas man grūtības nesagādās, jo datoram programmas esmu taisījis. Un ir daudz bibliotēku darbam ar COM portu, Tāpēc tas atvieglo darbu.

----------


## Delfins

Nu pie lasīšanas nobloķē lai galvenā programma nestrādā
COM porta lasīšana gan jau ka standarta, caur pārtraukumiem
Jāpiedomā arī pie kāda delay/timeout.. kad ilgi nesaņem 4 ciparus pēc lasīšanas sākuma, tad atgriež atpakaļ iepriekšējos 4 ciparus un atbloķē galveno programmu.

Papēti gatavus kodus kodus, kas piem. sūta instrukcijas procim, lai izdara šo un to.

----------


## australia

1) galvenā programma tāpat cilpos uz riņķi. ja riņķis nav vairāku sekunžu gars, mierīgi liktu galvenajā progā cilpu, kurā vajadzības gadījumā lasītu skaitļus.

2) es izmantotu 8bitu taimeri. ik pēc pus sekundes klausītos, vai com ports nav gatavs sūtīšanai. ja ir, tad lasam iekšā.

ar pārtraukumiem ir jāuzmanās. 16bitu operācijas var tikt norautas pusratā. palabojiet, ka kļūdos.

----------


## Delfins

Vispār jau atkarīgs no programmas.

----------


## Imi

Galvenā programma būs bezgalīgs cikls tāpēc nepieciešams pārtraukuma izsaukšana (interupt) pameklēju un 
http://extremeelectronics.co.in/avr-tut ... ting-data/ atradu piemēru
tagad jāpielāgo savām vajadzībām

----------


## karloslv

Jā, uz pārtraukuma. Vienīgi rēķinies, ka pārtraukumu izsauc pie katra baita saņemšanas - tātad Tev vajadzēs stāvokļa mašīnu, kas apstrādā vienu baitu un iziet no pārtraukuma. Es tipiski taisu pavisam vienkāršu pārtraukumu - tādu, kurš tikai krāmē nelielā buferī saņemtos datus. Kad vajadzīgie baiti sakasījušies, pārtraukums uzstāda kaut kādu pazīmi, galvenā programma tos apstrādā un iztīra buferi.

----------


## Imi

Vai nevarēja nobloķēt pārtraukumu izsaukšanu. t.i. rodas pārtraukums, kas nodod vadību apakšprogrammai. Apakšprogrammā ir komanda, kas bloķē pārtraukumus, pēc tam, kad ir visi dati nolasīti, apakšprogramma atkal atļauj pārtraukumus un galvenā programma turpina darbu. Vēl jau ir tas, ka ir jānolasa 4 skaitļi. Vai man pēc katra skaitļa ir jāliek pazīme ka viņš ir nolasīts un pēc pēdējā skaitļa pazīme, ka visi skaitļi nolasīti, lai galvenā programma atsāktu darbu.

----------


## karloslv

Te nevajag neko bloķēt un sarežģīt. Pseido-c-kodā (kods nu galīgi nav pilnīgs un loģika ir jāpapildina):



```
// pārtraukums
uart_interrupt()
{
  baits = UDR;
  if (!gatavs && pozīcija < izmērs) {
    buferis[pozīcija++] = baits;
  }
  if (buferis satur 4 skaitļus)
    gatavs = 1;
  }
}

// programma
while (1) {
  // darām cilpā visu, kas jādara
  if (gatavs) {
    // apstrādājam buferi
    pozīcija = 0;
    gatavs = 0;
  }
}
```

----------


## Imi

Paldies par info
Sākšu stādīt programmu

----------


## Delfins

Kas notiks, kad COM pa vidu pārtrūks? Nu pieņemsim tāda situācija...  Sanāk karājās gatavs=0, 
PC protams izmet connection lost.. un "jūzeris vulgaris" sūta vēlreiz datus. MCU protams gaida atlikušos divus... PC aizsūta pirmos divus baitus, MCU saprot.. "Ooo, beidzot..."  un pasūta nafig. Attiecīgi MCU konfigurācijā saņem nekorektus 4 baitus  :: 

Resp. papildus taimeris timout-am gan derētu. Varbūt mans stipri kļūdās?

----------


## Imi

Droši ka tas arī jāparedz

----------


## karloslv

> Resp. papildus taimeris timout-am gan derētu. Varbūt mans stipri kļūdās?


 Viss pareizi, bet tas ir atkarīgs no pabeigšanas nosacījuma - es parasti taisu parametru sūtīšanu ar Enter, līdz ar to, ja lietotājs kļūdījies, viņš nospiež Enter, un sistēma sapratīs, ka kļūdaini ievaddati un neko nevar izlobīt, un atkal gaidīs jaunu komandu. Vēl var ieviest Escape, kuru saņemot tiek iztīrīts buferis un komanda tiek no sākuma gaidīta. Tak visam ir vienkārši risinājumi, nevajag karināt uzreiz taimerus un sazin ko.

----------


## Delfins

Lieta tāda varbūt tu to Enter/Esc nemaz i nesagaidīsi... par to es runāju.

----------


## next

> Caur COM portu mikrokontrolierim sūta 4 integer skaitļus.


 Caur comportu suuta baitus.
Vajag vienoties (ar sevi) par datu formaatu.
Es sagudrotu kautkaadu datu bloku ko paartraukuma apstraades proga kraamee buferii, sanjemot nosleedzosho simbolu nodod fona procesam karogu ka bufers gatavs - var izmantot.

----------

