Nahodim sem schemu aj program. Je to mnamka ako na 8vyvodovom uP(2 su napajanie a 1 mclr) urobit vystup pre 4 ledky, ovladat 3 tranzistory, mat 1x ovladacie tlacidlo a merat napatie na baterke. Ze vam to nevychdza no ani mne, a co horsie v proteuse to funguje chvilku a zblbne to.
Simulator v MPlabe hlasi cosi o chybe w0014.
Tak ze keby niekto vedel o nejakych bugoch tak sem stym. Hitech kompiler pro.
tak to sem hot sem zvedavej…
Dobře, může být, každé řešení je platné, ale stejně se zeptám: Proč takové hrdinství? Zrovna řeším něco podobného a postupně docházím k tomu, že co možná platilo ještě před pár lety (jestli vůbec někdy), tedy že “se vyplatí využít ho do mrtě”, tak vzhledem k cenám těch MCU a hlavně času dnes už neplatí:
TME (beru co je zrovna skladem) - PIC12F683-I/P 56,- i s DPH.
PIC16F1704-I/P 37,60
PIC16F1705-I/P 50,60
PIC16F1516-I/P 62,-
a mnoho dalších, a pokud by se šlo do SMD, tak jsou ještě levnější… Život máme jen jeden, a i když je elektronika fajn zábava, často je lepší tu hlavu vypnout a ten čas využít lépe a zdravěji, vylézt někam ven do přírody, na procházku, kolo, zaplavat si, mezi lidi a tak… “Fláknout to tam a nazdar”, můj názor
Lebo to niekto pre lidl navrhol tak, aj to si niesom isty ci je tam pic {skor stm)
Tak schematko
#include <htc.h>
#include <stdlib.h>
#define _XTAL_FREQ 8000000 //frekvencia v Hz
// #pragma DATA _CONFIG, _FCMEN_OFF&_IESO_OFF&_MCLRE_OFF&_WDT_OFF&_INTOSCIO
__CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON & MCLRE_ON & BOREN_OFF & CPD_OFF & CP_OFF & IESO_OFF & FCMEN_OFF);
/* Connections:
LEDs connected to GP1 and GP2
GP4/AN3 is connected to a voltage divider with a potentiometer
*/
#define FOSC 8000000L
//*************************************************************************
//*********************************** main ********************************
//*************************************************************************
// Delay Function
#define _delay_us(x) { unsigned char us; \
us = (x)/(12000000/FOSC)|1; \
while(--us != 0) continue; }
void _delay_ms(unsigned int ms)
{
unsigned char i;
do {
i = 4;
do {
_delay_us(164);
} while(--i);
} while(--ms);
}
void main(void)
{
unsigned char ADvalue=0;
unsigned char vcc100=0;
unsigned char vcc75=0;
unsigned char vcc50=0;
unsigned char vcc25=0;
unsigned char ADtime=20;
OSCCON=0x70; // Select 8 Mhz internal clock
WDTCON = 0x00; // Watchdog not used
CLRWDT();
ANSEL = 0; // a2d module off, digital I/O
CMCON0 = 7; // comparator off, digital I/O
GP1=0;
GP2=0;
GP4=1;
GP5=0;
//GPIO port definitions
TRISIO = 0b00000001; // GP0 is an input (GP0 = AN0 for pic12f683)
// TRISIO = 0b00010000; // GP4 is an input (GP4 = AN3 for pic12f683)
// GPIO = 0x00; // set GPIO to low outputs
// ANSEL register - analog setup
ANSEL = 0b01100001; // ANS0 as analog input, Frc (internal clk for Tad)
// ANSEL = 0b00111000; // ANS3 as analog input, Frc (internal clk for Tad)
// Init ADC
ADCON0 = 0b00000000; //right justified, vdd, -, -, 00=an0, 0=done, 0=adon off
// ADCON0 = 0b00001100; //right justified, vdd, -, -, 11=an3, 0=done, 0=adon off
ADON=1; // turn on the A2D conversion module
__delay_ms(10);
GO_DONE = 1; //start the conversion
__delay_ms(100);
// GP0=0;
//--------------------------------------------------------------------------
while (1)
{
//while (GO_DONE) continue; //polling for conversion completion
if(!ADtime){ADtime=254;
//ADvalue=ADRESL + (ADRESH << 8); //get data
ADvalue=ADRESH; //get data
ANSEL = 0b01100001; // ANS0 as analog input, Frc (internal clk for Tad)
TRISIO = 0b00000001;
__delay_ms(5);
GO_DONE=1; //1 bit 4mV
if (ADvalue > 86) vcc100=1;else vcc100=0; //86 on>4.0 87 on>4.04
if (ADvalue > 80) vcc75=1; else vcc75=0; //80 on>3.74, 81 on>3,78
if (ADvalue > 74) vcc50=1; else vcc50=0; //74 on>3.48, 73 on>3.43V
if (ADvalue > 68) vcc25=1; else vcc25=0; //68 on>3.22, 66 on>3.13, 67 on >3.17
// if (ADvalue > 62) vcc25=1; else vcc25=0; //62 on>2.95
__delay_ms(5);
while (GO_DONE); //polling for conversion completion
__delay_ms(5);
ANSEL = 0b01100000; // ANS0 as ouput, Frc (internal clk for Tad)
TRISIO = 0b00000000;
} else ADtime--;
// if(ADtime==254) GO_DONE=1;
//TRISIO = 0b00000000;
__delay_ms(4);
if (vcc100==1){GP0=0;GP1=0;GP2=1;}
__delay_ms(2);
if (vcc75==1) {GP0=1;GP1=1;GP2=0;}
__delay_ms(2);
if (vcc50==1) {GP0=1;GP1=0;GP2=0;}
__delay_ms(2);
if (vcc25==1) {GP0=0;GP1=1;GP2=1;}
__delay_ms(4);
//TRISIO = 0b00000000;
//__delay_ms(1);
//GO_DONE=1;
//SLEEP();
}
//----------------------------------------------------------------------------
} //end
asi ked to vojde do tej AD slucky tak to zacne blbnut
Přepínat neustále jeden pin jako analogový vstup vs. digitální výstup je nesmysl. Jaká je výsledná / požadovaná funkce toho zařízení? Analyzuješ to, nebo navrhuješ? Můj názor je vzít větší PIC, rozdělit ty “kumulace” na pinech a obsluhovat to normálně, ušetříš kousek svého života pro něco lepšího…
Schema je dana, tak to niekto navrhol, chcem tam iny soft. S inou funkcionalitou.
Co je GO_DONE a kde se shazuje na 0, aby smyčka skončila a program mohl pokračovat dál ?
To by mal byt bit v registri od AD previdnika. Kednskonci prevod, vynuluje sa.
Díky. S PICama nedělám a z hlediska Cčka jsem tam nenašel ani deklaraci ani nulování.
Že to tak někdo navrhl není žádné ospravedlnění, jen výmluva. Jestli to chceš udělat pořádně, je třeba to předělat. D8 je přes ten tranzistor jen obrovská kontrolka stisknutí resetu a nikdy nic jiného nebude, máš v konfiguraci /MCLR ON (a tak je to správně, vypnout si /MCLR bývá často problémové).
Proč jsem se ptal: Dělal jsem kdysi ve firmě která dělala pro Lidl, a tohle mi tam nikam nepasuje. Co a obsluha čeho to má být??
Preco reset to zobudi z sleep rezimu, tam som zatial nedosiel. Je to lidl lampa s 3 zdrojmi svetla.
Co na to říct
PIC12F683 je tam proto, že má PWM, kterou v programu nikde neobsluhuješ atd. a která je vyvedená na pin GP2, kde máš připojené zřejmě kontrolky v té variaci na charlieplex. Buď jsi špatně maloval, nebo je to celé blbě.
Vyfoť to.
Na V+ a V- je baterie? Mrknu na to pak v klidu doma, teď jsem v práci, ale není vidět, co je na DPS za tím led modulem, a hlavně - je to určitě PIC? Ta deska je celá čínská, můžeš prosímtě ten U2 vyfotit tak, aby na něm byl vidět popis?
Zasadne to ma zbruseny popis ako maju cinania v zvyku, ja nikde netvrdim ze je tam pic, to tam chcem dat ja.
BT je baterka, V je napajanie 5V z nabijacky.
Jasně, to si totiž myslím od začátku. Na tvém místě bych tam dal breakboard a na něj něco 14pin, nejspíš PIC16F676, případně něco novějšího (PIC16F1703,1704,1705 nebo PIC16F1503). To zapojení je totiž pro přímou záměnu za PIC poměrně nevhodné. Podařit se ti to může, ale jednak za cenu jistých omezení, a jednak s jiným PICem, ne s 12F683 - musel by to být 12F1501, tam jsi totiž schopen si I/O nakonfigurovat tak, abys využil jak ADC, tak PWM.
Bylo by ale dle mého názoru lepší to zapojení předělat, použít jen napájení a to tlačítko, a zbytek vyvést z breakboardu. Dalo by ti to víc možností, třeba líp si pohlídat baterku. Mimochodem, jestli to má Li-ion baterku, tak to rozdělení co máš v programu ti nebude stačit, musíš hlídat přímo napětí. V jakém rozsahu záleží na té baterii, obvykle to bývá od 3 - 3,2 V až do 4 - 4,2 V (podle kvality a toho, jak na ni chceš být náročný). Nabíjení Li-Ion není úplná legrace, ale soudím, že na to tam je ten druhý čip.
A co mas tym PWM stale?
S tím PWM mám to, že jsi tam chtěl dát 12F683, který ho má, a ne třeba 12F629/675, které ho nemají a jsou levnější. Pokud ne, máš tip na tuning (a za ještě levněji).
Ještě jsem se na to díval: Největší zádrhel, a to neřešitelný, máš na GP3 /MCLR, potřeboval bys mít v konfiguraci /MCLR OFF a budit MCU přes Interrupt on Change, jenže zrovna na GP3 je ti to prd platné, protože tento vstup nelze přepnout na výstup, kvůli funkci /MCLR (ať už zaplé, nebo vyplé, to je jedno, je to v návrhu čipu). Jinak by to šlo, kupodivu i s tím charlieplexem sdíleným s A/D, když bys přepínal na vstupy během měření všechno, ne jen jeden pin (abys z výstupního pinu přes odpor a LED neměl ovlivněno měření A/D převodníku). Takže jen kvůli tomu GP3 to nejsi schopen udělat přímou záměnou čipu, neměl bys jak sepnout ten tranzistor. Je na to takový hack, tranzistor jde sepnout zapnutím weak pull-upu, ale to by musel být NPN tranzistor, a ty máš zrovna PNP.
Edit: Teda podle toho, co jsi tam namaloval… Ještě jsem se na to mrknul, a ten “3401” je AO3401 a je to P-MOSFET