mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC s auslesen, LED Matrix


Autor: matthias asselborn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

spiele nun schon lange mit dem Gedanken
von einem 8535 er Mega Atmel alle 8 analog digital Wandler auszulesen
und die Werte dann in einer LED matrix auszugeben

z.b. 1. ADC lesen dann 1. Spalte der 12x8 er Matrix aktivieren
und die Werte wie ein Vu meter über die 12 Leds ausgeben
usw...

habe mir schon mal ein VU Meter programmiert
aber ich komme mit der Multiplex nicht zurecht
zudem habe ich noch nie eine Multiplex in C programmiert
wäre für eure Hilfe echt dankbar

Gruß Matthias

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sollte recht einfach sein.
sag mal, wie Deine LED-Matrix geschaltet ist, hast Du einen Controller
dafuer (z.B. MAX69xx) oder haengen sie direkt am uC?

Willst Du die LEDs linear oder logarithmisch ansteuern?

linear: 8-bit ADC: den gelesenen Wert um 5 nach rechts schieben,
bleiben 3 Bits uebrig, dann diese 3 Bits als Loop-Counter nehmen und
ein Bit um diesen Wert schieben (oder eine 8 Byte lange Lookup-Table 00
01 03 07 0f 1f 3f 7f ff oder 00 01 02 04 08 10 20 40 80), dieses
Bitmuster auf die Led-Spalte ausgeben, fertig.

z.B. ADC=0xc0 um 5 nach rechts =0x06 Lookup: 0x3f ausgebgen, die
unteren 6 LEDs brennen.

gerade faellt mir auf, es gibt ja 9 Moeglichkeiten, also statt um 5
nach rechts lieber durch 28 dividieren und eine 9 Byte lange Table (wie
oben angegeben).

Bei log. wuerde ich direkt eine 256 Byte lange Lookup nehmen.

das wars  Profi

Autor: matthias asselborn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
anbei n code schnipsel von mir

ich progge gerade und probiere
hab die leds direkt am atmel mit transistoren halt noch und
wiederstanden



#include <mega8535.h>
#include <stdio.h>
#define ADC_VREF_TYPE 0x40
#define DEF_ADC_MASK  0x07


inline unsigned int start_adc(unsigned char adc_input)
{
  ADMUX=(adc_input & DEF_ADC_MASK)|ADC_VREF_TYPE;
  ADCSRA|=0x40;
}


inline unsigned int read_adc(unsigned char adc_input)
{
    while ((ADCSRA & 0x10)==0);
    ADCSRA |= 0x10;
    start_adc(adc_input);
    return ADCW;
}


inline void Ausgabe(unsigned int Wert)
{
  if (Wert>=455)
      PORTD = 0x00;
  else if (Wert>=403)
      PORTD = 0x80;
  else if (Wert>=363)
      PORTD = 0xC0;
  else if (Wert>=321)
      PORTD = 0xE0;
  else if (Wert>=286)
      PORTD = 0xF0;
  else if (Wert>=256)
      PORTD = 0xF8;
  else if (Wert>=229)
      PORTD = 0xFC;
  else if (Wert>=204)
      PORTD = 0xFE;
  else
      PORTD = 0xFF;
  if (Wert>=721)
      PORTC = 0xF0;
  else if (Wert>=644)
      PORTC = 0xF8;
  else if (Wert>=572)
      PORTC = 0xFC;
  else if (Wert>=511)
      PORTC = 0xFE;
  else
      PORTC = 0xFF;
}


void main(void)
{

DDRB=0xFF;
DDRC=0xFF;
DDRD=0xFF;
ACSR=0x80;

ADMUX=ADC_VREF_TYPE;
ADCSRA=0x88;
SFIOR&=0xEF;


start_adc(0);

while (1)
      {
        Ausgabe(read_adc(0));
      };
}


und hier unten im hauptprogramm dachte ich mir

ich setze den adc auf 0 ( 1. port ) dann auf 1 usw..
setze zusätzlich die 8 spalten ports nacheinander auf 1
und die ausgebae dazu sollte doch funktionieren oder ?

Autor: matthias asselborn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
müsste doch so klappen oder ?


#include <mega8535.h>
#include <stdio.h>
#define ADC_VREF_TYPE 0x40
#define DEF_ADC_MASK  0x07


inline unsigned int start_adc(unsigned char adc_input)
{
  ADMUX=(adc_input & DEF_ADC_MASK)|ADC_VREF_TYPE;
  ADCSRA|=0x40;
}


inline unsigned int read_adc(unsigned char adc_input)
{
    while ((ADCSRA & 0x10)==0);
    ADCSRA |= 0x10;
    start_adc(adc_input);
    return ADCW;
}


inline void Ausgabe(unsigned int Wert)
{
  if (Wert>=455)
      PORTD = 0x00;
  else if (Wert>=403)
      PORTD = 0x80;
  else if (Wert>=363)
      PORTD = 0xC0;
  else if (Wert>=321)
      PORTD = 0xE0;
  else if (Wert>=286)
      PORTD = 0xF0;
  else if (Wert>=256)
      PORTD = 0xF8;
  else if (Wert>=229)
      PORTD = 0xFC;
  else if (Wert>=204)
      PORTD = 0xFE;
  else
      PORTD = 0xFF;
  if (Wert>=721)
      PORTC = 0xF0;
  else if (Wert>=644)
      PORTC = 0xF8;
  else if (Wert>=572)
      PORTC = 0xFC;
  else if (Wert>=511)
      PORTC = 0xFE;
  else
      PORTC = 0xFF;
}


void main(void)
{

DDRB=0xFF;
DDRC=0xFF;
DDRD=0xFF;
ACSR=0x80;

ADMUX=ADC_VREF_TYPE;
ADCSRA=0x88;
SFIOR&=0xEF;


start_adc(0);
while (1)
      {
        PORTB.0=1;
        Ausgabe(read_adc(0));
      };

start_adc(1);
while (1)
      {
        PORTB.0=0;
        PORTB.1=1;
        Ausgabe(read_adc(1));
      };

start_adc(2);
while (1)
      {
        PORTB.1=0;
        PORTB.2=1;
        Ausgabe(read_adc(2));
      };

start_adc(3);
while (1)
      {
        PORTB.2=0;
        PORTB.3=1;
        Ausgabe(read_adc(3));
      };

start_adc(4);
while (1)
      {
        PORTB.3=0;
        PORTB.4=1;
        Ausgabe(read_adc(4));
      };

start_adc(5);
while (1)
      {
        PORTB.4=0;
        PORTB.5=1;
        Ausgabe(read_adc(5));
      };

start_adc(6);
while (1)
      {
        PORTB.5=0;
        PORTB.6=1;
        Ausgabe(read_adc(6));
      };

start_adc(7);
while (1)
      {
        PORTB.6=0;
        PORTB.7=1;
        Ausgabe(read_adc(7));
      };
}

Autor: matthias asselborn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaube so darf ich das nicht machen .......
wie wähle ich denn zwischen den adc s ??

grüßles

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.