Forum: Mikrocontroller und Digitale Elektronik Methode auf avr (7 segment)


von Kümmelkorn H. (mrcrabs_muh)


Lesenswert?

Hallo zusammen,
um mal in die avr programmierung einzusteigen wollte ich eine nicht 
multigeplexte 7segment anzeige ansteuern.
ich frage mich nur, wie erstelle ich sone art methode (in java heisst 
das so, wie nennt man das in c?)
google hat mir nicht helfen können

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Schau dir bitte erstmal das Tutorial an:
http://www.mikrocontroller.net/articles/AVR-Tutorial

Da steht eigentlich alles drin. Meine Empfehlung wäre, deine Anzeige an 
7 bit eines 8-Bit Ports deines AVR anzuschliessen (mit 330 Ohm 
Widerständen) und dann schön eine 8 blinken lassen.

von Thomas E. (thomase)


Lesenswert?

Kümmelkorn hochkantspalter schrieb:
> ich frage mich nur, wie erstelle ich sone art methode
Das ist ganz einfach.
Du erstellst eine Funktion, der du die anzuzeigende Zahl übergibst. 
Diese Zahl benutzt du als Index auf eine LuT, die die Bitmuster zur 
Anzeige auf dem Display enthält.

Alternativ könntest du auch erstmal ein C-Buch lesen.

mfg.

von Kümmelkorn H. (mrcrabs_muh)


Lesenswert?

Thomas Eckmann schrieb:
> Kümmelkorn hochkantspalter schrieb:
>> ich frage mich nur, wie erstelle ich sone art methode
> Das ist ganz einfach.
> Du erstellst eine Funktion, der du die anzuzeigende Zahl übergibst.
> Diese Zahl benutzt du als Index auf eine LuT, die die Bitmuster zur
> Anzeige auf dem Display enthält.
>
> mfg.

Aber wie deklariere/definiere(?) ich im code eine methode?
also als java syntag meine ich sowas:
public void eins()
{
    //mache 1 an
}

wie geht das in c?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Was natürlich heisst, das du dir ein System beim Anschliessen der 7 
Segmente ausdenkst. Es ist nicht die dümmste Idee, Segment a an Bit0, 
Segment b an Bit 1 usw. anzuschliessen.
Eine Sieben machst du dann dadurch, das du Bit 0,1 und 2 ansteuerst. 
Eine Eins wäre dann Bit 1 und 2 , usw.

von Floh (Gast)


Lesenswert?

Kümmelkorn hochkantspalter schrieb:
> wie geht das in c?
Ein C-Buch wäre nicht verkehrt (gibts ja auch online).

von Kümmelkorn H. (mrcrabs_muh)


Lesenswert?

habs durch diverse versuche in der ide heraus gefunden:
void eins()
    {
      PORTB |= (1 << PB1);
      PORTB |= (1 << PB2);
    }

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Mach dir beispielsweise ein Array, indem die Bitmuster drin sind:
1
uint_8t segmente[10] = 
2
{ 0b00111111, 0b00000110, 0b01011011, .... }
bis zur 9, als Beispiel hab ich mal die Bitmuster für 0 , 1 und 2 
reingeschrieben, wenn du meinen vorigen Vorschlag befolgst.
Dann kannst du eine kleine Funktion machen:
1
void Show(uint8_t Zahl) {
2
PORTC = segmente[Zahl];
3
}
Das setzt voraus das PortC schon auf Ausgang gesetzt ist und da auch das 
Display angeschlossen ist.
Wenn du nun im Hauptprogramm schreibst:
 show(7);
zeigt die Anzeige eine 7-Segment 7.

von Kümmelkorn H. (mrcrabs_muh)


Lesenswert?

1
#define F_CPU 1000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
7
8
9
int main (void)
10
{
11
        
12
        //DDRB = 1;
13
    DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3) | (1<<PB4) | (1<<PB5) | (1<<PB6) | (1<<PB7);
14
15
        
16
        for(;;)
17
    {
18
                
19
        PORTB |= (1 << PB0);
20
        _delay_ms(5000);
21
        PORTB |= (1 << PB1);
22
        _delay_ms(5000);
23
        PORTB |= (1 << PB2);
24
        _delay_ms(5000);
25
        PORTB |= (1 << PB3);
26
        _delay_ms(5000);
27
        PORTB |= (1 << PB4);
28
        _delay_ms(5000);
29
        PORTB |= (1 << PB5);
30
        _delay_ms(5000);
31
        PORTB |= (1 << PB6);
32
        _delay_ms(5000);
33
        PORTB |= (1 << PB7);  
34
        _delay_ms(5000);
35
        aus;
36
        _delay_ms(5000);
37
        eins;
38
          
39
        
40
    }
41
    
42
    void eins() 
43
    {
44
      PORTB |= (1 << PB1) | (1 << PB2);
45
    }
46
    
47
    void aus()
48
    {
49
      PORTB &= ~ (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3) | (1<<PB4) | (1<<PB5) | (1<<PB6) | (1<<PB7);
50
    }    
51
      
52
                         
53
}

Nur wie verwende ich die methode jetzt?
so gehts offenbar nicht???

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Viel zu umständlich, siehe oben. Du kannst das Array ja noch um die 
Buchstaben a,b,c,d,E und F erweitern, dann hast du sogar ne Hex Anzeige.

von Kümmelkorn H. (mrcrabs_muh)


Lesenswert?

hatte ich erst überlesen
ich hab erst vor kurzem angefangen mit avr, wie definiere ich das array?
Ich reg mich immer über so fragen auf, aber kanns du mir mal nen code 
mal beispielhatf für dei ersten 2 zeichen fertig machen?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Jo, steht doch schon da , alles in C :D
Spassvögel schliessen übrigens den Dezimalpunkt an Bit 7 an , den kann 
man dann auch benutzen. Wär doch schade um das freie Beinchen am Port.

Ohh, ich habe das semikolon nach dem Array } vergessen, ergänz das in 
deinem Code.

von Kümmelkorn H. (mrcrabs_muh)


Lesenswert?

ich komm mit dem array nicht klar
1
int main (void)
2
{
3
        
4
        //DDRB = 1;
5
    DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3) | (1<<PB4) | (1<<PB5) | (1<<PB6) | (1<<PB7);
6
7
    uint_8t segmente[3] = { 0b00111111, 0b00000110, 0b01011011}
8
        
9
        
10
    show(1);            
11
          
12
        void Show(uint8_t Zahl) 
13
    {
14
      PORTB = segmente[Zahl];
15
    }
16
}

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Nee, schreib das Array vor Main() , dann haben auch Unterprogramme was 
davon.
Die Funktion Show() ist so ein Unterprogramm. Aber bitte lies doch mal 
das Tutorial.
Show() würde auch ausserhalb von main() stehen.Globale Variablen und 
Konstanten sollten immer ganz vorne im Programm stehen.

von Kümmelkorn H. (mrcrabs_muh)


Lesenswert?

das turtorial is doch nur für assembler?

von Kümmelkorn H. (mrcrabs_muh)


Lesenswert?

1
#define F_CPU 1000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
uint8_t segmente[3] = { 0b00111111, 0b00000110, 0b01011011};
7
8
void show(uint8_t Zahl) 
9
  {
10
    PORTB = segmente[Zahl];
11
  }
12
13
14
15
16
int main (void)
17
  {
18
    DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3) | (1<<PB4) | (1<<PB5) | (1<<PB6) | (1<<PB7);
19
        
20
        
21
    show(0);
22
    _delay_ms(5000);
23
    show(1);
24
    _delay_ms(5000);
25
    show(2);                    
26
        
27
  }
danke klappt
doch wie sind die bits zusammengesetzt?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Die normale Definition für 7 Segment ist ja
      a
   -------
   |     |
 f |     | b
   |  g  |
   ------
   |     |
 e |     | c
   |  d  |
   -------

Und nun habe ich einfach a mit Bit 0 , b mit Bit 1, c mit Bit2 usw. des 
Portes verbunden.
Mit ein bisschen nachdenken und dieser hilfreichen Grafik kannst du dann 
die anderen Zahlen ergänzen.
Die Notation a la 0b01010101 nennt sich binär und hat in dem Fall den 
Vorteil, die Bits einzeln zu zeigen. Du kannst statt 0b00000110 auch 
0x06 schreiben oder einfach 6 , ist aber hier eher unpraktisch.
Bei der 3 sind also Segment a,b,c,d und g gesetzt, tüftel ein bisschen.

von Stryker_2k (Gast)


Lesenswert?

Kümmelkorn hochkantspalter schrieb:
> das turtorial is doch nur für assembler?

Dann ist dieses Tutorial wohl ganz frisch geschrieben?

AVR-GCC-Tutorial: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

BTW: Nimm dir wirklich erstmal ein normales C Tutorial zu herzen - da 
drin wird definitiv erklärt, wie man eine Funktion (Methode) und Arrays 
erstellt. C ist zwar eine schöne Sprache, aber gerade die Syntax kann 
jemanden zunächst ganz schön verwirren ;-)

von Karl H. (kbuchegg)


Lesenswert?

> habs durch diverse versuche

Der nächste der hier aufschlägt und den wir in nächster Zeit durch C 
durchsprechen sollen, nur weil er sich zu fein ist, sich einfach mal die 
C-Grundlagen in einem C Buch anzusehen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.