Sari la conținut

Program scriere cifre pe LCD ATmega8


Postări Recomandate

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:

Link spre post
Distribuie pe alte site-uri

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

Link spre post
Distribuie pe alte site-uri

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.

Link spre post
Distribuie pe alte site-uri

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 ?

Editat de prog
Link spre post
Distribuie pe alte site-uri
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

Editat de roadrunner
Link spre post
Distribuie pe alte site-uri

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?

Link spre post
Distribuie pe alte site-uri

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
  • Navigare recentă   0 membri

    Nici un utilizator înregistrat nu vede această pagină.



×
×
  • Creează nouă...

Informații Importante

Folosim cookie-uri și tehnologii asemănătoare pentru a-ți îmbunătăți experiența pe acest website, pentru a-ți oferi conținut și reclame personalizate și pentru a analiza traficul și audiența website-ului. Înainte de a continua navigarea pe www.tehnium-azi.ro te rugăm să fii de acord cu: Termeni de Utilizare.

ATENTIE !!! Functionarea Tehnium Azi depinde de afisarea de reclame.

Pentru a putea accesa in continuoare site-ul web www.tehnium-azi.ro, va rugam sa dezactivati extensia ad block din browser-ul web al vostru. Dupa ce ati dezactivat extensia ad block din browser dati clic pe butonul de mai jos.

Multumim.

Apasa acest buton dupa dezactivarea extensiei Adblock