Fórum témák
- • Li-Ion saját akkucsomag készítése
- • Érdekességek
- • Analóg oszcilloszkóp javítása
- • Elektromos távirányítós kapunyitó
- • Számítógép hiba, de mi a probléma?
- • Kaputelefon
- • Transzformátor készítés, méretezés
- • LED szalag
- • Villanypásztor
- • CNC építése házi alkatrészekből az alapoktól
- • Kondenzátor
- • Arduino
- • Videomagnó problémák
- • Sprint-Layout NYÁK-tervező
- • IMI villanymotor
- • Digitális adatátvitel
- • Mosogatógép hiba
- • Nagyfeszültségű tápegység
- • 3-fázisú Modbus-os teljesítményszabályzó (SCR power controller)
- • Rádióamatőrök topikja
- • Elfogadnám, ha ingyen elvihető
- • Erősítő mindig és mindig
- • Villanyszerelés
- • TDA7294 végerősítő
- • Klíma szervizelés, javítás
- • Klíma beszerelése, fűtés-hűtés házilag
- • Kombikazán működési hiba
- • Általános antennás kérdések, válaszok
- • Dobozolási technikák, műszerdobozok
- • Elektronikai témájú könyvek újságok
- • Elektromos vezérlésű pneumatika
- • Hangszórójavítás (otthon)
- • Internetes rádióvevő
- • Alternativ HE találkozó(k)
- • 3D nyomtatás
- • Felajánlás, azaz ingyen elvihető
- • Akkumulátor töltő
- • Háromfázisú aggregátor
- • Szintetizátor javítás
- • Boombox javítás
- • Sütő javítás
- • Mosógép vezérlők és általános problémáik
- • Laptop javítás, tuning
- • Autós erősítős kérdések, problémák
- • Mikrohullámú sütő javítás, magnetron csere, stb.
- • Villanymotor
- • Vegyes barkácsfogások
- • Digitális óra
- • Hűtőgép probléma
- • TV hiba, mi a megoldás?
- • Szünetmentes táp javítása, élesztése
- • Erősítő építése elejétől a végéig
- • Műhelyünk felszerelése, szerszámai
- • Függvénygenerátor építése
- • SMD, mi a típusa?
» Több friss téma
|
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Köszönöm, könyvjelzőztem is
Sziasztok!
Segítséget szeretnék kérni! PIC18f46k80 pic-kel szeretnék egy rendszert működtetni. A pic belső RC oszcillátorról működne 16Mhz-en. A program mikroc-ben íródik.
//Timer0
//Prescaler 1:64; TMR0 Preload = 3036; Actual Interrupt Time : 1
//Place/Copy this part in declaration section
void InitTimer0(){
T0CON = 0x85;
TMR0H = 0x0B;
TMR0L = 0xDC;
GIE_bit = 1;
TMR0IE_bit = 1;
}
void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0H = 0x0B;
TMR0L = 0xDC;
//ezt kell csinálnia
PORTD.RD0= ~PORTD.RD0;
}
}
void main()
{
TRISA=63; //kezdetben a 0. láb és az 1. láb input, majd induláskor a begyujtás miatt output vagyis TRISA=60
TRISB=224; // az 5,6,7 lábak áramfigylő bemenetek lesznek, a többi láb motorvezérlő kimenet
TRISC=0; // minden láb kimenet
TRISD=0; //minden láb kimenet
TRISE=9; //az 1. és a 4. láb bemenet a többi kimenet. a 4. láb vagy analóg bemenet vagy digitális
Portd.RD0=0;
Portc.RC6=0;
Portc.RC1=1;
InitTimer0();
}
Megszakításban, az RD0 bitnek szekundumonként felváltva kéne 0 és 1 között billegnie.
Ezzel szemben az RD0 kb 3 s-ig 0-ban van, majd átvált 1-be és úgy marad. Az RC6 viszont nem vált nullára és az RC1 sem vált 1-re. Olyan mintha nem is menne az oszcillátor, de akkor miért van 1 váltás az RD0-án. A hozzászólás módosítva: Dec 5, 2018
A program ciklikusan újra és újra végrehajtja az inicializálásokat. Tegyél a main() -be az InitTimer0() utánra egy végtelen ciklust.
Szia!
Ezt csináltam, ha erre gondoltál:
//Timer0
//Prescaler 1:64; TMR0 Preload = 3036; Actual Interrupt Time : 1
//Place/Copy this part in declaration section
void InitTimer0(){
T0CON = 0x85;
TMR0H = 0x0B;
TMR0L = 0xDC;
GIE_bit = 1;
TMR0IE_bit = 1;
}
void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0H = 0x0B;
TMR0L = 0xDC;
//ezt kell csinálnia
PORTD.RD0= ~PORTD.RD0;
}
}
void main()
{
TRISA=63; //kezdetben a 0. láb és az 1. láb input, majd induláskor a begyujtás miatt output vagyis TRISA=60
TRISB=224; // az 5,6,7 lábak áramfigylő bemenetek lesznek, a többi láb motorvezérlő kimenet
TRISC=0; // minden láb kimenet
TRISD=0; //minden láb kimenet
TRISE=9; //az 1. és a 4. láb bemenet a többi kimenet. a 4. láb vagy analóg bemenet vagy digitális
PORTD.RD0=0;
PORTC.RC6=0;
PORTC.RC1=1;
InitTimer0();
while(1);
}
Maradt minden a régiben.
Miért PORT? Ennek van LAT regisztere, használd azt. A PORT nem megbízható kimenetvezérlésshez ha terhelt. Analóg funkciót nem néztem meg, de az nincs egyiken sem véletlenül? Alapból az dominál ha nem kapcsolod ki. A hozzászólás módosítva: Dec 5, 2018
Szia!
Átírtam
//Pic18f46k80 belső RC oszcillátor 16Mhz
//Timer0
//Prescaler 1:64; TMR0 Preload = 3036; Actual Interrupt Time : 1
//Place/Copy this part in declaration section
void InitTimer0(){
T0CON = 0x85;
TMR0H = 0x0B;
TMR0L = 0xDC;
GIE_bit = 1;
TMR0IE_bit = 1;
}
void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0H = 0x0B;
TMR0L = 0xDC;
//ezt kell csinálnia
LATD.RD0= ~LATD.RD0;
}
}
void main()
{
TRISA=63; //kezdetben a 0. láb és az 1. láb input, majd induláskor a begyujtás miatt output vagyis TRISA=60
TRISB=224; // az 5,6,7 lábak áramfigylő bemenetek lesznek, a többi láb motorvezérlő kimenet
TRISC=0; // minden láb kimenet
TRISD=0; //minden láb kimenet
TRISE=9; //az 1. és a 4. láb bemenet a többi kimenet. a 4. láb vagy analóg bemenet vagy digitális
LATD.RD0=0;
LATC.RC6=0;
LATC.RC1=1;
InitTimer0();
while(1);
}
most billeg de az RC6 és az RC1 nem veszi föl a kijelölt állapotot. Az RD0-án az állapotváltozás
1.9 sec körüli.
Az RC1 az igazából RD1, vagyis rossz helyre küldtem a parancsot.
viszont a fél periodus idő az változatlan 1,9 s.
Tehát rezgés van.
Neked HF-INTOSC beállítás kell az Oszcillátor beállításánál. OSCCON regisztert nem állítottad be sehol! Ezen belül az IRCF<2:0> = 111 esetén lesz 16MHz-ed.
Interrupt Flag-et közvetlenül az interrupt-ból való kilépés előtt törlünk!
void Interrupt() {
if (TMR0IF_bit) {
//ezt kell csinálnia
PORTD.RD0 = ~PORTD.RD0;
TMR0H = 0x0B;
TMR0L = 0xDC;
TMR0IF_bit = 0;
}
}
Mikroc-ben nem a kódban van az osc beállítás ha jól tudom, bár lehet azt is kezeli. Az IDE-ben kell beállítani. A hozzászólás módosítva: Dec 6, 2018
Kétlem. Eddig olyannal még nem találkoztam, hogy az OSCCON-t is az IDE kezelne, hisz az csak egy regiszter. Abból az ablakból ítélve, amit mutatott, az IDE csak a Config bit-eket állítja be.
Én MikroPascalozok ugyan de az IDE beállítja au oszcillátór típusát ( pl.belső oszcillátorra) De a konkrét frekvenciát én mindig kódból OSCON -al állítom be.
Részlet egy UH távmérőből:
program UH_Tav_mero;
uses MyUnit_meres , MyUnit_LCD ;
{ LCD Deklaráció }
var LCD_RS : sbit at RC2_bit;
var LCD_EN : sbit at RC3_bit;
var LCD_D4 : sbit at RC4_bit;
var LCD_D5 : sbit at RC5_bit;
var LCD_D6 : sbit at RC6_bit;
var LCD_D7 : sbit at RC7_bit;
var LCD_RS_Direction : sbit at TRISC2_bit;
var LCD_EN_Direction : sbit at TRISC3_bit;
var LCD_D4_Direction : sbit at TRISC4_bit;
var LCD_D5_Direction : sbit at TRISC5_bit;
var LCD_D6_Direction : sbit at TRISC6_bit;
var LCD_D7_Direction : sbit at TRISC7_bit;
var tavolsag : dword;
txt : array[4] of char;
var MertEgyseg , MerCyc : word;
begin { Main program }
OSCCON.IRCF0 := 1 ; // belsõ oszcillátor 8 MHz
ANSEL := 0; // analóg bemenet tiltása
ANSELH := 0 ; // analóg bemenet tiltása
Így van! Máshogy nem is lehet szerintem.
Logikus, csak emlékezetből írtam. Egyszer volt a gépemen és mintha úgy rémlene, hogy a frekvenciát is be lehetett állítani, én is csak ember vagyok. Majd a megmondja aki használja.
Sziasztok!
Ismét problémába ütköztem! Változatlanul a PIC18F46k80 a problémás darab. A megszakításból szépen villog a led, viszont nem kel életre az LCD. 4 soros LCD-n szeretnék megjelentetni adatokat, de ő nem akarja.
//Pic18f46k80 belső RC oszcillátor 16Mhz
// LCD module connections
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module connections
/*hőmérsékleti változók*/
short int kazanvize,kazanvizv,fust,efust,fustalap,szobaalap,viz,eviz,vizalap; //8 bites egész
szám
int tuz,etuz,tuzalap; //16 bites egész
szám
float szoba,eszoba,kulsoho,kornyezetiho; //32 bites
lebegőpontos szám
/*hőmérsékleti változók vége*/
//működtető válozók
short int meresi_ido;
float beadagolasi_ido,beagolas_szunet;
int i; //ciklusokban használt egész változó
//LCD kiíratás sorai
//12345678901234567890
char txt1[] = "Fü:230C >230C Ve:70%";
char txt2[] = "Tű:450C >450C Kulso";
char txt3[] = "B:23.5C >23.5C ho";
char txt4[] = "Viz:68C?>68C -1 5.5C";
//Timer0
//Prescaler 1:64; TMR0 Preload = 3036; Actual Interrupt Time : 1
//Place/Copy this part in declaration section
void InitTimer0(){
T0CON = 0x85; //megszakítási idő 1 sec
TMR0H = 0x0B;
TMR0L = 0xDC;
GIE_bit = 1;
TMR0IE_bit = 1;
}
void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0H = 0x0B;
TMR0L = 0xDC;
//ezt kell csinálnia
LATD.RD0= ~LATD.RD0;
meresi_ido++;
}
}
void uzem()
{
Lcd_Out(1,1,txt1);
Lcd_Out(2,1,txt2);
Lcd_Out(3,1,txt3);
Lcd_Out(4,1,txt4);
}
void main()
{
TRISA=63; //kezdetben a 0. láb és az 1. láb input, majd induláskor a
begyujtás miatt output vagyis TRISA=60
TRISB=224; // az 5,6,7 lábak áramfigylő bemenetek lesznek, a többi láb
motorvezérlő kimenet
TRISC=0; // minden láb kimenet
TRISD=0; //minden láb kimenet
TRISE=9; //az 1. és a 4. láb bemenet a többi kimenet. a 4. láb vagy
analóg bemenet vagy digitális
LATA=0;
LATB=0;
LATC=0;
LATD.RD0=0;
LATD.RD1=0;
InitTimer0();
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
// uzem();
Lcd_Out(1,1,"hol vagy");
Lcd_Out(2,1,txt2);
Lcd_Out(3,1,txt3);
Lcd_Out(4,1,txt4);
delay_ms(1000);
while(1)
{
}
}
Legyetek szívesek segíteni, hol rontottam el? A második és negyedik sorból csak 3 3 sor jelenik meg
karakterenként. Kiírás viszont semmi.
Köszönöm a segítséget! A hozzászólás módosítva: Dec 6, 2018
Hali!
Meg kell nézni a könyvtári?? függvényben az lcdinit milyen parancsokat ad ki,
és az lcdout fuggvény tudja-e a 4 sort kezelni...
Kiindulás HD44780 adatlap...
Sziasztok!
Annyi változás történt, hogy egy lapon találtam hasonló problémára megoldást, amit a mellékelt kód tartalmaz. Vagyis az LCD pic-kel való kapcsolatát a LAT-on keresztül oldja meg, valamint a main részben az oscon regisztert átírja. Van kijelzőre írás, viszont a kijelzőn harmadik sorában van egy karakter ami nincs txt3 kiírandó sorban.
/* kazánvezérlő */
//Pic18f46k80 belső RC oszcillátor 16Mhz
// LCD module connections
sbit LCD_RS at LATD2_bit;
sbit LCD_EN at LATD3_bit;
sbit LCD_D4 at LATD4_bit;
sbit LCD_D5 at LATD5_bit;
sbit LCD_D6 at LATD6_bit;
sbit LCD_D7 at LATD7_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
//működtető válozók
short int meresi_ido;
float beadagolasi_ido,beagolas_szunet;
int i; //ciklusokban használt egész változó
//LCD kiíratás sorai
//12345678901234567890
char txt1[] = "Fu:230C >230C Ve:70%";
char txt2[] = "Tu:450C >450C Kulso";
char txt3[] = "B:23.5C >23.5C ho";
char txt4[] = "Viz:68C >68C -15.5C";
//Timer0
//Prescaler 1:64; TMR0 Preload = 3036; Actual Interrupt Time : 1
//Place/Copy this part in declaration section
void InitTimer0(){
T0CON = 0x84; //megszakítási idő 1 sec
TMR0H = 0x0B;
TMR0L = 0xDC;
GIE_bit = 1;
TMR0IE_bit = 1;
}
void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0H = 0x0B;
TMR0L = 0xDC;
//ezt kell csinálnia
LATD.RD0= ~LATD.RD0;
meresi_ido++;
}
}
void uzem()
{
Lcd_Out(1,1,txt1);
Lcd_Out(2,1,txt2);
Lcd_Out(3,1,txt3);
Lcd_Out(4,1,txt4);
}
void main()
{
// OSCCON bits
IDLEN_bit = 0;
IRCF2_bit = 1; // setup for 8MHz
IRCF1_bit = 1; //
IRCF0_bit = 0; // set all to 1 for 16MHz + PLL = 64MHz korábban=0
OSTS_bit = 0; // running internal OSC
HFIOFS_bit = 0; // read only, 1 = osc stable
SCS0_bit = 0; // System Clock
SCS1_bit = 0; // Primary Clock ed even with internal OSC
// this is to enable the use of PLL
//=============================
//OSCTUNE = 0b01000000; // PLL enabled
//
PLLEN_bit = 1;
//OSCCON2 = 0b10000000;
//PLLRDY_bit;
while(!HFIOFS); // wait for HFINTOSC to be stable
//eddig másoltam
TRISA=63; //kezdetben a 0. láb és az 1. láb input, majd induláskor a begyujtás miatt output vagyis TRISA=60
TRISB=224; // az 5,6,7 lábak áramfigylő bemenetek lesznek, a többi láb motorvezérlő kimenet
TRISC=0; // minden láb kimenet
TRISD=0; //minden láb kimenet
TRISE=9; //az 1. és a 4. láb bemenet a többi kimenet. a 4. láb vagy analóg bemenet vagy digitális
//
PMD2 = 0xFF;
PMD0 = 0xFF;
LATA=0;
LATB=0;
LATC=0;
LATD.RD0=0;
LATD.RD1=0;
InitTimer0();
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
delay_ms(1000);
while(1)
{
uzem(); delay_ms(1000);
}
}
Ellenben a megszakítás megszűnt. Vagyis az RD0- nem változik az állapot.
Sziasztok!
Megoldódott! A main-ből kitöröltem az osccon beállításokat, valamint a PMD regiszterek beállításait. Csak az LCD pic csatlakozás LAT-jai maradtak. Van megszakítás és a kijelzőn csak az van ami txt-ben szerepel.
Sziasztok!
Megint falba ütköztem!
Elindítom programot, ami bejelentkezik az LCD-n az üzem függvényben levő sorokkal. Majd anélkül, hogy megnyomnám a PORTA.RA2-re menő nyomógombot belép az if után levő utasításokra és megjelenik a főmenü az LCD-n és ezt végtelen ciklusban teszi is mert villog 150ms-mal.
/* kazánvezérlő */
//Pic18f46k80 belső RC oszcillátor 16Mhz
// LCD module connections
sbit LCD_RS at LATD2_bit;
sbit LCD_EN at LATD3_bit;
sbit LCD_D4 at LATD4_bit;
sbit LCD_D5 at LATD5_bit;
sbit LCD_D6 at LATD6_bit;
sbit LCD_D7 at LATD7_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
#define ok PORTA.RA2 // nyomógomb program megáll menü előugrik
#define elore PORTA.RA0 //nyomógomb balra visszamozgat számol +
#define vissza PORTA.RA1 //nyomógomb jobbra előremozgat számol
#define PORTA.RA3 //nyomógomb ok
#define start PORTA.RA5 // program futása
//Timer0
//Prescaler 1:64; TMR0 Preload = 3036; Actual Interrupt Time : 1
//Place/Copy this part in declaration section
void InitTimer0(){
T0CON = 0x84; //megszakítási idő 1 sec
TMR0H = 0x0B;
TMR0L = 0xDC;
GIE_bit = 1;
TMR0IE_bit = 1;
}
void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0H = 0x0B;
TMR0L = 0xDC;
//ezt kell csinálnia
LATD.RD0= ~LATD.RD0;
meresi_ido++;
}
}
void uzem()
{
Lcd_Out(1,1,"Fu:230C >230C Ve:70%");
Lcd_Out(2,1,"Tu:450C >450C Kulso");
Lcd_Out(3,1,"B:23.5C >23.5C ho");
Lcd_Out(4,1,"Viz:68C >68C -15.5C");
}
void main()
{
/*
// OSCCON bits
IDLEN_bit = 0;
IRCF2_bit = 1; // setup for 8MHz
IRCF1_bit = 1; //
IRCF0_bit = 0; // set all to 1 for 16MHz + PLL = 64MHz korábban=0
OSTS_bit = 0; // running internal OSC
HFIOFS_bit = 0; // read only, 1 = osc stable
SCS0_bit = 0; // System Clock
SCS1_bit = 0; // Primary Clock ed even with internal OSC
// this is to enable the use of PLL
//=============================
//OSCTUNE = 0b01000000; // PLL enabled
//
PLLEN_bit = 1;
//OSCCON2 = 0b10000000;
//PLLRDY_bit;
while(!HFIOFS); // wait for HFINTOSC to be stable
//eddig másoltam
*/
TRISA=1; //kezdetben a 0. láb és az 1. láb input, majd induláskor a begyujtás miatt output vagyis TRISA=60
TRISB=224; // az 5,6,7 lábak áramfigylő bemenetek lesznek, a többi láb motorvezérlő kimenet
TRISC=0; // minden láb kimenet
TRISD=0; //minden láb kimenet
TRISE=9; //az 1. és a 4. láb bemenet a többi kimenet. a 4. láb vagy analóg bemenet vagy digitális
LATA=0;
LATB=0;
LATC=0;
LATD.RD0=0;
LATD.RD1=0;
InitTimer0();
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
uzem();
delay_ms(1000);
while(1)
{
if (ok==0)
{
delay_ms(150);
Lcd_Cmd(_LCD_CLEAR);
fomenu();
}
}
}
Nem olvastam végig, hogy mi merre van kötve, de az RA2-őn szokott leni analog port is és egy sor ANSEL=0 (vagy ANSEL/ANSELH/ANSELA) ami digitálisra állítaná a portot így a PORT olvasással mindig 0-t fogsz vissza kapni.
Tanács kerüld el a kis betűs define-okat jobban jársz ha pl ilyen szemantikát követsz (mert így két nap múlva is tudni fogod mi az ok), #define BTN_OK PORTA.RA2 (persze ez nem kötelező)
Szia!
Köszi! Valóban az volt a hiba oka, hogy nullázni kellett az ANCON0 és az ANCON1 regisztereket.
Szuperül megy.
Sziasztok!
Így 1 hónap után lett annyi időm, hogy ránézzek erre, és eSDi, a te kódoddal (átírva a PPS-eket, hogy az RC3-4-et használja) működésre tudtam bírni. Ebből adódóan megállapítottam a hibám; az MSSP modul PPS-e ki lett választva a RC3-4-nek, de a lábak PPS-e nem lett és ez okozta a gondot.
Köszönöm !
(#) |
Auf hozzászólása |
Dec 8, 2018 |
|
/ |
|
|
Sziasztok!
16 bites chipnél C nyelven, hogyan csinálnátok két float különbségéből signed char-t? A két float értéke nem sokban tér el egymástól, így a kivonás eredménye egy előjeles kis értékű szám. A kis értéket, az eltérést kellene egy 8 bites előjeles számon ábrázolnom. Valahogyan így gondoltam:
float a = 3,86, b = 3,88, c = 3,85;
signed char d = 0;
a - b = - 0,02 -->
d = -2;
a - c = + 0,01 -->
d = 1
Sajnos már nem tudok elszakadni a megvalósítás legbonyolultabb módjainak gondolataitól. Beállt az agyam egy nézőpontra és nem tudok kizökkenni másik irányba.
Minden segítséget örömmel fogadok. Hasonló megoldások is érdekelnek.
Ebbe én is belefutottam, nem volt egyértelmű a dolog. Tízszer biztos átolvastam ezt a részt az adatlapban. Aztán 18F4550-en szintén nem működött pár hete, pedig ott nincsenek ilyen kacifántok. Mire rájöttem, hogy bemenetnek kell állítani azt a két lábat. Pedig ez is le volt írva.
d = (signed char)(100.0 * (a - b));
Sziasztok!
A PIC18F46k80 adatlapján az szerepel, hogyha az RE3 lábat digitális bemenetként szeretném használni
akkor a CONFIG3H regiszter 7. bitjét törölni kell. Ezt az edit projectben tudom megtenni, meg is történik a váltás, viszont az MCLR tiltás után az RG5 van engedélyezve. Viszont az RE3
nem reagál az 1-ről 0-ra történő változásra. Tenni kell még valamit?
Mindjuk felhúzni 10k-val a tápra, ha még nincs.
Az Errata-ban van említás az olvashatatlan MCLR lábról, 28 lábú kontroller esetén. Nincs kizárva, hogy érvényes a 40 lábú változatokra is...
Szia!
Már korábban leírtam az ezzel kapcsolatos ismereteimet, lényegében ugyanezt. Még feljebb azt is hogy mikroc-ben írom a programot. Csatolok 2 képet.
usane-k írom, hogy van 10K ellenállás.
Rendben. Akkor következő kérdés. Csatolhatnád az idevonatkozó kódot (ami figyeli ezt a lábat) valamint mi alapján látod, hogy nem reagál a változásra? Debuggerben látod, vagy LED-el jelzed ki, stb?
|
|