Jump to content
Sign in to follow this  
Florin_dioda

Program scriere cifre pe LCD ATmega8

Recommended Posts

M-am apucat de curand de microcontrolere, iar acum vreau sa fac un program la care am nevoie de ajutor.

 

Momentan programul arata astfel:

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include "lcd.h"
int main()
{
LCDInit(LS_BLINK|LS_ULINE);
LCDClear();
DDRC = 0b00000001;
PORTC = 0b00000010;

while(1)
{
 if(!(PINC & 0b00000010))
 {
  _delay_ms(5);
  PORTC |= 0b00000001;
  LCDWriteInt(1,1);
 }
 else
 {
  _delay_ms(5);
  PORTC &= 0b11111110;
  LCDWriteInt(0,1);
 }
}
}

 

Am un LED conectat la PC0 si un intrerupator la PC1. Cat timp intrerupatorul nu este actionat, LED-ul este stins, iar LCD-ul afiseaza numai 0. Cat timp Intrerupatorul este actionat, LED-ul se aprinde, iar LCD-ul afiseaza numai 1.

Eu vreau sa ajung sa pot scrie pe rand cate o cifra la fiecare apasare de buton. LED-ul l-am pus la inceput pentru teste, cand nu aveam LCD-ul conectat, nu ma intereseaza LED-ul. In schimb Problema este urmatoarea:

Cat timp butonul este apasat, sau nu, LCD-ul afiseaza incontinuu 0 sau 1. Eu vreau sa afiseze numai o singura data, daca am apasat butonul odata, chiar daca il tin apasat. Daca as scoate while-ul, programul ar rula o singura data; iar cu el imi afiseaza incontinuu.

Solutia ar fi (ma gandesc eu...) ca functia main sa ruleze intr-un fel de Stand-By, iar atunci cand este actionat butonul, sa ruleze o singura data o functie care scrie un 1 pe LCD. Nu ma intereseaza zerourile, pentru inceput vreau sa scrie numai 1-ri. Insa nu stiu cum sa fac aceasta "functie de Stand-By".

 

Ma poate ajuta cineva? :question:

Share this post


Link to post
Share on other sites

?ntreab? pe aici:

------- URL -------

Edited by donpetru
stergere adresa web

Share this post


Link to post
Share on other sites

Dar de ce sa intrebe acolo ?

 

Editare ulterioara: @cordial suspendat 30 zile din forum. Daca veti reveni in forum dupa 30 de zile poate dati indicatii aici. Si inca ceva, poate atunci, totusi, cititi regulamentul.

 

Editare ulterioara 2:

@florin_dioda, ca sa primesti un raspuns care sa-ti fie de ajutor cu adevarat va trebui sa scriu un capitol de programarea microcontrolerelor Atmel. Iti recomand sa te indrepti catre mikroC for AVR, are un help destul de bine pus la punct, foarte util incepatorilor in programarea microcontrolerelor. Incepe de acolo. Iti recomand lucrul asta deoarece Atmel Studio este mult mai complex iar cateva explicatii nu ar fi suficiente ca sa vezi unde ai gresit.

 

Numai bine

Share this post


Link to post
Share on other sites

Si totusi ma poate ajuta cineva? Am reusit pana la urma sa fac programul, insa are o mica problema si am nevoie de putin ajutor:

 

Programul arata astfel:

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include "lcd.h"
int recurs()
{
int i;
if(PINC & 0b00000010)
{
 i=0;
 PORTC &= 11111110;
}
else
{
 i=1;
 PORTC &= 00000001;
}
return i;
recurs();
}
int main()
{
LCDInit(LS_BLINK|LS_ULINE);
LCDClear();
DDRC = 0b00000001;
PORTC = 0b00000010;
int j;
while(1)
{
 j = recurs();
 if(j==0)
 {
  while(j==0)
  {
   j = recurs();
  }
 }
 if(j==1)
 {
  _delay_ms(5);
  LCDWriteInt(1,1);
 }
 if(j==1)
 {
  while(j==1)
  {
   j = recurs();
  }
 }
}
}

 

