Contor de Ronde Pentru Bobinator
Contor de Ronde Pentru Bobinator
Circuit
Nucleul principal al circuitului este bazat pe un PIC 16F628. Nu s-a folosit PIC-ul
16F84 din cauza că programul pe care l-am dezvoltat ocupă mai mult de 1k de memorie. Dacă
programa se dezvolta in limbaj de asamblare este posibil sa se poata economisi memorie si sa incapa
în 16F84. De ș i, dacă ne uităm la pre ț urile componentelor, 16F628, pe care îl ai
oferă performanț e mai mari, este mai economic decât 16F84.
Microcontrolerul numără impulsurile furnizate de un senzor de efect Hall. Pentru
Trebuie să adăugăm la motorul pe care îl alegem, un mic magnet pe ax, pentru ca cu fiecare
vuelta pe care o face motorul generează un impuls în senzorul Hall. În cazul meu, am folosit un
ș urubelniț ă electrică de care se aruncă pentru că bateriile nu mai funcț ionează. Ș urubelniț a vă
am conectat la o sursă de alimentare externă care îl impulsionează.
Pe de altă parte, ș i independent de alimentarea motorului, se foloseș te o altă alimentare pentru
electronică asociată cu PIC. Aceasta a fost făcută astfel pentru că într-o primă aproximare am văzut
că vârfurile generate de motor (consumă destul de mult curent) erau introduse în
electronică ș i generau comportamente nedorite. Ca urmare a acestei experienț e, s-a decis
adăugaț i un optocuplor pentru a izola electronica de releul care permite alimentarea cu
motor.
Ca interfaț ă cu utilizatorul a fost folosit un keyboard matriceal de 4×3 ș i un LCD. El
tastatura serveș te pentru a da comenzile sistemului iar cu LCD-ul putem vedea în ce punct ne aflăm
am găsit. Schema este cea prezentată în figura de pe pagina următoare.
Ca senzor HALL a fost folosit A1104 de marca Allegro, pe care l-am achiziț ionat de pe web
[Link] un senzor care ne oferă un impuls la ieș ire atunci când detectează un
câmp magnetic, este un senzor de tip comutator. Ieș irea senzorului este mosfet cu drenaj
deschis, de aceea se adaugă o rezistenț ă între +5v ș i ieș irea senzorului.
Software
Microcontrollerul a fost programat în limbajul C, în special codul este realizat în
CCS. Utilizăm două rutine furnizate de acest compilator pentru a gestiona tastatura
matricial ș i LCD. Am modificat rutinele pentru a folosi portul B, în cazul în care
tastatură matricială ș i pentru a folosi 8 biț i pentru controlul LCD-ului prin intermediul portului B, pentru
LCD.
În esenț ă, programul utilizează TIMER0 ca un contor de evenimente de la nivel scăzut la nivel înalt
care sunt introduse de RA4 provenind de la senzorul HALL.
Iniț ial, programul iniț iază tastatura, LCD-ul, setează RA4 ca intrare ș i restul
ca ieș iri. Este necesar să activezi rezistenț ele de pull-up asociate portului RB.
După iniț ializarea TIMER_0 pentru a număra evenimente prin pinul RA4 pe fronturile de la jos la
Bun, intrăm într-un bucle în care se aș teaptă comenzi de la tastatură.
În primul rând, pe LCD apare un mesaj al proiectului, pe care îl vom sări după
apăsaț i orice tastă.
Opț iunea 2 ne activează tastatura pentru a introduce valoarea contului în care trebuie să ne oprim.
motorul. După introducerea acestei valori, cu tasta start/stop se porne ș te motorul
oprind când s-a ajuns la sfârș itul numărului.
Se poate ieș i din orice meniu apăsând tasta ‘#’. Dacă în meniul principal apăsăm
tasta '#' microfonul intră în stare de somn ș i programul nu se va mai executa până când
resetează microfonul cu butonul.
Tasta '*' din oricare dintre meniurile 1 sau 2 este responsabilă pentru funcț ia de start/stop, este
a spune, apăsând-o pentru prima dată ac ț ionează releul care alimentează motorul ș i apăsând-o din nou
a doua oară pentru motor. Acest lucru este util pentru un control manual al bobinătorului, având în vedere că
poate apărea ca firul să se blocheze, să se rupă sau să existe alte neplăceri, care necesită oprirea motorului
ș i a-l reporni odată ce a fost rezolvat.
În primul rând, tot proiectul a fost realizat pe placa MicroPic Trainer, de acolo că în...
comentarii ale programului se ata ș ează starea întrerupătoarelor pentru a func ț iona
corectamente tastatura ș i LCD-ul.
După cură ț area proiectului, am realizat un circuit imprimat, imaginile acestuia
vom ataș a mai târziu.
#FUSEZE XT
#FUSES NOPUT //Fără temporizator de pornire
#FUSELE NOPROTECT
#foloseș te întârzierea(clcă=4000000)
#foloseș te fast_io(A)
#foloseș te fast_io(B)
voidmenu1(void);
voidmenu2(void);
int16contar(void);
int16introducere_valoare(void);
voidmain()
{
caracter
port_b_pullups(TRUE);
lcd_init();
kbd_init();
set_tris_a(0x10);//A4 ca intrare
puertoA3=0;//inicializo motor con 0
//lcd_enviar(LCD_COMANDO,LCD_CURSOR_BLINK); Nu activaț i cursorul ș i blinkerul
setează_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
printf(lcd_putc,"Contor de Pulsuri By Rober ",);
fă
kbd_getc();
');
în timp ce (caracter=='
printf(lcd_putc, "%s", cadena1);
while(1)
{
caracter=kbd_getc();
comută(caracter)
{
caz'1'
0
set_timer0(0);
menu1();
printf(lcd_putc,"%s",cadena1);
ruptura;
caz'2'
0
set_timer0(0);
meniu2();
printf(lcd_putc,"%s",cadena1);
pune capăt;
caz'*':
printf(lcd_putc,"f DE DE");
adormi();
}
};
int16contar()
{
intcuenta=0;
int16n;
contor=get_timer0();
dacă(cuenta==255)
{
setează_timer0(0);
deversare++
}
n=256*desbordamiento+contor;
lcd_gotoxy(10,2);
printf(LCD_PUTC,"%Lu",n);
return(n);
}
voidmenu1()
{
personaj;
intcontador_parcial=0;
1
inttecla_enter=0;//control de la tecla asterisco pulsada primera vez=1,
pulsada din nou =0
f* Motor Pornit/Opritn# iesire
fă
{
caracter=kbd_getc();
comutare(caracter)
{
caz '*':
dacă(tecla_enter==0)
{
fMotor ONn cuenta:
setează_timer0(contador_parcial);
1
0
set_tris_a(0x10);
puertoA3=1;//activo motor
}
altfel
{
lcd_gotoxy(1,1);
get_timer0();
printf(lcd_putc,"Motor OPRIT");
1
0
set_tris_a(0x10);
puertoA3=0;// motor apagado
}
opreș te;
#
tecla_enter=0;
1
set_tris_a(0x10);
0
ruptura;
}
dacă(tecla_enter)
contar();
}while(caracter!='#');
}
int16introduce_valoare()
{
caracter
charnumeros[6];
intcontador_caracter=0;
int16rotiri
fă
{
caracter=kbd_getc();
dacă(caracter!=' ')
{
printf(lcd_putc,"%c"caracter);
numeros[contador_caracter]=caracter;
contador_caracter++;
}
}
în timp ce (caracter!='#'&&contador_caracter<=4);
' ';
atol(numeros);
lcd_enviar(LCD_COMANDO,LCD_CLEARE);
lcd_enviar(LCD_COMANDO,LCD_ACASA);
voidmenu2()
{
caracter
int16vâlturi;
1
inttecla_enter=0;//*es la tecla enter y asi controlo si la he pulsado 1 o
niciodată
int16n;
rotiri = introduce_valoare();
a face
{
caracter=kbd_getc();
comutare(caracter)
{
*
dacă(tecla_enter==0)
{
1
0
printf(lcd_putc,"fON Fin: %Luncuenta:",vueltas);
set_tris_a(0x10);
1; //Activ motor
}
altfel
{
lcd_gotoxy(1,1);
printf(lcd_putc,"Oprit Fin: %Lun cuenta:",vueltas);
1
tecla_enter=0;
set_tris_a(0x10);
0;//motor oprit
}
ruptură;
#
0
1
set_tris_a(0x10);
0;//motor oprit
rupt
}
dacă(tasta_enter)
{
n=conta();
Sper că acest articol ț i-a fost util. Dacă da, aș aprecia să-l comentezi în
forumul nostru.
tastatură 4x4 în portul D în....ccs c 27 iunie 2009, 10:37:54
Salut tuturor, sunt nou pe forum, dar mi se pare grozav tot asta, observ un nivel ridicat la
nivel de utilizator, sper să pot contribui cu ceva ce ș tiu ș i au nelămuriri, de asemenea
pot solicita ajutorul dumneavoastră de mai multe ori.
Bine, sunt aici pentru că am făcut un mic cod în CCS C pentru PIC 16F877A unde
manipulez un tastatură matricială 4x4, dar problema este că a devenit foarte robust ș i nu ș tiu cum
fă să pară mai prezentabil ș i să nu fie nevoie să consum atât de mult timp citind linii, dacă da
m-ar putea ajuta să-l îmbunătăț esc, ar fi de mare ajutor. Pe de altă parte, nu pot folosi portul
A, pentru că l-am configurat pentru alte lucruri, B-ul îl am pentru gestionarea unui LCD.
20x4 y parte del puerto C, îmi ocup 2 CCP, prin urmare îmi rămâne doar portul
D liber ș i C în parte, bine, vă las pentru a vedea dacă mă pute ț i ajuta pu ț in. De
în avans, mulț umesc.
Cod:
#include <16F877a.h>
#dispozitiv adc=10
#FUSEZA NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#foloseș te întârziere (ceas=20000000) //Fosc=20Mhz
#define use_portb_lcd ADEVĂRAT //definirea ieș irii portului B pentru lcd
#include<lcd.c> //biblioteca pentru gestionarea LCD
#foloseș te standard_io(D)
int i,j,x;
char Teclas[4][4]={{'1','2','3','A'}
{'4','5','6','B'}
7
{'D','0','E','F'}}
void main(){
lcd_init(); //iniț ializează lcd
în timp ce (ADEVĂRAT) {
i++;
schimbă( i )
{
caz 1:
output_high(PIN_D4);
output_high(PIN_D5);
output_high(PIN_D6);
iesire_scăzută(PIN_D7);
opriț i;
cazul 2:
produse_inalte(PIN_D4);
iesire_inalta(PIN_D5);
iesire_scazuta(PIN_D6);
iesire_inalta(PIN_D7);
ruptură;
caz 3:
output_high(PIN_D4);
ieș ire_scăzută(PIN_D5);
output_high(PIN_D6);
output_high(PIN_D7);
ruptură;
cazul 4:
iesire_pandant(PIN_D4);
output_high(PIN_D5);
scoate_inaltime(PIN_D6);
output_high(PIN_D7);
ruptura;
caz 5:
rupturi;
default
}
dacă(i==5){i=0;}
dacă(!input(PIN_D0)){j=0;x=i;}
dacă(!input(PIN_D1)){j=1;x=i;}
dacă(!input(PIN_D2)){j=2;x=i;}
dacă(!input(PIN_D3)){j=3;x=i;}
printf(lcd_putc,"tecla:%c",Teclas[j][x]); //...prezentare
lcd_gotoxy(1,1);
}}
Cod: (c)
#foloseș te fast_io(b)
char Teclas[17]={'1','2','3','A',
'4','5','6','B',
7
'D','0','E','F',' '};
char Tecla;
void main(){
set_tris_b(0xF0);
output_b(0x00);
activează_interupătoare(INT_RB);
activează_interrupț iile(GLOBAL);
#int_RB
void RB_isr(void)
{
Tecla=TestTeclado(); //Testează la Tecla Pulsată.-
printf("Tecla=%c", Tecla);
output_b(0x00); // Se poate folosi întreruperea de la RB4-RB7, iar cu asta rămâne
// în aș teptarea unei viitoare întreruperi.-
}
int TestTeclado(void){
int i,j,Filas;
Filas=0x0E; //xxxx1110.
output_b(Filas);
i=0;
pentru(j=0;j<4;j++){
dacă (input(PIN_B4) == 0) {break;}
i++;
dacă (input(PIN_B5) == 0) {break;}
i++;
dacă(input(PIN_B6)==0){break;}
i++;
dacă(input(PIN_B7)==0){break;}
i++;
//rotaț i_stânga(&Filas,1);
shift_left(&Filas,1,1);
output_b(Filas); // Ț inem 0-ul la următorul Pin.
}
return(Teclas[i]);
}
Dacă tot încerci cu cea de 16x2, iată un diagramă pentru a conecta LCD-ul ș i tastatura.
#INT_RB
void întrerupe_tastatura()
{
cheie=citeste_tastatura(); //Asigna la tecla pulsată
sterge_intrerupere(INT_RB); // Lini ș teș te steagul RBIF
lcd_putc('\f'); //
lcd_gotoxy(1,1); //Vizualizaț i pe lcd
lcd_putc(key); //
}
// Programul Principal /////////////////////////////////////////////////////////
void main()
{
init_keypad();
lcd_init();
lcd_putc("\fAș teptând...");
în timp ce (adevărat)
{
}
}
{1,2,.,3,5}
Ș i pentru a-l converti într-un float:
Valor=atof(ș ir);
atunci apasă pe A ș i acced la tastatură adică pot folosi toate numerele, apoi prin
exemplu vreau să scriu numărul 10.5, odată ce am scris asta, revin ș i apas A sau B, dă-l
mismo, ș i mi se blochează din nou tastatura doar cu numere, adică de la 0 la 9 ș i ., ș i numărul 10.5
salvează-l într-o variabilă pentru a putea face operaț ii aritmetice cu el, dar ș i în interiorul pic-ului
a putea vizualiza pe LCD cifra creată, care în acest caz este 10.5 ș i asta e tot. Dar numerele
ce trebuie să creez poate fi atât întreg, cât ș i zecimal, care variază de la 0 la 25, unde în număr
poate avea nu mai mult de 2 zecimale adică 2.22, 5.53, 20, etc.
Singurul lucru pe care am reuș it să-l fac ș i care funcț ionează este să vizualizez tastele apăsate...
Cod:
#include <16F877a.h>
adc=10
#FUSEZĂRI NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#foloseș te întârzierea (ceas=20000000) //Fosc=20Mhz
#define use_portd_lcd TRUE //definirea ieș irii portului D pentru LCD
#include<lcd420.c> //librărie gestionare lcd
#include <keypad.c> Biblioteca de tastatură 4x4
#include <stdlib.h>
char String[5];
char Tecla;
int i;
float Valoare;
// Interrupț ie RB4 - RB7 /////////////////////////////////////////////////////
#INT_RB
void intrerupe_tastatura()
{
cheie=lectura_tastaturii();//Atribuie tasta apăsată
sterge_interrupt(INT_RB); //Limpia bandera RBIF
}
// Programul Principal /////////////////////////////////////////////////////////
void main()
{
lcd_init();
i=0;
în timp ce (adevărat)
{
init_keypad();
variabilă=cheie;
printf(lcd_putc,"tecla: %c",variabila);
lcd_gotoxy(1,1);
}}
Sper că mă poț i ajuta, maestre
PD:{blestemat hobby îmi ocupă prea mult timp jijijiji, dar oricum mulț umesc suky pentru
tot ceea ce mi-a ajutat, o mare îmbrăț iș are
Cod: (c)
#include <16F877a.h>
dispozitiv adc
#FUSES NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#foloseș te întârzierea (ceas=20000000) //Fosc=20Mhz
#define use_portd_lcd TRUE //definire ieș ire a portului D pentru LCD
#include<lcd420.c> //librărie manipulare lcd
#include <keypad.c> //Librăria de tastatură 4x4
#include <stdlib.h>
#INT_RB
void întrerupere_tastatură()
{
citeste_tastatura(); //Asigna tasta apăsată
dacă (cheia != 'D') { // Trebuie să stabilim o tastă sau ceva care să îț i ofere
// s-a încheiat introducerea datelor
String[ i ]=cheie;
i++;
1 // Există un nou caracter de imprimat.
}else{
Valor=atof(String); Se apasă tasta D, ca un "enter",
// aș a că salvăm datele ș i indicăm
// că la sosire...
NouIngresare // ...altă dată se ș terge ecranul, ca o
// calculatoare. Ș i resetăm i.
i=0;
}
clear_interrupt(INT_RB); // Ș tergeț i steagul RBIF
}
// Programul Principal /////////////////////////////////////////////////////////
void main()
{
lcd_init();
initiaza_tastatura();
i=0;
în timp ce (adevărat)
{
dacă (kbhit_tecla=1) { // O taste a fost apăsată?
if(NouaTasta==1){
lcd_putc("\f"); // Cumpără ecranul.-
0
}
kbhit_tecla=0;
printf(lcd_putc,"tecla: %c",key); // Imprimăm tasta apăsată
}}
Cita de: japifer_22 în 29 Iunie 2009, 02:19:10
PD:{blestemat hobby îmi ia prea mult timp jijijiji, dar oricum mulț umesc
suky pentru tot ce ai ajutat, o îmbrăț iș are mare
Cod:
///////////////////////////////////////////////////////////////////////////////
/
Tecla_pulsada
/
///////////////////////////////////////////////////////////////////////////////
/
//Funcț ie: Afiș ează pe ecran valoarea numărului pe care doriț i să îl introduceț i. //
//Parametru de intrare:
//
///////////////////////////////////////////////////////////////////////////////
/
void Tecla_pulsada ()
{
int Teclan, coma=0,salir;
char Teclac; //INTRODUCEREA VALORII
while(salir==0){
do{
Teclac=kbd_getc();
clac=='\0');
Teclac-48
dacă(Teclan==-6)
printf(lcd_putc,"\b \b"); // A fost apăsat *
}
altfel dacă (Teclan==17)// S-a apăsat,
{
dacă(coma==1)
{
ruptura;
}
altfel
{
1
printf(lcd_putc,", ");
}
}
altfel dacă (Teclan==-13) // S-a apăsat #
{
1
}
altfel
{
printf(lcd_putc,"%d",Teclan);
}
}
}
Cod
#INT_RB
void întrerupe_tastatura()
{
cheie=citeș te_tastatura(); //Atribuie tasta apăsată
dacă (cheia != 'D') { Trebuie să stabilim o tastă sau ceva.
care să te termine de introducerea datelor
String[ i ]=cheie;
i++;
kbhit_tecla=1; Este un nou caracter de imprimat.
}else{
Valor=atof(Sir) ; // A fost apăsată tasta D, ca un "enter", aș a că
// salvăm datele ș i indicăm că la sosire...
1 // ...un alt lucru este că ecranul se ș terge, ca o
// calculator. Ș i resetăm i.
i=0;
}
clear_interrupt(INT_RB); //Cură ț ă steagul RBIF
}
// Programul Principal /////////////////////////////////////////////////////////
void main()
{
lcd_init();
activează_interruptele(INT_RB); //interrupț ie INT_RB activată
dezactivează_interrupturile(GLOBAL); //toate întreruperile dezactivate
initiază_tastaieră();
i=0;
în timp ce (adevărat)
{
dacă(kbhit_tecla=1){ A fost apăsată vreo tastă?
if(NouaClavă==1){
lcd_putc("\f"); // Ș terge ecranul.-
0
}
kbhit_tecla=0;
printf(lcd_putc,"tecla: %c",key); // Imprimăm tasta apăsată
}}
Ha ș i marchizilor, mulț umesc pentru program, o să-l încerc..........
japifer_22Răspuns #29: 5 iulie 2009, 08:35:37
Bună, Suky, acum mi-a funcț ionat bine programul, mulț umesc.