- Labornetzteil AliExpress         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 40

Thema: Binäre Uhr

  1. #21
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Anzeige

    Praxistest und DIY Projekte
    Wenn derµC ohne Spannung programmiert wird, fliesst ein Strom von den ISP-Pins über die internen Clamp-Dioden nach VCC und weiter zu C8 (falsch eingezeichnet), der dann leer ist. Es gibt also kurz einen recht hohen Strom, was möglicherweise die Clamp-Dioden frittiert. Möglicherweise sind die dauerleitend geworden?
    Disclaimer: none. Sue me.

  2. #22
    Benutzer Stammmitglied
    Registriert seit
    31.08.2005
    Beiträge
    41

    Programmierung

    So der Atmega funktioniert dank Fred wieder . Meine Selbst-Test-Funktion für die LEDs und Taster funktioniert prima. Leider bekomme ich den 16bit Timer1 nicht in Gang

    Bis jetzt sieht mein code so aus:
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <inttypes.h>
    #include <util/delay.h>
    
    //...
    
    #define B_OPT !(PIN_BUT & (1<<PIN_OPT))
    #define B_STD !(PIN_BUT & (1<<PIN_STD))
    #define B_MIN !(PIN_BUT & (1<<PIN_MIN))
    #define B_SEK !(PIN_BUT & (1<<PIN_SEK))
    
    //...
    
    //Zeit-Variablen
    unsigned char std;
    unsigned char min;
    unsigned char sek;
    
    //Timer-Interrupt
    ISR(TIMER1_COMPA_vect)
    {
        sek = sek+1;
        if( sek == 60 )
        {
            sek = 0;
            min = min+1;
            if( min == 60 )
            {
                min = 0;
                std = std+1;
                if( std == 24 )
                {
                    std = 0;
                }
            }
        }
    }
    
    //...
    
    void InitTimer()
    {
        TCCR1B |= (1<<CS12) | (1<<WGM12);//Prescaler = 256; CTC-Mode
        OCR1AH = 0x7A; // 8MHz/256 = 31250 <= wert nach 1 Sek.
        OCR1AL = 0x12; //  "
        TIMSK |= (1<<OCIE1A);
    
        std = 0;
        min = 0;
        sek = 0;
        sei(); //Interrupts aktivieren
    }
    
    //...
    
    int main(void)
    {
        Init();
        SelfTest();
        InitTimer();
        while(1)
        {
            //Uhrzeit anzeigen
            PORT_SEK = sek;
            PORT_MIN = min;
            PORT_STD = std;
            
            //Uhr stellen
            if( B_SEK )
            {
                _delay_ms(100);
                sek = sek+1;
                if( sek == 60 )
                    sek = 0;
            }
            if( B_MIN )
            {
                _delay_ms(100);
                min = min+1;
                if( min == 60 )
                    min = 0;
            }
            if( B_STD )
            {
                _delay_ms(100);
                std = std+1;
                if( std == 24 )
                    std = 0;
            }
        }
    
        return 0;
    }
    Das Einstellen der Uhrzeit über die Taster funktioniert einwandfrei. Leider Funktioniert der Timer nicht. Eigentlich wollte ich das jede sekunde ein Interrupt kommt und dann die Variablen entsprechend erhöht werden.
    Was hab ich falsch gemacht beim Timer? Vielleicht habe ich ja das Datenblatt falsch verstanden...

    Gruß Luz

  3. #23
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    70
    Beiträge
    622
    Hallo LuZ,

    den Timer hast Du schon richtig programmiert, aber es gibt zwei andere Probleme mit Deinem Code:
    • 1. Die Zeitvariablen müssen "volatile" sein, da Du auf sie innerhalb der ISR und aus anderen Programmteilen zugreifst.
      2. Ich schlage vor, du änderst Deine Initialisierung so:
      Code:
      OCR1A = 0x7A12; // 8MHz/256 = 31250 <= wert nach 1 Sek. 
      TCCR1B |= (1<<CS12) | (1<<WGM12);//Prescaler = 256; CTC-Mode

    (also erst OCR1A [von mir vereinfacht] setzen, dann TC1 starten: das hat aber nur beim ersten Durchlauf eine echte Relevanz).

    BTW: Benutzt Du das AVRStudio? Falls ja, simulier doch einfach Deinen Code!

    Gruß

    Fred
    Only entropy comes easy. - Anton Checkhov

  4. #24
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    a) schon mal was von "volatile" gehört?
    b) OCR1A kannst als 16-Bit-Register verwenden, also OCR1A = ...

    zB
    Code:
    OCR1A = (uint16_t) ((uint32_t) F_CPU / PRESCALE / INTERRUPTS_PER_SECOND-1);
    Das erspart Dir auch den Rechenfehler (der richtige Wert ist 0x7a11)
    Disclaimer: none. Sue me.

  5. #25
    Benutzer Stammmitglied
    Registriert seit
    31.08.2005
    Beiträge
    41
    Danke, mit "volatile" funktioniert es. Davon hab ich aber vorher noch nichts gehört, weil ich globale Variablen bis jetzt auch ohne volatile fehlerfrei benutzen konnte.

    Warum muss ich OCR1A noch -1 rechnen?

    Gruß Luz

  6. #26
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Schau einfach mal ins Handbuch zu Timer1/Modes of Operation/CTC-Mode. Da ist auch eine Formel.
    Disclaimer: none. Sue me.

  7. #27
    Benutzer Stammmitglied
    Registriert seit
    31.08.2005
    Beiträge
    41
    So meine Binäre Uhr tickt jetzt fleißig, die Helligkeit wird automatisch geändert und man kann die Uhrzeit einstellen. Jetzt werde ich noch Animationen hinzufügen, die dann jede halbe/volle Stunde ablaufen und dass sie Nachts in einem bestimmten Zeitraum nicht leuchtet.

    Außerdem betreibe ich die Uhr jetzt über ein 9V-AC Netzgerät, weil ich dann keine Batterien wechseln muss. Weil es ein AC Netzgerät ist habe ich noch einen Brückengleichrichter dazugelötet. Funktioniert prima.

    Gruß Luz

  8. #28
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    70
    Beiträge
    622
    Hallo LuZ,

    da hast Du ja schnelle Fortschritte mit diesem Projekt gemacht! Zeigst Du uns ein Video oder Bilder? Ich hoffe, Du hast auch einen Regler-IC oder wenigstens eine Zener-Diode für die Erzeugung der Versorgungsspannung des Prozessors im Netzteil. Die LEDs brauchen natürlich keine stabilisierte Spannung.

    Viele Grüße

    Fred
    Only entropy comes easy. - Anton Checkhov

  9. #29
    Benutzer Stammmitglied
    Registriert seit
    31.08.2005
    Beiträge
    41
    Hallo,

    ich glaube ich habe mich etwas falsch ausgedrückt als ich geschrieben habe, dass
    ich die Uhr jetzt über ein 9V-AC Netzgerät
    betreibe.
    Ich habe mal den Schaltplan aktualisiert, so wie die Uhr jetzt tatsächlich aufgebaut ist. Ich hoffe da ist es verständlicher, was ich gemacht habe.

    Wie ihr am Schaltplan sehen könnt, habe ich den Brückengleichrichter aus Dioden gebaut und kein fertiges Bauteil genommen. Das liegt daran, dass ich keinen Gleichrichter daheim habe und improvisieren musste.
    Der 10uF Elko hat zum Glätten nicht ausgereicht, darum habe ich noch einen 100uF hinzugelötet. Nicht dass ihr euch wundert.

    Gruß Luz

    P.S.: Videos und Bilder kommen noch. Ich will die Uhr nur vorher noch softwaretechnisch etwas verbessern.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken schaltplan_binaere_uhr.png  

  10. #30
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Wozu brauchst Du eigentlich die Kondensatoren über den Gleichrichter-Dioden?
    Disclaimer: none. Sue me.

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test