» »

ideja: koda za razne mikrokontrolerje na enem mestu

ideja: koda za razne mikrokontrolerje na enem mestu

ql000 ::

Ravno pišem eno aplikacijo za PIC-a (PID krmilnik) v C-ju, pa sem dobil idejo, ko gledam temo v Programiranju. A ne bi bilo fajn, da bi tudi na tem mestu zbirali kodo Assembler, C, Basic,... za razne mikrokontrolerje (PIC, Atmel, Phillips, Hitachi,...) pač različne celotne aplikacije ali pa samo bistvene dele kode. Ko bo npr. posredovali kodo bi še omenili kater prevajalnik je kdo uporabil, kje piše program,...

Kaj pravite?

[Prosim, da v ta topic pastate samo kodo s kratkim opisom kaj dela ali linke do zanimivih strani, ki se tičejo topica. Ostalo bo izbrisano. Če rabite rešitev nekega problema, odprite novo temo. Hvala za razumevanje, moderator]

p.s. Kako narediti da bo vaša koda, imela profi izgled, si preberite v tej povezavi.
  • preklical razglas: Primoz ()

stromar ::

Dobra ideja. Se ravno učim programiranja PIC-ev v assemblerju in bi mi verjetno prav prišlo.

Lp

Highlag ::

Spodaj pripeta koda omogoča uporabe pavze željene dolžine max 1min
Uporaba:
PIC mikrokontrolerji (16 in 12 serija preverjeno deluje) Frekvenca oscilatorja mora biti 4MHz
Vsebino prekopirati v datoteko z imenom pauza.inc
Uporaba v programu:
Na začetku je treba svojemu programu dodati povezavo:
#include "pauza.inc"

Na mestu v programu, kjer hočemo pauzo vpišemo:

pauza .1000 ;Za zakasnitev 1s

Še koda:
;------------------------------------------------------------------------------------------------------
; Za zakasnitev 1 minuto (59,904sekund) mora biti argument arg1 = .59904 (to je decimalno)
; Za zakasnitev 1s mora biti arg1= .1000
; Za zakasnitev 100ms mora biti arg1= 0.100

pauza macro arg1

;definicija spremenljivk

local Zanka1
local desetica_HI
local Zakasnitev_1ms
local Zanka2
local Konec

movlw high arg1 ; Move literal to W register Višji bajt argumenta arg1 gre v HIcnt
movwf HIcnt ; Move W register to HIcnt
movlw low arg1 ; Move literal to W register Nižji bajt argumenta arg1 gre v LOcnt
movwf LOcnt ; Move W register to LOcnt
Zanka1
;Zmanjšuje HIcnt in LOcnt za določeno število
;in nato pokliči podprogram Zakasnitev_1ms
movf LOcnt, f ; Testira vsebino LOcnt registra
btfsc STATUS, Z ; Bittest skip if clear testira bit Z status registra Z = 1 če je rezultat računske operacije 0
goto desetica_HI ; Z=1 ->LOcnt=0
call Zakasnitev_1ms ; Z=0 ->LOcnt>0 zakasnitev 1ms
decf LOcnt, f ; LOcnt-1 -> LOcnt
goto Zanka1 ; skok nazaj
desetica_HI
movf HIcnt, f
btfsc STATUS, Z
goto Konec
call Zakasnitev_1ms
decf HIcnt, f
decf LOcnt, f
goto Zanka1
Zakasnitev_1ms:
movlw .100 ; Move literal to W 100->W (0xFA)
movwf LOOPcnt ; Move W to LOOPcnt
Zanka2:
nop ; nooperation
nop ; nooperation
nop ; nooperation
nop ; nooperation
nop ; nooperation
nop ; nooperation
nop ; nooperation
decfsz LOOPcnt, f ; Decrement LOOPcnt skip if zero LOOPcnt=LOOPcnt-1 odšteje 1 od vrednosti registra LOOPcnt
goto Zanka2 ; Če je LOOPcnt=0 potem ta stavek spusti saj je 1ms minila
return ; skok nazaj na vrstico 18
Konec
endm
Never trust a computer you can't throw out a window

ql000 ::

Evo! Ta koda pobere poslane characterje po rs232 (serijski port) portu in jih sestavi v string. Kodo uporabljam, da sestavim protokol na strani pic-a. Compiler je PIC C CCS Compiler. Zadeva laufa na vseh PIC-ih, samo

#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)

priredite svoji arhitekturi. Ta je naštimana za PIC16F876 (moja osebna preferenca). CLK je 20M.

Primer uporabe:
Kontrola raznih objektov po home made protokolu. PC pošlje PIC-u protokol, PIC prebere posamezne črke in jih sestavi v string. Krasna zadeva za kompleksno krmiljenje objektov (sam uporabljam to zadevo v kodi za kontrolo laserja).

funkcijski argumenti: create_string(string, 'X'); kjer je:char string[] in X je npr. črka pri kateri se funkcija ustavi (termination character).

int create_string(char *s, char tc)
{
   char *ps;
   ps = s;

   while((*ps=getc()) != tc)
   {
      ps++;
   }
   return  (ps-s);
}

Zgodovina sprememb…

  • spremenil: Azrael ()

ql000 ::

Koda, ki sprejme string z formatom: SXXXXXXXX, kjer so XXXXXXXX neko binarno število (8 bitno), ki ga hočemo zapisati npr. direkt na port B npr. pic16f876.

s pointerjem psearch_s lociramo (funkcija strchr()) črko S, beremo vrednosti od S naprej in zapišemo vrednosti direkt na port. Compiler: PIC C CCS.

   for (i=1; i<=10; i++)
   {
      byte_port_out[i-1] = *(psearch_s + 1); // Vrednosti na lokaciji pointerja+1 zapisem v spremenljivko
   }
   
   printf(" 8-bit output: %s\n\r", byte_port_out);

   if (byte_port_out[0] == '1')
   {
      output_high(B0);
   }
   else
   {
      output_low(B0);
   }
   if (byte_port_out[1] == '1')
   {
      output_high(B1);
   }
   else
   {
      output_low(B1);
   }
   if (byte_port_out[2] == '1')
   {
      output_high(B2);
   }
   else
   {
      output_low(B2);
   }
   if (byte_port_out[3] == '1')
   {
      output_high(B3);
   }
   else
   {
      output_low(B3);
   }
   if (byte_port_out[4] == '1')
   {
      output_high(B4);
   }
   else
   {
      output_low(B4);
   }
   if (byte_port_out[5] == '1')
   {
      output_high(B5);
   }
   else
   {
      output_low(B5);
   }
   if (byte_port_out[6] == '1')
   {
      output_high(B6);
   }
   else
   {
      output_low(B6);
   }
   if (byte_port_out[7] == '1')
   {
      output_high(B7);
   }
   else
   {
      output_low(B7);
   }

neoto ::

Evo koda v C-ju (CCS C Compiler) za paketno brezžično prenašanje podatkov s preverjanjem napak s CRC:
Oddajnik - driver
Sprejemnik - driver
Komentarji v angleščini, vsa navodila za uporabo so zraven. Uporabljam jih z cenejšimi brezžičnimi radijskimi moduli in stvar dela.

Tutankhamun ::

Izboljšava kode, ki sprejme string z formatom: SXXXXXXXX, kjer so XXXXXXXX neko binarno število (8 bitno), ki ga hočemo zapisati npr. direkt na port B npr. pic16f876.

ql000 preden bi šel v FOR zanko bi najprej postavu cel port B na 0.
PORT_B = 0; //ne vem kako postavš v C-ju port na 0.
for(int i = 0; i < 8; i++)
{
   if(byte_port_out[i] == '1')  
      output_high(i);
}
Alpa še bol, da ne zapisuješ direkt na PORT, ampak najprej v spremenljivko, potem pa celo spremenljivko postavš na PORT. Zato, ker če nekdo na PORTU bere, bo namesto enega bajta sprejel 8 bajtov.

In pa na mesto tvoje prve for zanke. Ne vem zakaj maš tm inicializacijo i = 1, potem, ko pa vpisuješ pa morš odštevat. Preveč mučš procesor ;)
for (i=1; i<=10; i++)
{
      byte_port_out[i-1] = *(psearch_s + 1); 
}
Rajš napiš
for (i=0; i < 8; i++)
{
      byte_port_out[i-1] = *(psearch_s + 1); 
}
Pa se koda hitr zmanjša, pa še bolj je pregledna.

Zgodovina sprememb…

  • spremenil: Azrael ()

neoto ::

Tutankhamun: indeksa nisi popravil!
for (i=0; i < 8; i++)
{
byte_port_out[i] = *(psearch_s + 1); 
}


drugače se mi to zdi malo brezveze. Si slučajno mislil *(psearch_s++)?

drugače pa lahko narediš nekaj takega:
int output_buffer=0;

for (i=0; i < 8; i++)
{
if (byte_port_out[i]==1) bit_set(output_buffer, i);
}

output_b(output_buffer);

Zgodovina sprememb…

  • spremenil: Azrael ()


Vredno ogleda ...

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

esembler-hitro

Oddelek: Programiranje
111463 (1151) aaaaa93
»

Pic- zamik za 24h

Oddelek: Elektrotehnika in elektronika
5993 (905) MeGreat
»

PIC18F4550 in ds18s20

Oddelek: Elektrotehnika in elektronika
191992 (1671) snow
»

PIC 16f84A - utripanje

Oddelek: Elektrotehnika in elektronika
222213 (2013) ql000
»

mikrokontrolerji, programatorji, c/asm ?

Oddelek: Elektrotehnika in elektronika
292987 (2606) snow

Več podobnih tem