|
- 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.
Ez egy nagyon találékony megoldás!
A másik, talán kicsivel egyszerûbb megoldás, hogy eleve kapcsolót használunk (tehát nem push-buttont), megnyomjuk a szimuláció "pause" gombját, és átbillentyjük a két kapcsolót. Utána meg folytatjuk a szimulációt. A szimulált elektronika/program ezt egyszerre gombnyomásnak veszi. Majd ugyanezt visszafelé is eljátszani, esetleg töréspont a programban amikor beugrott a gombkezelésbe. A hozzászólás módosítva: Jan 16, 2022
Szép napot, segitséget szeretnék kérni mert valamiért nem sikerül felprogramozni a Pic10f200 mcu. Pickit3 próbálkozom de nem sikerül, képet tudok mutatni oscal hiba van
Tools menü -> OSCCAL -> Auto Regenerate
cCsak set manual van , és oda men nem tudom mit kell irni . A hozzászólás módosítva: Jan 18, 2022
Moderátor által szerkesztve
Sziasztok! Be uÜzemeltem egy P icIC-cel vezérelt rel eÉkapcsol aÁst. Először egy hétig 3 db ceruzaelemmel m uŰk oÖdtettem és hibátlanul működött. Most v eÉgleges iÍtettem egy 230 V-os t oÖlt oŐvel, ami 6,12 V-t ad ki és utána kötöttem egy 7805 feszültség stabiliz aÁtort. Szépen kijön bel oŐle a stabil 4,97 V. De az történik, hogy néha hiba nélkül lefut a program, néha elindul jól és nem fejezi be rendesen. Ennek lehet az az oka, hogy a 7805-t csak simán bekötöttem (bet aÁp, föld, kiment) és nem használtam kondenz aÁtort?
Köszönöm! A hozzászólás módosítva: Jan 18, 2022
Moderátor által szerkesztve
Igen. A 7805 előtt, és után is kötelező a kondenzátor (adatlap!). A PIC táplábaira is kell 100nF.
A relé mellett van dióda? A hozzászólás módosítva: Jan 17, 2022
Bármilyen áramkor annyira megbízható mint maga a tápellátása!
Felejtős a Idézet: „egy 230 V-os toltovel, ami 6,12 V-t ad ki” .
7805 fő jellemzője hogy legalább +3 Volttal több drop feszültséget kell neki adni.
Ha 78L05 low drop akkor esetleg lehetne 6 Volt.
Persze a stabilizátor maximális disszipációját figyelembe véve növelhető a bemeneti feszültség és az össz terhelő áram.
A 7805 -öt cseréld le egy Low Drop feszültség stabilizátorra. pl. LM2940-5.0, LF50CV, LM1084IT-5.0.
Ez a t iÍpus van berakva: L7805CV. Ez jó lehet 6 V-ra? Vagy 8-9 V-os töltőt haszn aÁljak? (Pedig nagyon stabil kimenő feszt mérek) Tehetek a kimenő oldalra 100 _nF , a bet aÁp oldalra 333 _nF kondikat? (Ezek vannak itthon .)
Közvetlen a PIC t aÁpl aÁbain aÁl van egy 100 nF kondi.
Rel eÉ mellett van di oÓda. A hozzászólás módosítva: Jan 18, 2022
Moderátor által szerkesztve
A gyors és rövid ideig tartó feszültségingadozásokat legfeljebb oszcilloszkóppal lehet megfigyelni.
Intézd úgy, hogy a relé a stabilizátor előtti részről kapjon tápfeszültséget. A stabilizátor előtt legyen 470 - 1000 µF -nyi kondenzátor, a 7805-ös lábaihoz közel, ahogy írod is, 330 nF és 100 nF. A PIC táplábaihoz tegyél még egy 4.7 - 10 µF-os és egy 330 nF-os kondenzátort, segíteni fog. A sorrend a PIC táplábaitól a tápegység felé: 100 nF, 330 nF, 4.7 µF. Arra figyelj, hogy a 7805-ös kimenetére sok kondenzátort nem szabad rakni.
Ha lehet, használj 12 V-os tápegységet és 12 V-os relét.
Vagy.
Használj olyan 5 V-os tápegységet, ami bírja a kimenetén a nagy kondenzátort, azzal csillapítani lehet a relé okozta ingadozásokat és a 7805-ös sem fog kelleni.
Köszönöm. Mivel már a NYÁKlap is készen van, minden beforrasztva, így azt hiszem visszatérek az elemhez és figyelem a merülését .
A PIC10F200 program memóriájában a 0xFF címen az OSCAL kalibrációs érték található egy movlw utasításként. A kontroller törlésekor ez az érték is törlődik, ezért a törlés előtt ki kell olvasni, az új programba bele kell írni.
Ha már törlődött, csak kalibrációval lehet meghatározni az értékét. Azaz movlw 0x00 -val kezdve megmérni az oszcillátor frekvenciáját és az eredmény alapján az értéket növelni, ha a mért érték magas ill. csökkenteni (negatív érték), alacsony volt.
Ha a kód nem érzékeny a sebességre ill. külső oszcillátorral működtetjük a kontrollert, a kalibrációs érték nem érdekes.
Egy movlw utasítás kódja: 0xCxx, ahol az xx helyén a kalibréciós érték van hexadecimálisan.
A PICkit3 kezelő program elavult, sőt csak azért adták ki, mert a Microchip nem készült el időben a PICkit3 szoftverével. Lényegében egy PICkit2 -t csinál a PICkit3 -ból firmware cserével. Csak gond lesz belőle.
Az MpLab X -beli IPE programot jevesolt használni. A hozzászólás módosítva: Jan 18, 2022
Sziasztok!
Tudnátok segíteni, hogy az LCD-re miért nem írja ki a "k" értékét? Szerintem az LCD iniciálásánál lehet a probléma az LCD_PORT-nál. Nem igazán értem, hogy ott mit kellene megadni.
Köszönöm!
#include <xc.h>
//#include <stdio.h>
//#include <string.h>
//#include <stdlib.h>
//#define _XTAL_FREQ 4000000 ;
#pragma config FOSC = INTOSCIO // Oscillator ion bits (RC oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#pragma config MCLRE = ON
#pragma config LVP = OFF
#define bgomb PORTBbits.RB2
#define jobbgomb PORTBbits.RB1
#define oragomb PORTAbits.RB0
#define valtas PORTAbits.RA7
#define __delay_ms(x) _delay((unsigned long)((x)*(4000000/4000.0)))
// set up the timing for the LCD delays
#define LCD_delay 5 // ~5mS
#define LCD_Startup 15 // ~15mS
// Command set for Hitachi 44780U LCD display controller
#define LCD_CLEAR 0x01 // It clears everythings
#define LCD_HOME 0x02 // set the cursor to first line and first row
#define LCD_CURSOR_BACK 0x10 // moves curson one position back
#define LCD_CURSOR_FWD 0x14 //moves curson one position forward
#define LCD_PAN_LEFT 0x18 // used to scroll text left side to scroll text
#define LCD_PAN_RIGHT 0x1C // used to scroll text right side to scroll text
#define LCD_CURSOR_OFF 0x0C // stops display curson on screen
#define LCD_CURSOR_ON 0x0E // turns on cursor display
#define LCD_CURSOR_BLINK 0x0F // curson keeps blinking
#define LCD_CURSOR_LINE2 0xC0 // move curson to scond line or second row
// display controller setup commands page 46 of Hitachi datasheet
#define FUNCTION_SET 0x2C // 4 bit interface, 2 lines, 5x10 font
#define ENTRY_MODE 0x06 // increment mode
#define DISPLAY_SETUP 0x0C // display on, cursor off, blink offd
#define LCDLine1() LCDPutCmd(LCD_HOME) // legacy support
#define LCDLine2() LCDPutCmd(LCD_CURSOR_LINE2) // legacy support
#define shift_cursor() LCDPutCmd(LCD_CURSOR_FWD) // legacy support
#define cursor_on() LCDPutCmd(LCD_CURSOR_ON) // legacy support
#define DisplayClr() LCDPutCmd(LCD_CLEAR) // Legacy support
//----------------------------------------------------------------------
// Definitions specific to the PICDEM 2 Plus
// These apply to the Black (2011) version.
//----------------------------------------------------------------------
// single bit for ing command register or data register
#define instr 0
#define data 1
// These #defines create the pin connections to the LCD in case they are changed on a future demo board
#define LCD_PORT PORTBbits.RB4, PORTBbits.RB5,PORTBbits.RB6,PORTBbits.RB7
#define LCD_PWR 1 // LCD power pin
#define LCD_EN PORTBbits.RB3 // LCD enable
#define LCD_RW 0 // LCD read/write line
#define LCD_RS PORTAbits.RA0 // LCD register line
#define NB_LINES 2 // Number of display lines
#define NB_COL 16 // Number of characters per line
void LCD_Initialize(void);
void LCDPutChar(char ch);
void LCDPutCmd(char ch);
void LCDPutStr(const char *);
void LCDWriteNibble(char ch, char rs);
void LCDGoto(char pos, char ln);
unsigned int k=0;
void LCD_Initialize()
{
// clear latches before enabling TRIS bits
LCD_PORT = 0;
TRISB = 0b00000111;
// power up the LCD
//LCD_PWR = 1;
// required by display controller to allow power to stabilize
__delay_ms(LCD_Startup);
// required by display initialization
LCDPutCmd(0x32);
// set interface size, # of lines and font
LCDPutCmd(FUNCTION_SET);
// turn on display and sets up cursor
LCDPutCmd(DISPLAY_SETUP);
DisplayClr();
// set cursor movement direction
LCDPutCmd(ENTRY_MODE);
}
void LCDWriteNibble(char ch, char rs)
{
// always send the upper nibble
ch = (ch >> 4);
// mask off the nibble to be transmitted
ch = (ch & 0x0F);
// clear the lower half of LCD_PORT
LCD_PORT = (LCD_PORT & 0xF0);
// move the nibble onto LCD_PORT
LCD_PORT = (LCD_PORT | ch);
// set data/instr bit to 0 = insructions; 1 = data
LCD_RS = rs;
// RW - set write mode
//LCD_RW = 0;
// set up enable before writing nibble
LCD_EN = 1;
// turn off enable after write of nibble
LCD_EN = 0;
}
void LCDPutChar(char ch)
{
__delay_ms(LCD_delay);
//Send higher nibble first
LCDWriteNibble(ch,data);
//get the lower nibble
ch = (ch << 4);
// Now send the low nibble
LCDWriteNibble(ch,data);
}
void LCDPutCmd(char ch)
{
__delay_ms(LCD_delay);
//Send the higher nibble
LCDWriteNibble(ch,instr);
//get the lower nibble
ch = (ch << 4);
__delay_ms(1);
//Now send the lower nibble
LCDWriteNibble(ch,instr);
}
void LCDPutStr(const char *str)
{
char i=0;
// While string has not been fully traveresed
while (str[i])
{
// Go display current char
LCDPutChar(str[i++]);
}
}
void LCDGoto(char pos,char ln)
{
// if incorrect line or column
if ((ln > (NB_LINES-1)) || (pos > (NB_COL-1)))
{
// Just do nothing
return;
}
// LCD_Goto command
LCDPutCmd((ln == 1) ? (0xC0 | pos) : (0x80 | pos));
// Wait for the LCD to finish
__delay_ms(LCD_delay);
}
/**/
unsigned char t2cnt,mpflag,mpcount,villog, bnyomogomb, bgombold,flag,keycnt,r1cnt,r2cnt,time1=60, time2=30, s,ki, led, max;
void __interrupt() megszak (void)
{
if(PIR1bits.TMR2IF)
{
t2cnt++;
if(t2cnt==10){t2cnt=0;flag |=1;}// lejárt 0,1 sec frissülhet a f?progi
mpcount++ ;
if(mpcount==100){mpcount=0;mpflag = 1;} // lejárt az 1 sec
PIR1bits.TMR2IF=0;
}
}
void main (void)
{
PCONbits.OSCF=1; // a bels? oszc. 4 Mhz
OPTION_REG = 0x55; // Set TMR0 configuration and enable PORTB pullups
INTCON = 0b11000000; // ' Enable global interrupts, Disables all peripheral interrupts, disable timer0 interrupt
CMCON = 0x07 ; // analóg komparátorok kikapcsolva, RA0-1 digitális port!
PORTB = 0b00000111;
TRISA = 0b10000000; // RA0, RA7 port bemenet, relé vagy LED
TRISB = 0b00000111; // RB2 és RB3 bemenet, a többi kimenet
// timer2 beállítása
PR2=249; //timer2 250órajel után ujrakezdi a számolást
T2CON= 0b01001101 ; //4 el?osztó modul on 10 utóosztó
PIE1bits.TMR2IE=1; // tmr2 irq enable
LCD_Initialize();
while(1)
{
if(mpflag)
{
villog = ~villog ; //LED villogtató
mpflag = 0 ;
}
if(flag) // 0.1 sec lejárt f?program frissítése
{
flag=0;
bgombold = bgomb ;
bgomb = bnyomogomb ;
if (bgomb == 0 & bgombold == 1) //lenyomtuk a gombot, magasból alacsony szintre vált a bemenet
{
LCDGoto(3,1);
LCDPutStr(" SLTisztaterter");
}
if(bgomb == 0) //ha még mindig nyomva
{
keycnt++;
if(keycnt>5){led=1;
// rele2=1;
r1cnt++ ; r2cnt++;}
//0.5 secnél led on késleltetés frissítés felfüggesztve
if (keycnt > max) //100x0.1 mp, azaz 10 mp az alap id?, ha ezt túllépjük, akkor növeljük a bekapcsolási id?t
{keycnt = max;
led=0; }
}
if (bgomb == 1 & bgombold == 0) //elengedtük a gombot, alacsonyból magas szintre vált a bemenet
{
if(keycnt>5) //sokáig nyomva volt
{
k==0;
}
k++;
LCDGoto(3,1);
LCDPutStr(" SL Tisztaterte");
if(k<10) LCDPutChar(k+0x30);
else
{LCDPutChar((k/10)+0x30);
LCDPutChar((k%10)+0x30);
}
}
}
}
}
Milyen típusra írtad? ANSEL / ANSELA / ANSELB és a TRISA beállítása hiányzik.
PIC16F627A-ra írtam. Szerintem az LCD Port-nál hibazhatok, de nem tudom, hogy mit kell ott irni. Maga a program még félkész, csak az LCD megjelenítés a kérdés még.
CMCON és a TRISA felprogramozását nem látom. A komparátor modul miatt az RA0 analóg módban marad.
Idézet: „#define LCD_RS PORTAbits.RA0 // LCD register line”
A 231. sorban van a CMCON és a 233. sorban TRISA.
Szia!
Az LCD_PORT PORTBbits.RB4, PORTBbits.RB5,PORTBbits.RB6,PORTBbits.RB7
helyett ,vagyis ahol portra írsz oda inkább a LATxbits.xxx
Az LCD_PORT LATBbits.LATB4, LATBbits.LATB5,LATBbits.LATB6,LATTBbits.LATB7
Sajnos így le se fordul.
De mi a hibaüzenet? Csak nem 1-1-be másoltad le és benne hagytad a végén lévő szintaktikai hibát, ahol a LAT helyett véletlenül LATT van írva?
Nem oktondi módon másoltam.
Ezt írja:
fatal error: too many errors emitted, stopping now [-ferror-limit=]
1 warning and 20 errors generated.
(908) exit status = 1
nbproject/Makefile-default.mk:107: recipe for target 'build/default/production/eredmeny.p1' failed
make[2]: Leaving directory 'C:/Users/Lajos/MPLABXProjects'
nbproject/Makefile-default.mk:91: recipe for target '.build-conf' failed
make[1]: Leaving directory 'C:/Users/Lajos/MPLABXProjects'
make[2]: *** [build/default/production/eredmeny.p1] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
BUILD FAILED (exit value 2, total time: 867ms)
A hozzászólás módosítva: Jan 22, 2022
Szia!
Ha a PORTA és PORTB beállítása megvan és működik a következőkkel lehet még probléma:
LCD_Initialize():
A HD44780 adatlapja szerint a tápfeszültség megérkezése után el kell telnie 15ms -nek.
Az első parancsot még 8 bitesen azaz E pulzussal kell küldeni és meg kell ismételni még kétszer ( az elő után min. 4.1 ms-et, a második után min. 100us -et kell várni). Ezek után mehet a 4 bites mód.
PIC16F877A-an fut ez a megoldás. Én csak a PORT-okat írtam át.
Most csináltam egy olyat, hogy a PORTA-n van az LCD, a gombok a PORTB-n. Mindent lecsupaszítottam, csak a Hello World-t kellene kiírnia, de már ezt se tudja. Nem tudom, mi lehet a baja.
#include <xc.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#pragma config FOSC = INTOSCIO // Oscillator ion bits (RC oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#pragma config MCLRE = ON
#pragma config LVP = OFF
#define bgomb PORTBbits.RB2
#define jobbgomb PORTBbits.RB1
#define oragomb PORTAbits.RB0
#define valtas PORTAbits.RA7
#define __delay_ms(x) _delay((unsigned long)((x)*(8000000/4000.0)))
// set up the timing for the LCD delays
#define LCD_delay 5 // ~5mS
#define LCD_Startup 15 // ~15mS
// Command set for Hitachi 44780U LCD display controller
#define LCD_CLEAR 0x01 // It clears everythings
#define LCD_HOME 0x02 // set the cursor to first line and first row
#define LCD_CURSOR_BACK 0x10 // moves curson one position back
#define LCD_CURSOR_FWD 0x14 //moves curson one position forward
#define LCD_PAN_LEFT 0x18 // used to scroll text left side to scroll text
#define LCD_PAN_RIGHT 0x1C // used to scroll text right side to scroll text
#define LCD_CURSOR_OFF 0x0C // stops display curson on screen
#define LCD_CURSOR_ON 0x0E // turns on cursor display
#define LCD_CURSOR_BLINK 0x0F // curson keeps blinking
#define LCD_CURSOR_LINE2 0xC0 // move curson to scond line or second row
// display controller setup commands page 46 of Hitachi datasheet
#define FUNCTION_SET 0x2C // 4 bit interface, 2 lines, 5x10 font
#define ENTRY_MODE 0x06 // increment mode
#define DISPLAY_SETUP 0x0C // display on, cursor off, blink offd
#define LCDLine1() LCDPutCmd(LCD_HOME) // legacy support
#define LCDLine2() LCDPutCmd(LCD_CURSOR_LINE2) // legacy support
#define shift_cursor() LCDPutCmd(LCD_CURSOR_FWD) // legacy support
#define cursor_on() LCDPutCmd(LCD_CURSOR_ON) // legacy support
#define DisplayClr() LCDPutCmd(LCD_CLEAR) // Legacy support
// single bit for ing command register or data register
#define instr 0
#define data 1
// These #defines create the pin connections to the LCD in case they are changed on a future demo board
#define LCD_PORT PORTA
#define LCD_PWR 1 // LCD power pin
#define LCD_EN PORTAbits.RA6 // LCD enable
#define LCD_RW 0 // LCD read/write line
#define LCD_RS PORTAbits.RA4 // LCD register line
#define led PORTAbits.RA7
#define NB_LINES 2 // Number of display lines
#define NB_COL 16 // Number of characters per line
void LCD_Initialize(void);
void LCDPutChar(char ch);
void LCDPutCmd(char ch);
void LCDPutStr(const char *);
void LCDWriteNibble(char ch, char rs);
void LCDGoto(char pos, char ln);
unsigned int k=0;
/**/
unsigned char t2cnt,mpflag,mpcount,villog, bnyomogomb, bgombold,flag,keycnt,r1cnt,r2cnt,time1=60, time2=30, s,ki, max;
void main (void)
{
PCONbits.OSCF=1; // a bels? oszc. 4 Mhz
OPTION_REG = 0x55; // Set TMR0 configuration and enable PORTB pullups
CMCON = 0x07 ; // analóg komparátorok kikapcsolva, RA0-1 digitális port!
PORTB = 0b00000111;
PORTA = 0;
TRISA = 0b00000000; // RA0, RA7 port bemenet, relé vagy LED
TRISB = 0b00001111; // RB2 és RB3 bemenet, a többi kimenet
LCD_Initialize();
while(1)
{
LCDPutStr(" Hello World!");
__delay_ms(3000);
}
}
void LCD_Initialize()
{
// clear latches before enabling TRIS bits
LCD_PORT = 0;
TRISA = 0b00000000;
// power up the LCD
//LCD_PWR = 1;
// required by display controller to allow power to stabilize
__delay_ms(LCD_Startup);
// required by display initialization
LCDPutCmd(0x32);
// set interface size, # of lines and font
LCDPutCmd(FUNCTION_SET);
// turn on display and sets up cursor
LCDPutCmd(DISPLAY_SETUP);
DisplayClr();
// set cursor movement direction
LCDPutCmd(ENTRY_MODE);
}
void LCDWriteNibble(char ch, char rs)
{
// always send the upper nibble
ch = (ch >> 4);
// mask off the nibble to be transmitted
ch = (ch & 0x0F);
// clear the lower half of LCD_PORT
LCD_PORT = (LCD_PORT & 0xF0);
// move the nibble onto LCD_PORT
LCD_PORT = (LCD_PORT | ch);
// set data/instr bit to 0 = insructions; 1 = data
LCD_RS = rs;
// RW - set write mode
//LCD_RW = 0;
// set up enable before writing nibble
LCD_EN = 1;
// turn off enable after write of nibble
LCD_EN = 0;
}
void LCDPutChar(char ch)
{
__delay_ms(LCD_delay);
//Send higher nibble first
LCDWriteNibble(ch,data);
//get the lower nibble
ch = (ch << 4);
// Now send the low nibble
LCDWriteNibble(ch,data);
}
void LCDPutCmd(char ch)
{
__delay_ms(LCD_delay);
//Send the higher nibble
LCDWriteNibble(ch,instr);
//get the lower nibble
ch = (ch << 4);
__delay_ms(1);
//Now send the lower nibble
LCDWriteNibble(ch,instr);
}
void LCDPutStr(const char *str)
{
char i=0;
// While string has not been fully traveresed
while (str[i])
{
// Go display current char
LCDPutChar(str[i++]);
}
}
void LCDGoto(char pos,char ln)
{
// if incorrect line or column
if ((ln > (NB_LINES-1)) || (pos > (NB_COL-1)))
{
// Just do nothing
return;
}
// LCD_Goto command
LCDPutCmd((ln == 1) ? (0xC0 | pos) : (0x80 | pos));
// Wait for the LCD to finish
__delay_ms(LCD_delay);
}
Ez a program is 4 bitesen kezeli az LCD már az első parancs kiadásakor is. Kellene egy
void LCDPutCmd8(char ch) eljárás, ami a felső nibblet írja ki, de csal egy E pulzust csinál. Ezt kellene meghívni háromszor, köztük az előírt időnék egy kicsit többet várva.
Bekapcsolás után és a program lefuttatása nélkül a kontrasztot tekergetve látszanak a teli karakterek az első sorban? A hozzászólás módosítva: Jan 23, 2022
De miért lehet, hogy ez így működik a 877A PIC-cel?
Ezt próbáld ki, hátha:
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define _XTAL_FREQ (4000000)
#include <xc.h>
#define RS RA1
#define EN RA0
#define D4 RA7
#define D5 RA6
#define D6 RB7
#define D7 RB6
#define ROWCNT 2 //1, 2, 4
#define COLCNT 16 //16, 20, 40
void lcd_rawsend(uint8_t in, uint8_t mask) {
uint8_t pt;
RS = 0;
EN = 0;
D4 = 0;
D5 = 0;
D6 = 0;
D7 = 0;
pt = ((in >> 4) & 0x0F);
if (pt & 0x01) {
D4 = 1;
}
if (pt & 0x02) {
D5 = 1;
}
if (pt & 0x04) {
D6 = 1;
}
if (pt & 0x08) {
D7 = 1;
}
if (mask) {
RS = 1;
}
__delay_us(100);
EN = 1;
__delay_us(100);
EN = 0;
pt = (in & 0x0F);
__delay_us(100);
D4 = 0;
D5 = 0;
D6 = 0;
D7 = 0;
RS = 0;
EN = 0;
if (pt & 0x01) {
D4 = 1;
}
if (pt & 0x02) {
D5 = 1;
}
if (pt & 0x04) {
D6 = 1;
}
if (pt & 0x08) {
D7 = 1;
}
if (mask) {
RS = 1;
}
__delay_us(100);
EN = 1;
__delay_us(100);
EN = 0;
__delay_us(100);
}
void lcd_clear(void) {
lcd_rawsend(0x01, 0); //display clear
__delay_ms(2);
lcd_rawsend(0x02, 0); //cursor to 0;0
__delay_ms(2);
}
void lcd_start(void) {
D4 = 0;
D5 = 0;
D6 = 0;
D7 = 0;
RS = 0;
EN = 0;
__delay_ms(12);
lcd_rawsend(0x33, 0);
__delay_ms(2);
lcd_rawsend(0x33, 0);
__delay_ms(2);
lcd_rawsend(0x33, 0);
__delay_ms(2);
lcd_rawsend(0x2C, 0);
__delay_ms(2);
lcd_rawsend(0x06, 0);
__delay_ms(2);
lcd_rawsend(0x0C, 0);
__delay_ms(2);
lcd_clear();
}
void lcd_printascii(uint8_t character) {
lcd_rawsend(character, 0x10);
}
void lcd_command(uint8_t in) {
lcd_rawsend(in, 0);
__delay_ms(2);
}
void lcd_cursor(uint8_t x, uint8_t y) {
#if (ROWCNT == 1)
y = 0x80;
#endif
#if (ROWCNT == 2)
if (y == 0) {
y = 0x80;
} else {
y = 0xC0;
}
#endif
#if (ROWCNT == 4)
if (y == 0) {
y = 0x80;
} else if (y == 1) {
y = 0xC0;
}
#if (COLCNT == 16)
else if (y == 2) {
y = 0x90;
} else {
y = 0xD0;
}
#endif
#if (COLCNT == 20)
else if (y == 2) {
y = 0x94;
} else {
y = 0xD4;
}
#endif
#endif
lcd_rawsend(y + x, 0);
__delay_ms(2);
}
void lcd_printnumber(int16_t number) {
signed int tmp_int;
uint8_t tmp_byte;
if (number < 0) {
lcd_rawsend('-', 0x10);
number = 0 - number;
}
tmp_int = number;
if (number >= 10000) {
tmp_byte = tmp_int / 10000;
lcd_rawsend('0' + tmp_byte, 0x10);
while (tmp_byte > 0) {
tmp_int = tmp_int - 10000;
tmp_byte--;
}
}
if (number >= 1000) {
tmp_byte = tmp_int / 1000;
lcd_rawsend('0' + tmp_byte, 0x10);
while (tmp_byte > 0) {
tmp_int = tmp_int - 1000;
tmp_byte--;
}
}
if (number >= 100) {
tmp_byte = tmp_int / 100;
lcd_rawsend('0' + tmp_byte, 0x10);
while (tmp_byte > 0) {
tmp_int = tmp_int - 100;
tmp_byte--;
}
}
if (number >= 10) {
tmp_byte = tmp_int / 10;
lcd_rawsend('0' + tmp_byte, 0x10);
while (tmp_byte > 0) {
tmp_int = tmp_int - 10;
tmp_byte--;
}
}
lcd_rawsend('0' + tmp_int, 0x10);
}
void lcd_printstring(char * str) {
uint8_t idx = 0;
for (idx = 0; str[idx] != 0; idx++) {
lcd_rawsend(str[idx], 0x10);
}
}
void lcd_clearline(uint8_t line) {
uint8_t count;
uint8_t rowcount;
#if (ROWCNT == 1)
rowcount = 80;
#endif
#if (ROWCNT == 2)
rowcount = 40;
#endif
#if (ROWCNT == 4)
#if (COLCNT == 16)
rowcount = 16;
#endif
#if (COLCNT == 20)
rowcount = 20;
#endif
#endif
lcd_cursor(0, line);
for (count = 0; count < rowcount; count++)
lcd_rawsend(' ', 0x10);
lcd_cursor(0, line);
}
void lcd_ramwrite(uint8_t nIdx, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7) {
lcd_rawsend(64 + (nIdx << 3), 0);
__delay_ms(2);
lcd_rawsend(d0, 0x10);
lcd_rawsend(d1, 0x10);
lcd_rawsend(d2, 0x10);
lcd_rawsend(d3, 0x10);
lcd_rawsend(d4, 0x10);
lcd_rawsend(d5, 0x10);
lcd_rawsend(d6, 0x10);
lcd_rawsend(d7, 0x10);
lcd_clear();
}
void main(void) {
CMCON = 0x07; // analóg komparátorok kikapcsolva
TRISA = 0b00111100;
TRISB = 0b00111111;
lcd_start();
lcd_printstring("Hello!");
while (1) {
}
}
Köszönöm szépen, hogy ezt megirtad. Holnap kipróbálom. Nem sokat értek belőle. Ha számot akarok kiíratni, akkor azt ezzel tegyem:lcd_printnumber(int16_t number) ?
Igen. -32768 - 32767 között működik, kurzor adott pozíciójánál kezdi. Pl.:
lcd_printnumber(-243);
Köszönöm nagyon hasznos volt! Összehasonlítottam az én programommal, sok minden érthetővé vált és rájöttem a hibára. Az RS az RA4 tűn volt, ami nem tud magasba kapcsolni. Áttettem az RA7-re és működik!
Köszönöm még egyszer!
|
|