Merge aproape perfect, singura problema este ca atunci cand tin apasat butonul imi scrie un singur 1 (asa cum trebuia), in schimb cand ii dau drumul, imi mai scrie unul. Adica la o apasare de buton (press & release, nu stiu cum sa explic altfel), imi scrie doi de 1 in loc de unul singur.

Share this post


Link to post
Share on other sites

In programul de mai sus ai doua if-uri(j==1) inutile si sunt mai multe greseli. Ar trebui rescris codul complet. Poate ar fi trebuit si un LCDClear(); in bucla while a programului, inclusiv declararea porturilor de intrare nu este facuta corect.

Parerea mea este ca daca vrei sa scrii un cod bun trebuie sa ai schema in fata, adica trebuie sa stii exact ce pinii foloseste microcontrolerul. Dupa aceea declari pinii ca intrare (nu stiu daca alegerea ta este 100% corecta, dar daca spui ca merge programul, s-ar putea sa fie) si apoi stabilesti strategia de scriere a codului.

 

PS Folosesti cumva Arduino ?

Edited by prog

Share this post


Link to post
Share on other sites
PS Folosesti cumva Arduino ?

daca folosea Arduino avea o functie setup() si main se numea loop() (fara ele nu compileaza nici un IDE de arduino)

 

nu am sarit sa-l ajut (cum o faceam in trecut) pentru ca topicul asta a pornit pe picior gresit, nu e clar ce vrea cum vrea, n-are schema etc.

 

RR

 

PS totusi o sa incerc sa dau un sfat de logica nu de cum trebuie scris programul

 

1.functia de afisare trebuie scoasa din bucla main() si apelata numai cand este necesar.

2. Daca vrei sa discriminezi intre apasari succesive o poti face in doua feluri

felul 1. - in bucla main citesti butonul (pinul) si-l compari cu o valoare citita anterior, astfel pot sa vezi daca a trecut din HIGH in LOW sau viceversa.

felul 2. - cu intruperi, programand o intrerupere sa facca trigger numai pe front crescator (din LOW in HIGH) sau numai pe front cazator (HIGH - LOW)

3.Cand ai decis ca butonul s-a apasat chemi functia de la punctul 1.

 

Sfat - cand citesti starea unui buton evita sa o faci intr-o bucla prea rapida ca sa dai timp contactelor sa se stabilizeze (procesul se chema de-bouncing)

RR

Edited by roadrunner

Share this post


Link to post
Share on other sites

In programul de mai sus ai doua if-uri(j==1) inutile si sunt mai multe greseli. Ar trebui rescris codul complet. Poate ar fi trebuit si un LCDClear(); in bucla while a programului, inclusiv declararea porturilor de intrare nu este facuta corect.

Parerea mea este ca daca vrei sa scrii un cod bun trebuie sa ai schema in fata, adica trebuie sa stii exact ce pinii foloseste microcontrolerul. Dupa aceea declari pinii ca intrare (nu stiu daca alegerea ta este 100% corecta, dar daca spui ca merge programul, s-ar putea sa fie) si apoi stabilesti strategia de scriere a codului.

 

PS Folosesti cumva Arduino ?

 

1. Care sunt greselile? Eu nu gasesc nici una si nici compilatorul. Nici nu este. Am realizat ca toata problema e cauzata de acel de-bouncing.

2. De ce LCDClear()? Eu nu vreau sa curat ecranul dupa ce scriu un 1...vreau sa mai scriu unul dupa el? Si tot asa.

3. Nu inteleg de ce nu este corecta declararea pinilor de intrare.

 

Sfat - cand citesti starea unui buton evita sa o faci intr-o bucla prea rapida ca sa dai timp contactelor sa se stabilizeze (procesul se chema de-bouncing)

Am inteles ca acest de-bouncing se poate rezolva si cu un condensator. Imi pueteti da niste detalii?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

We use cookies and related technologies to improve your experience on this website to give you personalized content and ads, and to analyze the traffic and audience of your website. Before continuing to browse www.tehnium-azi.ro, please agree to: Terms of Use.