|
|
Elektronika.lt portalo forumas
Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2024 12 22, 20:27. Visos datos yra GMT + 2 valandos.
|
|
|
|
Forumas » Mikrovaldikliai » Programavimo C kalba pamokėlės pradedantiesiems su PIC12F629
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
|
|
|
Programavimo C kalba pamokėlės pradedantiesiems su PIC12F629 |
Parašytas: 2013 02 09, 19:16 |
|
|
|
edit
Pakeičiau temos pavadinimą siekiant temą padaryti naudingesne ir kitiems, nežinantiems nuo ko pradėti... O patyrę programuotojai manau nepasididžiuos ir atsakys į pradedančiųjų klausimus, ar bent duos kokį patarimą. Jei kas nors bent jau nukreipia teisingu keliu, tai jau yra didelė pagalba...
Sveiki,
Apie programų rašyma c kalba turiu tik žalia supratimą, todėl prašau pagalbos. Led'us pamirksinti moku. Sukompiliuotą programa pasibandau ant Proteus, žiūriu kaip veikia, bandau mokintis...
Darau tokį "delay" projektėlį, gal galėtumėt parodyti kaip reikia modifikuoti šitą programėlę, kad prie atitinkamų atskirų PIC12F629 išvadų galėčiau pajungti tris mygtukus, kurie leistu pasirinkti vieną iš trijų laiko reikšmių, kas kiek laiko kartosis visas šitas amžinas ciklas,
1mygtukas - kas 3 valandas, 2mygtukas kas 5val ir 3mygtukas kas 8val.
Veikiantis kodas ciklas kartojasi kas 5 valandas
#include <12F629.h>
#fuses INTRC_IO,NOWDT,PUT,NOPROTECT,BROWNOUT,NOMCLR,NOCPD
#use delay (clock=4000000) // 4MHz vidinis generatorius
void main()
{
int t;
while(true)
{output_low(PIN_A2);//LED1 ijungtas 5isvadas
delay_ms(1000);
output_high(PIN_A2);//LED1 isjungtas 5isvadas
delay_ms(2000);
output_low(PIN_A1);//LED2 ijungtas 6isvadas
delay_ms(2000);
output_high(PIN_A1);//LED2 isjungtas 6isvadas
delay_ms(2000);
output_low(PIN_A0);//LED3 ijungtas 7isvadas
delay_ms(3000);
output_high(PIN_A0);//LED3 isjungtas 7isvadas
for (t=0; t<10000; t++) delay_ms(1800); //5val isjungtas
}
}
Turiu susikompiliaves atskirus hex kad ciklas kartotus kas 3, 5, ir 8 valandas, pakeičiant reikšmę šioje eilutėje:
for (t=0; t<10000; t++) delay_ms(1080); //3val isjungtas
for (t=0; t<10000; t++) delay_ms(1800); //5val isjungtas
for (t=0; t<10000; t++) delay_ms(2880); //8val isjungtas
Kaip reikia tai atlikti panaudojant mygtukus? Iš anksto ačiū.. |
|
Paskutinį kartą redagavo PauliusA, 2013 03 07, 13:07. Redaguota 2 kartus(ų) |
|
|
|
|
|
Programavimo C kalba pamokėlės pradedantiesiems su PIC12F629 |
Parašytas: 2013 02 09, 22:40 |
|
|
|
Nesuprantu kame reikalas,ant Proteus viskas veikia, irašiau realiai i proca ir LED nemirksi kas per nesamonė? pabandžiau ir šita koda vistiek tas pats...
#include <12F629.h>
#fuses INTRC_IO,NOWDT,PUT,NOPROTECT,BROWNOUT,NOMCLR,NOCPD
#use delay (clock=4000000) // 4MHz vidinio generatoriaus daznis
void main()
{
while(true)
{output_low(PIN_A2);//ijungiame LED
delay_ms(500);//LED ijungtas 0.5sek
output_high(PIN_A2);//isjungiame LED
delay_ms(500);//LED isjungtas 0.5sek
}
}
Help |
|
|
|
|
|
|
Programavimo C kalba pamokėlės pradedantiesiems su PIC12F629 |
Parašytas: 2013 02 09, 22:45 |
|
|
|
Kompiliatorius jeigu neklystu CCS. Kad ši programa "pastebėtų" mygtuko paspaudimą aš naudočiau pertraukimus ir "vėliavėles". Nes dar neaišku kaip turi "elgtis" programa aptikus nuspaustą mygtuką - sulaukti užduoto intervalo pabaigos ar jį nutraukti ir skaičiuoti naujai užduotą? Man dideliems laiko intervalams skaičiuoti labiau patinka taimeriai. Bet čia skonio reikalas. Aš labai tikiuosi, kad čia užsuks AlgisL ir patars tikrai ką nors vertingesnio. Jeigu ne paslaptis, kam tai bus naudojama? |
|
|
|
|
|
Programavimo C kalba pamokėlės pradedantiesiems su PIC12F629 |
Parašytas: 2013 02 09, 22:53 |
|
|
|
Kol "kurpiau" savo atsakyma atsirado dar vienas klausimas. Su programa lyg ir viskas tvarkoje nors kažkiek priklauso nuo kompiliatoriaus versijos, nes man tekę susidurti, kad reikia su define nurodyti kur yra TRIS ir PORT registrai. O gal netyčia ištrynei generatoriaus kalibravimo konstantą? |
|
|
|
|
|
|
Programavimo C kalba pamokėlės pradedantiesiems su PIC12F629 |
Parašytas: 2013 02 09, 23:08 |
|
|
|
Kompiliatorius toks "PIC C Compiler CCS PCWHD 4.093 FULL Portable". Paspaudus mygtuką programa turi nutraukti ankstesnį skaičiuojamą laiko intervalą ir turi pradėti naują ciklą iš pradžių paeiliui pajunginėjamii 3 LED'ai būtent taip kaip parodyta programoje, paskui skaičiuojamas didelis laiko intervalas pvz 3, 5, ar 8 valandos, po to vel nuo pradžių, ir taip neribotą laiką... paspaudus kitą mygtuką sukasi kitas laiko intervalas pvz kas 3 valandas, ir t.t. Čia bus toks aparatas, nzn kaip pavadint, "dozatorius" reikalingi trumpalaikiai bet tikslaus dažnumo loginio vieneto impulsai kas kelias valandas, trukmė pvz 1sek, 1,5sek ar 2,5sek. |
|
|
|
|
|
|
Programavimo C kalba pamokėlės pradedantiesiems su PIC12F629 |
Parašytas: 2013 02 09, 23:11 |
|
|
|
Rašiau su icprog pabaigoje klausė ar yes ar no berods del oscal jei teisingai parašiau. Paspaudžiau yes. Klausė ar palikti seną ar naudoti toki koks yra hex faile, jei gerai supratau.
Dar nepaminėjau kad pas mane ant stacionaraus PC sukasi Win7 x64 bet su tuo tik hex irašiau i PIC'ą. Ant šitų windausu man neveike nei mano turima Proteus versija, nei tas CCS kompiliatorius... kažkaip keistai elgėsi ir icprog, automatiškai PIC12F629 neaptinka, reikia rankiniu būdu parinkti proco pavadinimą. Na bet hex isirašė be problemų, ir dar persitikrino, pabaigoje rašė viskas ok. Kas iš to pajungiau- neveikia... Turiu ir nešiojama su Win XP 32bitu tai visą "juodą" darbą darau su juo... |
|
|
|
|
|
|
Programavimo C kalba pamokėlės pradedantiesiems su PIC12F629 |
Parašytas: 2013 02 10, 16:05 |
|
|
|
Parasiau Paspaudi knopke pradeda eiti laikas, mirksi led. Laikas iseina led dega nebemirksi.
Kodas: |
#include "C:\Documents and Settings\AMD\My Documents\PIC\main.h"
#define T_1 3 //10800 // 3 val
#define T_2 5 //18000 // 5 val
#define T_3 8 //28800 // 8 val
unsigned char t, p, laikas_stat;
unsigned int laikas;
//---------------------------------------------------------------------------
void led_blink(void){
p = ~p;
if(laikas_stat == 1){
if(p){
output_high(PIN_A0);
}else{
output_low(PIN_A0);
}
if(laikas == T_1){
output_high(PIN_A0);
laikas_stat = 0;
}
return;
}
//------------------------------------
if(laikas_stat == 2){
if(p){
output_high(PIN_A1);
}else{
output_low(PIN_A1);
}
if(laikas == T_2){
output_high(PIN_A1);
laikas_stat = 0;
}
return;
}
//------------------------------------
if(laikas_stat == 3){
if(p){
output_high(PIN_A2);
}else{
output_low(PIN_A2);
}
if(laikas == T_3){
output_high(PIN_A2);
laikas_stat = 0;
}
return;
}
}
//---------------------------------------------------------------------------
#INT_TIMER0
void TIMER0_isr(void) { // int kas 4ms
if (t == 0 || t == 125){ //led mirksi kas 0.5s
led_blink();
}
t++;
if(t >= 250){ //4ms * 250 = 1s
t = 0;
laikas++;
}
}
//---------------------------------------------------------------------------
void main(){
p = 0;
laikas = 0;
laikas_stat = 0;
output_A(0x00);
port_a_pullups (0x38) ;
set_tris_A(0x38);
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_16) ;
setup_timer_1 (T1_DISABLED) ;
setup_comparator (NC_NC) ;
setup_vref (FALSE) ;
enable_interrupts (INT_TIMER0) ;
enable_interrupts (GLOBAL) ;
while(1){
if(!input(PIN_A5)){
delay_ms(50);
output_low(PIN_A0);
output_low(PIN_A1);
output_low(PIN_A2);
laikas_stat = 1;
laikas = 0;
p = 255;
while(!input(PIN_A5));
delay_ms(50);
}
if(!input(PIN_A4)){
delay_ms(50);
output_low(PIN_A0);
output_low(PIN_A1);
output_low(PIN_A2);
laikas_stat = 2;
laikas = 0;
p = 255;
while(!input(PIN_A4));
delay_ms(50);
}
if(!input(PIN_A3)){
delay_ms(50);
output_low(PIN_A0);
output_low(PIN_A1);
output_low(PIN_A2);
laikas_stat = 3;
laikas = 0;
p = 255;
while(!input(PIN_A3));
delay_ms(50);
}
}
}
|
|
|
|
|
|
|
|
Programavimo C kalba pamokėlės pradedantiesiems su PIC12F629 |
Parašytas: 2013 02 10, 17:08 |
|
|
|
Biški ne toks veikimo algoritmas. Man reikia kad butu toks:
Paduodamas maitinimas:
led1 dega 1000ms ir uzgesta
delay 2000ms
led2 dega 2000ms ir uzgesta
delay 2000ms
led3 dega 3000ms ir uzgesta
delay 3 valandos
praejus laikui ciklas kartojasi nuo pradziu.
1 mygtukas amžinas ciklas kartojasi kas 3 valandas
2 mygtukas amžinas ciklas kartojasi kas 5 valandas
3 mygtukas amžinas ciklas kartojasi kas 8 valandas
Idomumo deliai nusibraižiau tavo jungimo schemą ant Proteus. Pabandžiau sukompiliuoti tavo kodą bet nesekmingai kompiliatorius išmete 2 error'us šitose eilutese:
#include "C:\Documents and Settings\AMD\My Documents\PIC\main.h"
unsigned char t, p, laikas_stat; |
|
|
|
|
|
|
Programavimo C kalba pamokėlės pradedantiesiems su PIC12F629 |
Parašytas: 2013 02 10, 17:16 |
|
|
|
main.h
#include <12F629.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOCPD //No EE protection
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES PUT //Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES BANDGAP_HIGH
#use delay(clock=4000000) |
|
|
|
|
|
Programavimo C kalba pamokėlės pradedantiesiems su PIC12F629 |
Parašytas: 2013 02 10, 17:39 |
|
|
|
Na dabar pavyko sukompiliuoti. Ikeliau i proteus led3 sumirksi 7 kartus ir dega pastoviai. I mygtukus nereaguoja. Nzn gal kas negerai ant Proteus nustatyta, nusibraižiau tai kaip paveikslelyje.
Na bet tiek jau to.. Beje dekui už vargus..
Reikia kitokio algoritmo kur aukščiau rašiau. |
|
|
|
|
|
|
Programavimo C kalba pamokėlės pradedantiesiems su PIC12F629 |
Parašytas: 2013 02 10, 18:09 |
|
|
|
Kodas: |
#include "C:\Documents and Settings\AMD\My Documents\PIC\main.h"
#define T_1 3 //10800 // 3 val
#define T_2 5 //18000 // 5 val
#define T_3 8 //28800 // 8 val
unsigned char t, p, laikas_stat;
unsigned int laikas;
//---------------------------------------------------------------------------
void led_blink(void){
disable_interrupts (INT_TIMER0) ;
disable_interrupts (GLOBAL);
output_high(PIN_A0);
delay_ms(1000);
output_low(PIN_A0);
delay_ms(2000);
output_high(PIN_A1);
delay_ms(1000);
output_low(PIN_A1);
delay_ms(2000);
output_high(PIN_A2);
delay_ms(1000);
output_low(PIN_A2);
delay_ms(2000);
enable_interrupts (INT_TIMER0) ;
enable_interrupts (GLOBAL) ;
}
//---------------------------------------------------------------------------
#INT_TIMER0
void TIMER0_isr(void) { // int kas 4ms
t++;
if(t < 250) return;
t = 0;
laikas++;
if(laikas_stat == 1){
if(laikas == T_1){
laikas = 0;
p = 1;
}
return;
}
if(laikas_stat == 2){
if(laikas == T_2){
laikas = 0;
p = 1;
}
return;
}
if(laikas_stat == 3){
if(laikas == T_3){
laikas = 0;
p = 1;
}
return;
}
}
//---------------------------------------------------------------------------
void main(){
p = 0;
laikas = 0;
laikas_stat = 0;
output_A(0x00);
port_a_pullups (0x38) ;
set_tris_A(0x38);
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_16) ;
setup_timer_1 (T1_DISABLED) ;
while(1){
if(p == 1){
led_blink();
p = 0;
}
if(!input(PIN_A5)){
laikas_stat = 1;
laikas = 0;
led_blink();
while(!input(PIN_A5));
delay_ms(50);
}
if(!input(PIN_A4)){
laikas_stat = 2;
laikas = 0;
led_blink();
while(!input(PIN_A4));
delay_ms(50);
}
if(!input(PIN_A3)){
laikas_stat = 3;
laikas = 0;
led_blink();
while(!input(PIN_A3));
delay_ms(50);
}
}
}
|
|
|
|
|
|
|
|
Programavimo C kalba pamokėlės pradedantiesiems su PIC12F629 |
Parašytas: 2013 02 10, 18:52 |
|
|
|
Sukompiliavau taip:
#include <12F629.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOCPD //No EE protection
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES PUT //Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES BANDGAP_HIGH
#use delay(clock=4000000)
#define T_1 3 //10800 // 3 val
#define T_2 5 //18000 // 5 val
#define T_3 8 //28800 // 8 val
unsigned char t, p, laikas_stat;
unsigned int laikas;
//---------------------------------------------------------------------------
void led_blink(void){
disable_interrupts (INT_TIMER0) ;
disable_interrupts (GLOBAL);
output_high(PIN_A0);
delay_ms(1000);
output_low(PIN_A0);
delay_ms(2000);
output_high(PIN_A1);
delay_ms(1000);
output_low(PIN_A1);
delay_ms(2000);
output_high(PIN_A2);
delay_ms(1000);
output_low(PIN_A2);
delay_ms(2000);
enable_interrupts (INT_TIMER0) ;
enable_interrupts (GLOBAL) ;
}
//---------------------------------------------------------------------------
#INT_TIMER0
void TIMER0_isr(void) { // int kas 4ms
t++;
if(t < 250) return;
t = 0;
laikas++;
if(laikas_stat == 1){
if(laikas == T_1){
laikas = 0;
p = 1;
}
return;
}
if(laikas_stat == 2){
if(laikas == T_2){
laikas = 0;
p = 1;
}
return;
}
if(laikas_stat == 3){
if(laikas == T_3){
laikas = 0;
p = 1;
}
return;
}
}
//---------------------------------------------------------------------------
void main(){
p = 0;
laikas = 0;
laikas_stat = 0;
output_A(0x00);
port_a_pullups (0x38) ;
set_tris_A(0x38);
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_16) ;
setup_timer_1 (T1_DISABLED) ;
while(1){
if(p == 1){
led_blink();
p = 0;
}
if(!input(PIN_A5)){
laikas_stat = 1;
laikas = 0;
led_blink();
while(!input(PIN_A5));
delay_ms(50);
}
if(!input(PIN_A4)){
laikas_stat = 2;
laikas = 0;
led_blink();
while(!input(PIN_A4));
delay_ms(50);
}
if(!input(PIN_A3)){
laikas_stat = 3;
laikas = 0;
led_blink();
while(!input(PIN_A3));
delay_ms(50);
}
}
}
Ant proteus 1 sekundei paeiliui uzsidega ir uzgesta diodai. I mygtukus nereaguoja, gal jungimo schema reikia keisti? kam tas 10K rezistorius ant +5V ir 4 išvado?
Nesuprantu kame reikalas kodel man Ant Proteus led mirksi o realiai irašius i proca niekas nevyksta??? gal su fuse bitais kas negerai?
rašant hex pabaigoje klausia:
No "Osscillator callibration value" found.
Do you want to use value from file (3FFFh) instead?
Spaudziau yes
Kame reikalas? |
|
|
|
|
|
|
Programavimo C kalba pamokėlės pradedantiesiems su PIC12F629 |
Parašytas: 2013 02 10, 20:38 |
|
|
|
Parsisiunčiau pabandyti assembleriu rašyta programą tai rašant i procą irgi taip pat klause paspaudžiau yes ir Led'as puikiausiai mirksejo. Bandžiau studijuoti asm source kodą, tai daug sudetingiau atrodo nelabai ka ir supratau, C atrodo paprasčiau... |
|
|
|
|
|
Programavimo C kalba pamokėlės pradedantiesiems su PIC12F629 |
Parašytas: 2013 02 10, 21:27 |
|
|
|
Pasitikrinimui atsidaryk tą parsisiūstą hex su IC-Prog ir pažiūrėk kas yra paskutinėje kodo eilutėje pabaigoje. Gal kartais programos autorius ten įrašė ką nors. Skaičiau čia forume, kad nuo jos priklauso tik generatoriaus tikslumas, oprograma turėtų veikti. Kartą "žaidžiau su PIC16F676 - ištrynus konstantą programa neveikdavo. |
|
|
|
|
|
|
Google paieška forume |
|
|
Naujos temos forume |
|
|
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
|
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
|
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
|
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
|
LEGO
Mänguköök,
mudelautod,
nukuvanker |
|
Thermal monocular
Thermal vision camera,
Night vision ar scope,
Night vision spotting scope |
|
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps Mods |
|
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
|
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
|
GTA 6 Weapons
GTA 6 Characters,
GTA 6 Map,
GTA 6 Vehicles |
|
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
|
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
|
|
|