Methode auf avr (7 segment)

OP #2524643
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
OP #2524682
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?
(Firma: matzetronics) #2524686
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.
(Firma: matzetronics) #2524710
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.
OP #2524714
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???
OP #2524733
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
}
(Firma: matzetronics) #2524739
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.
OP #2524749
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?
(Firma: matzetronics) #2524767
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.
Gast #2524810
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 ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren