Jump to content
dan_e

Interfata display 7 segmente cu Atmega32

Recommended Posts

Am inceput sa fac un voltmetru folosind un display cu 7 segmente (cu 4 digiti si virgula la mijloc) dar pana in acest moment nu mi-a reusit (m-am impotmolit cand am inceput sa lucrez softul cu mai multe segmente). Asa ca, la inceput m-am axat sa vad cum se comanda un singur segment. Am gasit si cateva tutoriale pe net, iata unul dintre ele care mi s-a parut mie mai pe intelesul tuturor:

 

http://www.avr-tutorials.com/interfacing/interfacing-seven-segment-display-avr-microcontroller

 

Schema de principiu folosind Atmega16:

SevenSegCircuit.png

si un exemplu de cod:

#include <avr/io.h>
 
#define F_CPU    4000000UL
#include <util/delay.h>
 
int main(void)
{
    DDRA = 0xFF;    // Configure port B as output
 
while(1)
{
//TODO:: Please write your application code
 
        PORTA = 0b00110000;        // Display Number 1
        _delay_ms(1000);        // Wait for 1s
        PORTA = 0b01011011;        // Display Number 2
        _delay_ms(1000);        // Wait for 1s
        PORTA = 0b01001111;        // Display Number 3
        _delay_ms(1000);        // Wait for 1s
        PORTA = 0b01100110;        // Display Number 4
        _delay_ms(1000);        // Wait for 1s
 
        PORTA = 0b01110111;        // Display Letter A
        _delay_ms(1000);        // Wait for 1s
        PORTA = 0b00111001;        // Display Letter C
        _delay_ms(1000);        // Wait for 1s
        PORTA = 0b01111001;        // Display Letter E
        _delay_ms(1000);        // Wait for 1s
        PORTA = 0b01110001;        // Display Letter F
        _delay_ms(1000);        // Wait for 1s 
}
 
    return 0;
}

Pana aici am inteles eu ceva dar ce facem daca avem 4 segmente si nu unul ? Si cum aprindem virgula ?  :scratchchin:

Share this post


Link to post
Share on other sites

Atmega16 sau 32 are un ADC de 10 biti, adica valoarea maxima este 1023 (1111111111)

  deci trebuiesc folosite 3 cifre zecimale.

Indicatia maxima va fi 999, de exemplu 9.99V sau 0.99V sau 99.9V.

Asa cum este conceputa schema, scrie ca se seteaza portul B ca iesiri dar conexiunile sunt la portul A

In spiritul schemei, pentru 4 cifre se pune fiecare cifra pe un PORT.

Pentru comanda punctului zecimal folositi bitii PA7, PB7, PC7, PD7 in codul caracterului.

 

Se pot scrie 4 caractere cu punctul zecimal, dar deoarece s-a setat portul A

  ca iesiri intrarile ADC-ului sunt blocate si nu mai puteti citi tensiunea,

  de aceea studiati urmatorul proiect  de voltmetru cu 3 cifre.

    http://danyk.cz/avr_lcd_adc_en.html

 

@gsabac

Edited by gsabac

Share this post


Link to post
Share on other sites

Un exemplu de interfata folosind Atmega16 si 4 segmente (anod comun):

 

seven-seg Atmega16.jpg

 

Si programul:

#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>
#include<compat/deprecated.h>
unsigned int speed=0;
volatile unsigned char one=0,two=0,three=0,four=0;
unsigned char seg[10]={0xde,0?42,0xec,0xe6,0?72,0xb6,0xbe,0xc2,0xfe,0xf2};
SIGNAL(SIG_OVERFLOW0) //ISR for Timer Overflow INT
{
speed++;
if(speed==20)
{
four++;
if(four>9)
{
four=0;
three++;
if(three>9)
{
three=0;
two++;
if(two>9)
{
two=0;
one++;
if(one>9)
one=0;
}
}
}
speed=0;
}
}

int main(void)
{
unsigned int i;
DDRB=0xFF;
DDRA=0xFF;
DDRD=0?00;
PORTB=0?00;
PORTA=0?00;
PORTD=0xFF;
TCCR0=(1<<CS00)|(1<<CS02);
// Prescaling of clock TCNT0=0;
sei(); // Global INT enable
TIMSK=(1<<TOIE0); // Timer overflow INT enable
while(1)
{
if(!(PIND & 0?01))
{
while(!(PIND & 0?01));
cli();
}
if(!(PIND & 0?02))
{
while(!(PIND & 0?02));
sei();
}
if(!(PIND & 0?04))
{
while(!(PIND & 0?04));
four=three=two=one=0;
}
PORTB=0?01; // Display1 selected
PORTA=seg[four];
_delay_us(100);
PORTB=0?02; // Display2 selected
PORTA=seg[three];
_delay_us(100);
PORTB=0?04; // Display3 selected
PORTA=seg[two];
_delay_us(100);
PORTB=0?08; // Display4 selected
PORTA=seg[one];
_delay_us(100);
}
return 0;
}

Programul de mai sus are la baza o tehnica de multiplexare, astfel, prin PORTB0...3 este selectat la un moment dat un singur display. La inceputul programului este definit un sir de caractere "char" care reprezinta valorile in hexa a cifrelor de la 0 la 9. Pentru mai multe detalii, iti recomand sa testezi programul si sa incerci sa vezi rolul fiecarui cod - oricum, comentariile principale sunt facute in codul de mai sus, restul se mai poate interpola sau va rezulta din testarea programului.

 

Numai bine

Share this post


Link to post
Share on other sites

Multumesc tuturor pentru raspunsuri.

Totusi, nu m-am lamurit daca virgula se aprinde loco sau prin soft ?  :scratchchin:

Share this post


Link to post
Share on other sites

Atmega16 sau 32 are un ADC de 10 biti, adica valoarea maxima este 1023 (1111111111)

  deci trebuiesc folosite 3 cifre zecimale.

Indicatia maxima va fi 999, de exemplu 9.99V sau 0.99V sau 99.9V.

Asa cum este conceputa schema, scrie ca se seteaza portul B ca iesiri dar conexiunile sunt la portul A

In spiritul schemei, pentru 4 cifre se pune fiecare cifra pe un PORT.

Pentru comanda punctului zecimal folositi bitii PA7, PB7, PC7, PD7 in codul caracterului.

 

Se pot scrie 4 caractere cu punctul zecimal, dar deoarece s-a setat portul A

  ca iesiri intrarile ADC-ului sunt blocate si nu mai puteti citi tensiunea,

  de aceea studiati urmatorul proiect  de voltmetru cu 3 cifre.

    http://danyk.cz/avr_lcd_adc_en.html

 

@gsabac

V-am raspuns foarte clar si completez pentru dvs. si pe intelesul oricui a facut ceva programare.

Fiecare port, in general are 8 cai, ce pot fi selectate ca iesiri sau intrari prin selectarea corespunzatoare.

Pentru segmente se folosesc 7 iesiri iar pentru punctul zecimal a 8 iesire. Selectarea este utila prin soft

 in special cind este vorba de virgula mobila, dar si la virgula fixa. Daca pozitia punctului zecimal este fixa

 puteti pune o rezistenta la VDD.

 

@gsabac

Edited by gsabac
  • Like 1

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

  • 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.