Mondan Postat Mai 26, 2015 Partajează Postat Mai 26, 2015 Eu m-am lovit de problema asta. UIte aici: http://www.elforum.info/topic/103823-lcd-hd4478-nu-vrea-sa-mearga-in-mikroc/ Nu am primit nici eu raspuns. Cand compilatoarele astea complexe dau astfel de erori, mai bine o iei de la 0 si gata. Spun asa dupa ce am cautat destul despre probema din cazul meu. De ex: http://www.mikroe.com/forum/viewtopic.php?t=21000 // LCD module connectionssbit LCD_RS at RB4_bit;sbit LCD_EN at RB5_bit;sbit LCD_D4 at RB0_PORTB_bit; //change thissbit LCD_D5 at RB1_PORTB_bit; //change thissbit LCD_D6 at RB2_bit;sbit LCD_D7 at RB3_bit; Cineva sugera o forma de genul asta. Oricum chestii pe care nu le-ati fi banuit. In simularea nu am PIC-ul ala, am doar PIC18F4620 Link spre comentariu
Liviu M Postat Mai 26, 2015 Partajează Postat Mai 26, 2015 dar nu inteleg de ce ar fi asa daca nu ai WDT activat. Din partea frantuzeasca inteleg ca ai nedumeriri la ce i-am zis lu' Vlad. Raspunsul e prin data-sheet si suna ceva de genul "creste curentul consumat..." Din partea cu WDT, inteleg ca totusi intrebi de comportamentul de la sfarsitul programului fara bucla infinita. Eu tin minte ca am citit ceva de genul asta si printr-o documentatie de la uChip, da' la o cautare rapida n-am gasit nimic. In cazul compilerului pe care-l folosesc de ani de zile (picc/xc8) raspunsul e mai usor - citeste citatul pe care l-am pus in postul anterior. Link spre comentariu
Mircea Postat Mai 27, 2015 Partajează Postat Mai 27, 2015 Am citit in intregime, de data asta, mesajul tau precedent. Prima oara am renuntat dupa primele paragrafe , textele lungi... Nu am avut si nu am intentia sa contest, doar m-a mirat mesajul tau. E adevarat ca toate programele au bucla necesara si o configurare a registrilor in consecinta. Daca pun programul de mai jos in PIC, dupa ultimul delay de 1sec LCD-ul ramane vesnic gol (de altfel dupa primul delay), nu se reseteaza PIC-ul si, deci, nu reporneste programul. Banuiesc ca la compilatoarele Mikroe nu se aplica textul tau in "Franceza". PS: consumul porneste de pe la 3,5mA (LCD-ul e fara iluminare) si se stabilizeaza apoi pe la 4.2mA. Banuesc ca variatia se datoreaza si multimetrului meu de 10$ la oferta (1 secunda fiind prea putin sa se hotarasca sa afiseze o valoare stabila). Fara WDT activat. PPS: imi e prea lene sa scriu un cod in MPLAB-ul de-l mai am instalat ca sa verific ce zice datasheet-ul. Sa zicem ca ma complac cu compilatorul Mikroe. ' * Test configuration:' MCU: PIC 16f690' Oscillator: INTOSC 8.0000 MHzprogram _16F690_test' LCD setupdim LCD_RS as sbit at RC0_bit LCD_EN as sbit at RC1_bit LCD_D4 as sbit at RC2_bit LCD_D5 as sbit at RC3_bit LCD_D6 as sbit at RC4_bit LCD_D7 as sbit at RC5_bit LCD_RS_Direction as sbit at TRISC0_bit LCD_EN_Direction as sbit at TRISC1_bit LCD_D4_Direction as sbit at TRISC2_bit LCD_D5_Direction as sbit at TRISC3_bit LCD_D6_Direction as sbit at TRISC4_bit LCD_D7_Direction as sbit at TRISC5_bit' Set-up the PICsub procedure InitMain() OPTION_REG = 0x80 ' Pull-up disabled INTCON = 0x00 ' No INT CM1CON0 = 0x00 ' No COMP CM2CON0 = 0x00 ' No COMP CM2CON1 = 0x00 ' No COMP CCP1CON = 0x00 ' No PWM ANSEL = 0x00 ' No Analog Is ANSELH = 0x00 ' No Analog Is PORTA = 0x00 ' Clear PORTA PORTB = 0x00 ' Clear PORTB PORTC = 0x00 ' Clear PORTC TRISA = 0xFF ' All inputs TRISB = 0xF0 ' All inputs TRISC = 0xC0 ' RC0-5 outputs, RC6-7 inputsend submain:' Main program InitMain() Lcd_Init() ' Initialize Lcd Lcd_Cmd(_LCD_CLEAR) ' Clear display Lcd_Cmd(_LCD_CURSOR_OFF) ' Cursor off LCD_Out(1,1, "So, what's next?") LCD_Out(2,1, "hmmm... nothing") Delay_ms(1000) ' Waste 1 sec of my time Lcd_Cmd(_LCD_CLEAR) ' Clear display Delay_ms(1000) ' 1 sec of pure... nothingnessend. Eu m-am lovit de problema asta. UIte aici: http://www.elforum.info/topic/103823-lcd-hd4478-nu-vrea-sa-mearga-in-mikroc/ Nu am primit nici eu raspuns. Cand compilatoarele astea complexe dau astfel de erori, mai bine o iei de la 0 si gata. Spun asa dupa ce am cautat destul despre probema din cazul meu. Dane, pai cum sa primesti raspunsuri daca nu postezi decat: nu merge, am conectat bine totul, trebuie sa reincep? Sincer, tu vrei analiza bazata pe 3 lulele, 3 surcele de informatii furnizate? Link spre comentariu
Vizitator Postat Mai 27, 2015 Partajează Postat Mai 27, 2015 (editat) Salut thunderer, dupa aceasta linie Lcd_Cmd(_LCD_CLEAR) ' Clear displayDelay_ms(1000) ' 1 sec of pure... nothingness ce crezi ca afiseaza afisorul? Nimic. Cu aceasta linie ai cerut sa se stearga orice mesaj pe afisor chiat dupa o secunda dupa afisarea mesajului LCD_Out(2,1, "hmmm... nothing") Delay_ms(1000) Lcd_Cmd(_LCD_CLEAR) Si eu lucrez cu mikroC, ba chiar i-mi place chiar foarte mult -sunt incepator- si am cateva teste cu afisoare. Uite un exemplu: https://www.youtube.com/watch?v=syoYcGleENI&index=3&list=FLez0bK7BJ4BDYgNQwzK6ZRA Dupa-amiaza o sa incerc si eu programul si o sa fac o simulare in ISIS. Editat Mai 27, 2015 de Vizitator Link spre comentariu
Vezi Muti Postat Mai 27, 2015 Partajează Postat Mai 27, 2015 (editat) In cazul particular de mai sus (Basic de la Mikroe) compilatorul adauga in final un "goto $+0". Main() este o functie ca oricare alta, numai ca ea nu este apelata de nimeni (asa cum se intampla in cazul sistemelor de operare). Functie de compilator, se poate intampla sa se restarteze uC , sa se execute la infinit main() sau sa ramana in loop infinit. Este indicat sa pui o bucla de genul while(1) la sfarsitul functiei main. Editat Mai 27, 2015 de Vezi Muti Link spre comentariu
Mircea Postat Mai 27, 2015 Partajează Postat Mai 27, 2015 Salut thunderer, dupa aceasta linie Lcd_Cmd(_LCD_CLEAR) ' Clear display Delay_ms(1000) ' 1 sec of pure... nothingness ce crezi ca afiseaza afisorul? Nimic. Cu aceasta linie ai cerut sa se stearga orice mesaj pe afisor chiat dupa o secunda dupa afisarea mesajului LCD_Out(2,1, "hmmm... nothing") Delay_ms(1000) Lcd_Cmd(_LCD_CLEAR) Am pus secunda de pauza ca, in caz se reseteaza si o ia de la capat, sa am timp sa vad o pauza destul de lunga. Evident ca stiam ca dupa LCD_Clear se sterge totul. Vezi mesajul de mai sus unde zic de asta (citat din mine: dupa ultimul delay de 1sec LCD-ul ramane vesnic gol (de altfel dupa primul delay)) In cazul particular de mai sus (Basic de la Mikroe) compilatorul adauga in final un "goto $+0". Main() este o functie ca oricare alta, numai ca ea nu este apelata de nimeni (asa cum se intampla in cazul sistemelor de operare). Functie de compilator, se poate intampla sa se restarteze uC , sa se execute la infinit main() sau sa ramana in loop infinit. Este indicat sa pui o bucla de genul while(1) la sfarsitul functiei main. Asta e un exemplu de cum sa nu faci, d-aia lipseste bucla infinita. Listing-ul ASM (care dovedeste ce ai zis despre goto $+0), care miscare duce PIC-ul unde? Ca nu mai face nimic: nu reset, nu repetare de Main, ci mai degraba un vesnic NOP. As putea pune o intrebare pe forumul Mikroe. _InitMain:;16F690_enc.mbas,42 :: sub procedure InitMain();16F690_enc.mbas,43 :: OPTION_REG = 0x80 ' Pull-up disabled MOVLW 128 MOVWF OPTION_REG+0;16F690_enc.mbas,44 :: INTCON = 0x00 ' No INT CLRF INTCON+0;16F690_enc.mbas,46 :: CM1CON0 = 0x00 ' No COMP CLRF CM1CON0+0;16F690_enc.mbas,47 :: CM2CON0 = 0x00 ' No COMP CLRF CM2CON0+0;16F690_enc.mbas,48 :: CM2CON1 = 0x00 ' No COMP CLRF CM2CON1+0;16F690_enc.mbas,50 :: CCP1CON = 0x00 ' No PWM CLRF CCP1CON+0;16F690_enc.mbas,52 :: ANSEL = 0x00 ' No Analog Is CLRF ANSEL+0;16F690_enc.mbas,53 :: ANSELH = 0x00 ' No Analog Is CLRF ANSELH+0;16F690_enc.mbas,55 :: PORTA = 0x00 ' Clear PORTA CLRF PORTA+0;16F690_enc.mbas,56 :: PORTB = 0x00 ' Clear PORTB CLRF PORTB+0;16F690_enc.mbas,57 :: PORTC = 0x00 ' Clear PORTC CLRF PORTC+0;16F690_enc.mbas,59 :: TRISA = 0xFF ' All inputs MOVLW 255 MOVWF TRISA+0;16F690_enc.mbas,60 :: TRISB = 0xF0 ' All inputs MOVLW 240 MOVWF TRISB+0;16F690_enc.mbas,61 :: TRISC = 0xC0 ' RC0-5 outputs, RC6-7 inputs MOVLW 192 MOVWF TRISC+0;16F690_enc.mbas,62 :: end subL_end_InitMain: RETURN; end of _InitMain_main:;16F690_enc.mbas,65 :: main:;16F690_enc.mbas,67 :: InitMain() CALL _InitMain+0;16F690_enc.mbas,68 :: Lcd_Init() ' Initialize Lcd CALL _Lcd_Init+0;16F690_enc.mbas,69 :: Lcd_Cmd(_LCD_CLEAR) ' Clear display MOVLW 1 MOVWF FARG_Lcd_Cmd_out_char+0 CALL _Lcd_Cmd+0;16F690_enc.mbas,70 :: Lcd_Cmd(_LCD_CURSOR_OFF) ' Cursor off MOVLW 12 MOVWF FARG_Lcd_Cmd_out_char+0 CALL _Lcd_Cmd+0;16F690_enc.mbas,72 :: LCD_Out(1,1, "So, what's next?") MOVLW 1 MOVWF FARG_Lcd_Out_row+0 MOVLW 1 MOVWF FARG_Lcd_Out_column+0 MOVLW 83 MOVWF ?LocalText_main+0 MOVLW 111 MOVWF ?LocalText_main+1 MOVLW 44 MOVWF ?LocalText_main+2 MOVLW 32 MOVWF ?LocalText_main+3 MOVLW 119 MOVWF ?LocalText_main+4 MOVLW 104 MOVWF ?LocalText_main+5 MOVLW 97 MOVWF ?LocalText_main+6 MOVLW 116 MOVWF ?LocalText_main+7 MOVLW 39 MOVWF ?LocalText_main+8 MOVLW 115 MOVWF ?LocalText_main+9 MOVLW 32 MOVWF ?LocalText_main+10 MOVLW 110 MOVWF ?LocalText_main+11 MOVLW 101 MOVWF ?LocalText_main+12 MOVLW 120 MOVWF ?LocalText_main+13 MOVLW 116 MOVWF ?LocalText_main+14 MOVLW 63 MOVWF ?LocalText_main+15 CLRF ?LocalText_main+16 MOVLW ?LocalText_main+0 MOVWF FARG_Lcd_Out_text+0 CALL _Lcd_Out+0;16F690_enc.mbas,73 :: LCD_Out(2,1, "hmmm... nothing") MOVLW 2 MOVWF FARG_Lcd_Out_row+0 MOVLW 1 MOVWF FARG_Lcd_Out_column+0 MOVLW 104 MOVWF ?LocalText_main+0 MOVLW 109 MOVWF ?LocalText_main+1 MOVLW 109 MOVWF ?LocalText_main+2 MOVLW 109 MOVWF ?LocalText_main+3 MOVLW 46 MOVWF ?LocalText_main+4 MOVLW 46 MOVWF ?LocalText_main+5 MOVLW 46 MOVWF ?LocalText_main+6 MOVLW 32 MOVWF ?LocalText_main+7 MOVLW 110 MOVWF ?LocalText_main+8 MOVLW 111 MOVWF ?LocalText_main+9 MOVLW 116 MOVWF ?LocalText_main+10 MOVLW 104 MOVWF ?LocalText_main+11 MOVLW 105 MOVWF ?LocalText_main+12 MOVLW 110 MOVWF ?LocalText_main+13 MOVLW 103 MOVWF ?LocalText_main+14 CLRF ?LocalText_main+15 MOVLW ?LocalText_main+0 MOVWF FARG_Lcd_Out_text+0 CALL _Lcd_Out+0;16F690_enc.mbas,74 :: Delay_ms(1000) ' Waste 1 sec of my time MOVLW 11 MOVWF R11+0 MOVLW 38 MOVWF R12+0 MOVLW 93 MOVWF R13+0L__main2: DECFSZ R13+0, 1 GOTO L__main2 DECFSZ R12+0, 1 GOTO L__main2 DECFSZ R11+0, 1 GOTO L__main2 NOP NOP;16F690_enc.mbas,75 :: Lcd_Cmd(_LCD_CLEAR) ' Clear display MOVLW 1 MOVWF FARG_Lcd_Cmd_out_char+0 CALL _Lcd_Cmd+0;16F690_enc.mbas,76 :: Delay_ms(1000) ' 1 sec of pure... nothingness MOVLW 11 MOVWF R11+0 MOVLW 38 MOVWF R12+0 MOVLW 93 MOVWF R13+0L__main3: DECFSZ R13+0, 1 GOTO L__main3 DECFSZ R12+0, 1 GOTO L__main3 DECFSZ R11+0, 1 GOTO L__main3 NOP NOPL_end_main: GOTO $+0; end of _main Link spre comentariu
lama Postat Mai 27, 2015 Partajează Postat Mai 27, 2015 Salut Cu seria aceasta de lcd-uri eu am patit de doua ori la fel ca tine. Una era de la contrast iar a doua era de la timpi care erau de aprox 2 ori mai mari. Asa ca am cautat pe net , am gasit pe cineva care se plingea la fel , am luat o rutina de lucru cu lcd-ul si am umblat la timpi pina a pornit. Doar ca lcd-urile mele erau de pe Ebay ..... Nu spun ca e la fel, doar o parere. Stima Link spre comentariu
Vizitator SimonaAlexandra7 Postat Mai 27, 2015 Partajează Postat Mai 27, 2015 AM REZOLVAT PROBLEMA!!!!!!!!!!!!!!! Intr-adevar,trebuia sa pun LAT....Acum merge perfect.. VA MULTUMESC MULT DE TOT!!!! Link spre comentariu
Vezi Muti Postat Mai 27, 2015 Partajează Postat Mai 27, 2015 Listing-ul ASM (care dovedeste ce ai zis despre goto $+0), care miscare duce PIC-ul unde? Ca nu mai face nimic: nu reset, nu repetare de Main, ci mai degraba un vesnic NOP. As putea pune o intrebare pe forumul Mikroe. @thunderer: Nu cred ca este cazul sa pui intrebarea pe forum Mikroe. Chiar nu ai idee ce face "goto $+0" ? In niciun caz nu face NOP-uri. simona@: Bine ca s-a rezolvat problema LCD-ului. Cu ocazia asta ai inchis si discutia. Link spre comentariu
Liviu M Postat Mai 27, 2015 Partajează Postat Mai 27, 2015 (editat) Chiar nu ai idee ce face "goto $+0" ? In niciun caz nu face NOP-uri. Chiar nu poti lasa tonul pedant la conectare? Ce-ti cade daca explici direct ce face "goto $+0", fara sa insiri ce NU face? Nici eu nu stiu sigur, da' presupun ca sare la adresa curenta ($) + 0 (adica sta ). Cum nu stiu ce face NOP (daca e pe post de instructiune si modifica PC, desi probabul ca da), nu am idee daca-s echivalente. Dar NU, NU astept nici sa-mi confirmi, nici sa-mi infirmi. O sa ma lamuresc singur la un moment dat. simona@: Bine ca s-a rezolvat problema LCD-ului. Dar nu datorita tie. Editat Mai 27, 2015 de Liviu M Link spre comentariu
Mircea Postat Mai 28, 2015 Partajează Postat Mai 28, 2015 Pai cu ce difera un NOP de "la loc comanda!" adica la aceeasi comanda (linie de cod) care l-a trimis mai departe? ;16F690_enc.mbas,76 :: Delay_ms(1000) ' 1 sec of pure... nothingness MOVLW 11 MOVWF R11+0 MOVLW 38 MOVWF R12+0 MOVLW 93 MOVWF R13+0L__main3: DECFSZ R13+0, 1 GOTO L__main3 DECFSZ R12+0, 1 GOTO L__main3 DECFSZ R11+0, 1 GOTO L__main3 NOP NOPL_end_main: GOTO $+0; end of _main Postez din nou ultimele linii de program: la comanda goto $+0 ce face? Unde sare? La NOP sau la goto $+0? Aceasta L_end_main pare a fi bucla infinita creata de compilator in semn de mila catre programator, nu?! Link spre comentariu
Vizitator mihail.stoica Postat Iunie 3, 2015 Partajează Postat Iunie 3, 2015 Primul rand cu dreptunghiuri negre inseamna la LCD-ul nu este initializat Exemplu de conexiuni // B0 -> D4// B1 -> D5// B2 -> D6// B3 -> D7// B4 -> RS// B5 -> EN exemplu de program scris in MPLAB X (htc.h pentru PIC16F876, xc.h pentru PIC16F peste 1000, PIC18F..) #include <htc.h>#include <stdio.h>#include <stdlib.h> void main(void){ TRISB=0; init_lcd(); write_string("Test"); for(;;){ } { // lcd.h #ifndef LCD_H#define LCD_H#define _XTAL_FREQ 8000000#define data_PORT LATBextern void strobe_instr(char val_ch);extern void strobe_data(char val_ch);extern void init_lcd(void);extern void write_instruction(char val_char);extern void write_data(char val_char);extern void write_string(char *string);extern void build_cust_char(unsigned char loc, unsigned char *cust_char);extern void lcd_goto(unsigned char pos);#endif // lcd.c #include <htc.h>#include "lcd.h"void strobe_instr(char val_ch){ data_PORT = (val_ch | 0b00100000) & 0b11101111; // EN=1,RS=0 __delay_us(40); data_PORT = val_ch & 0b11001111; // EN=0,RS=0}void strobe_data(char val_ch){ data_PORT = val_ch | 0b00110000; // EN=1,RS=1 __delay_us(40); data_PORT = val_ch & 0b11011111; // EN=0,RS=1}void init_lcd(void){ __delay_ms(30); strobe_instr(0x03); __delay_ms(5); strobe_instr(0x03); __delay_us(200); strobe_instr(0x03); __delay_us(200); strobe_instr(0x02); __delay_ms(2); write_instruction(0x28); write_instruction(0x0C); write_instruction(0x01); __delay_ms(2); write_instruction(0x06);}void write_instruction(char val_char){ strobe_instr((val_char >> 4) & 0x0F); strobe_instr(val_char & 0x0F);}void write_data(char val_char){ strobe_data((val_char >> 4) & 0x0F); strobe_data(val_char & 0x0F);}void write_string(char *string){ while(*string) write_data(*string++);}void build_cust_char(unsigned char loc, unsigned char *cust_char){ write_instruction(0x40+(loc*8)); while(*cust_char){ write_data(*cust_char++); }}void lcd_goto(unsigned char pos){ write_instruction(0x80+pos);} Functiile mikroelektronika ocupa un port intreg Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum