Sari la conținut

Interfata display 7 segmente cu Atmega32


Postări Recomandate

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:

Link spre post
Distribuie pe alte site-uri

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

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

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

Link spre post
Distribuie pe alte site-uri

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

Editat de gsabac
  • Like 1
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