Sari la conținut
ELFORUM - Forumul electronistilor

Problema LCD-PIC


Vizitator SimonaAlexandra7

Postări Recomandate

Vizitator SimonaAlexandra7

O sa mai verific totusi inca o data si cablajul... si o sa incarc codul pe care mi l-ai sugerat... sper sa mearga... :26

Link spre comentariu

I//Functie principalavoid main() { INTCON = 0;   // Dezactivare intreruperi ANSELD = 0; Lcd_Init(); Delay_ms(100); // Initializare LCD Lcd_Cmd(_LCD_CURSOR_OFF);   // Dezactivare cursor Lcd_Cmd(_LCD_CLEAR); // Stergere Ecran Delay_ms(1000);   // Delay 1 secunda Lcd_Out(1,2,"Test LCD"); // Mesaj initial 1, prima linie Lcd_Out(2,5,"Blablabla");   // Mesaj initial 1 linia 2 delay_ms(100);}

 

Programelul tau are un start frumos, sfarsit nu are.

Desi nu cred ca asta este cauza nefunctionarii, spune-mi te rog ce crezi ca se produce dupa executarea din final "delay_ms(100);" ?

Link spre comentariu

Trebuia sa lasi codul asa cum ti l-am trimis eu initial. Uite ti-l mai postez odata, cred ca e functional acum:

                       //Conexiuni LCDsbit LCD_RS at RD4_bit;sbit LCD_EN at RD6_bit;sbit LCD_D4 at RD3_bit;sbit LCD_D5 at RD2_bit;sbit LCD_D6 at RD1_bit;sbit LCD_D7 at RD0_bit;sbit LCD_RS_Direction at TRISD4_bit;sbit LCD_EN_Direction at TRISD6_bit;sbit LCD_D4_Direction at TRISD3_bit;sbit LCD_D5_Direction at TRISD2_bit;sbit LCD_D6_Direction at TRISD1_bit;sbit LCD_D7_Direction at TRISD0_bit;//Functie principalavoid main() {                 INTCON = 0;        // Dezactivare intreruperi                 Lcd_Init();                       // Initializare LCD                 Lcd_Cmd(_LCD_CURSOR_OFF);        // Dezactivare cursor                 Lcd_Cmd(_LCD_CLEAR);            // Stergere Ecran                 Delay_ms(1000);                // Delay 1 secunda  while(1){          Lcd_Out(1,2,"Test LCD");          // Mesaj initial 1, prima linie        Lcd_Out(2,5,"Blablabla");        // Mesaj initial 1 linia 2   delay_ms(100);  }}
Link spre comentariu

Da..asta este tot programul..... Ce ar trebui sa mai pun?? :84

Unul din primele lucruri pe care le-am aflat and am inceput eu sa invat despre programarea microcontrollerelor, a fost ca dupa partea de initializare e nevoie de o bucla infinita (while(1) de cele mai multe ori) in care microcontrollerul sa-si piarda vremea pana la adanci batraneti. Cu unele exceptii, ca intotdeauna in viata (watchdog reset, de exemplu).

In lipsa buclei infinite, cand ajunge "la capatul celalalt", microcontrollerul nu mai stie ce sa faca si o ia de la capat - reset, initializare...

Nu mai stiu de unde  am cules initial informatia, da' am presupus-o "general valabila". Nu stiu exact ce face mikroc in cazul asta, dar compilerul pe care-l folosesc eu (xc8) asa functioneaza:

 

The identifier
main
is special. You must always have one and only one function called
main()
in your programs. This is the first function to execute in your program.
Code associated with
main()
; however, is not the first code to execute after Reset.
Additional code provided by the compiler, and known as the runtime startup code, is
executed first and is responsible for transferring control to the
main()
function. The
actions and control of this code is described in the following sections.
The compiler inserts special code at the end of
main()
which is executed if this func-
tion ends, i.e. a
return
statement inside
main()
is executed, or code execution
reaches the
main()
’s terminating right brace. This special code causes execution to
jump to address 0, the Reset vector for all 8-bit PIC devices. This essentially performs
a software Reset. Note that the state of registers after a software Reset may be differ-
ent to that after a hardware Reset.
It is recommended that the
main()
function does not end. Add a loop construct (such
as a
while(1)
) that will never terminate either around your code in
main()
or at the
end of your code, so that execution of the function will never terminate. For example,
void main(void)
{
// your code goes here
// finished that, now just wait for interrupts
while(1)
continue;
}

@Vlad - dezactivarea porturilor analogice atunci cand le nu le folosesti (si sunt sanse sa folosesti digital portul alocat lor) e good practice, vorba francezului. Asa ca puteai lasa in cod linistit

  ANSELD = 0;
Editat de Liviu M
Link spre comentariu

In lipsa buclei infinite, cand ajunge "la capatul celalalt", microcontrollerul nu mai stie ce sa faca si o ia de la capat - reset, initializare...

Tot in Franceza :) : you sure 'bout that?!O sa incerc diseara cu un programel de test, dar nu inteleg de ce ar fi asa daca nu ai WDT activat.
Link spre comentariu

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări