- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 72

Thema: 100mm 7-Segment Stoppuhr

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    20.12.2009
    Beiträge
    86
    Mit einem Overflow schreibst du zwar zur gleichen Zeit das gleiche raus, aber warum sollten die Segmente doppelt so schnell angesteuert werden? Geschrieben wird ja ach nach der Reihe. Dann ist es ja wieder das selbe....

    Die Idee mit dem Steckernetzteil ist klasse... Ok dann lege ich mir P-FET's zu, das ist das einfachste, aber ich weiß nicht ob ich die Segmente aufteilen werde...

    Mein code:
    Code:
    #include <avr/io.h>
    #define F_CPU 16000000
    #include <util/delay.h>
    #include <avr/interrupt.h>
    
    #define ZERO     0x3f
    #define ONE      0x06
    #define TWO      0x5b
    #define THREE 0x4f
    #define FOUR    0x66
    #define FIFE    0x6d
    #define SIX     0x7d
    #define SEVEN 0x07
    #define EIGHT 0x7f
    #define NINE    0x6f
    
    
    #define    t            0
    #define hu        1
    #define z            2
    #define s            3
    #define ds        4
    #define m            5
    #define dm        6
    #define h            7
    #define dh        8
    
    #define defSek    16000
    #define waits   61
    
    volatile uint8_t stop = 0;
    volatile uint8_t pause = 0;
    volatile uint8_t Freigabe = 0;
    volatile uint8_t block = 0;
    
    ISR(INT0_vect) {
    if(Freigabe && (stop > waits)){
      Freigabe = 0;
        block = 0;
        }
    else if(!Freigabe && (stop >waits)){
        block = 0;
        Freigabe = 1;
    }
    }
    
    ISR(TIMER1_COMPA_vect){
    pause=0;
    }
    
    ISR(TIMER2_OVF_vect){
    stop++;
    if(stop == 254)
        stop = 254;
    }
    
    
    
    void func(uint8_t *A)    {
      A[t]++;
        if(A[t] == 10) { 
            A[t]= 0;
          A[hu]++;
            if(A[hu] == 10){
                A[hu]=0;
                A[z]++;
                if(A[z] == 10){
                    A[z] = 0;
                    A[s]++;
                    if(A[s] ==10){
                        A[s] = 0;
                        A[ds]++;
                        if(A[ds] == 6){
                            A[ds] = 0;
                            A[m]++;
                            if(A[m] == 10){
                              A[m] = 0;
                              A[dm]++;
                              if(A[dm]==6){
                              A[dm]=0;
                              A[h]++;
                              if(A[h]==10){
                                      A[h]=0;
                                      A[dh]++;
                                      if(A[dh]==10)
                                    A[dh]=0;
                                    }
                              }                            
                          }    
                        }
                    }
                }
            }
        }
    }
    
     
    int main(void)
    {
     
      // set Ports
        DDRD |= ((1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7));
        PORTD &= ~((1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7));
        DDRA = 0xff;
        PORTA = 0xff;
        // set Interrupt 0
        GICR  |= (1<<INT0);
        MCUCR |= (1<<ISC01);
        
        // set TImMER 1 to CTC Mode
        TCCR1B |= (1<<CS10)|(1<<WGM12);
        TIMSK |= (1<<OCIE1A);
        
        // Set Timer 2 OVF INterrupt
        TCCR2 |= (1<<CS22)|(1<<CS21)|(1<<CS20);
        TIMSK |= (1<<TOIE2);
        
        uint8_t LINE [9][10];
        uint8_t A[9] = {0,0,0,0,0,0,0,0,0};
        uint8_t COUNT[12] = {ZERO ,ONE, TWO , THREE, FOUR, FIFE, SIX, SEVEN, EIGHT, NINE};    
        uint8_t i = 0;
        uint8_t j = 0;
        OCR1A = defSek;
        
        for (i = 0; i<10; i++)
         for(j = 0; j<11; j++){
           if(i == 1)
                    LINE[i][j] = COUNT[j]|0x80;
                else
                  LINE[i][j] = COUNT[j];
    
        }
        
        sei();
        
        while(1){
        
        
            while(pause){
    
                for(i = 0; i< 5; i++){
                    PORTD = 0x08<<i;
                    _delay_us(1);
    
                    PORTA = LINE[i][A[4-i]];
                    _delay_us(194);
                    PORTD = 0x08<<i;
                    _delay_us(1);
                }
            
            }
            if(Freigabe)
                func(A);    
            if(!block){
                TCNT2 = 0;
                stop = 0;
                block = 1;
            }
            pause = 1;
      }
    
    
        cli();
        return 0;
    }

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    20.12.2009
    Beiträge
    86
    Aber muss ich die p-Mosfets dann normal anschließen D-S oder "verkehrt" S-D??

  3. #3
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die P MOSFETs werden schon richtig herum angeschlossen: Source nach 12 V (oder ggf. etwas mehr) und Drain an die Anoden.

    Die Aufteilung in 2 Hälften macht schon Sinn: bei 9 Stellen im Mulitplexing kommt man schon in den Bereich wo der maximale Pulsstrom der Anzeigen die Grenze ist. Es gibt z.B. welche mit DC bis 25 mA, aber gepulst nur bis 150 mA. Der maximale Pulsstrom ist dann oft auch nur zulässig wenn die Umschaltung etwas schneller ist als man es für die Anzeige eigentlich bräuchte.

    Durch das Aufteilen der Anzeige verschiebt sich die Zahl der Treiber, statt 7 mal Low Side (ulN2003 oder BS170) und 9 mal High Side (z.B. ULN2003+P-FET) sind es dann 14 mal low side und 5 mal High Side (auch nur gut 1 A). Von den Treibern hält sich der Aufwand etwa die Waage.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    20.12.2009
    Beiträge
    86
    Aus Zeitgründen muss ich heute di Platine ätzen, d.h. ich werde die Segmente aufteilen in 2, und die Anoden steuer ich mit 3k3R BC547 + N-Mosfet an.

    Vielen Dank,
    lg Koertis

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.242
    Die Aufteilung in 2 Hälften macht schon Sinn: bei 9 Stellen im Mulitplexing kommt man schon in den Bereich wo der maximale Pulsstrom der Anzeigen die Grenze ist.
    Mit anderen Worten. Beim Multiplexen von 9 Segmenten ist ein Segment nur für 1/9 der Zeit an. Dadurch müssten die Semente mit sehr hohem Strom beaufschlagt werden, vermutlich mehr als so ein Segment vertragen kann.
    Bei 5 Segmenten wird das Verhältnis etwas besser, da ein Segment ja nun 1/5 der Zeit angesteuert wird und somit der Segmentstrom niedriger gewählt werden kann.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    20.12.2009
    Beiträge
    86
    aber es ist doch immer noch 1/9... da derµC ja immer nur eins nach dem anderen machen kann...

  7. #7
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Wenn man die Anzeigen aufteilt in 2 Gruppen, dann leichten immer 2 Anzeigen gleichzeitig. Das ist dann so als hätte man 5 Stellen mit je 14 Segmenten.

    Sinnvolle Optionen für die Steuerung der Anoden sind eigentlich nur PNP Transistoren (wie BD244) oder P-MOSFETs und dann in beiden Fällen so etwas wie ein Gatter des ULN2003 oder BS170 dazu. Wenn man da unbedingt N-MOSFETs nehmen will, wird es kompliziert, man braucht 2 Spannungen (18-20 V + ca. 14 V) und trotzdem noch den ULN2003 oder BS170 dazu.

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    20.12.2009
    Beiträge
    86
    Aber der BD244 hat ja einen Basisstrom von 2A...

    aber dann wirds doch der:
    IRF 5305
    Geändert von Koertis (16.04.2011 um 14:45 Uhr)

Ähnliche Themen

  1. Stoppuhr
    Von derpedi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 11
    Letzter Beitrag: 07.03.2010, 20:37
  2. Suche schweres Alu-T-Nuten-Profil 80-100mm Breite
    Von erik_wolfram im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 4
    Letzter Beitrag: 26.01.2010, 07:47
  3. Drucksensor für 100mm Wassersäule gesucht
    Von BlaueLed im Forum Sensoren / Sensorik
    Antworten: 2
    Letzter Beitrag: 08.04.2008, 07:29
  4. Suche Hohlkugel Kunststoff/Gummi Dm. 80-100mm
    Von toemchen im Forum Mechanik
    Antworten: 22
    Letzter Beitrag: 19.10.2006, 21:50
  5. Stoppuhr an Lichtschranken
    Von Sebian im Forum Elektronik
    Antworten: 36
    Letzter Beitrag: 22.05.2005, 09:07

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress