Durch Tastendrucke + 7 Segment Ports Schalten

Funktionen müssen in C vor ihrem eigentlichem Aufruf defieniert sein(Bei Java ist es anders). Außerdem werden Funktionen außerhalb von anderen Funktionen geschrieben(eine Tradition).
Mehr werd ich dir nicht verraten.
 
Ja, scheint mir logisch.

Wieso sollte man auf etwas verweisen, was der Controller (noch) nicht kennt. Wenn man ein Auto kaufen will, erkundigt man sich auch erst über den Preis, bevor man zur Bank rennt und Geld holt.
 
Hi Finn,

Das war mir klar.
Aber von Kanal 1 bis 512 gibt es 130560 Mögliche Zustände. Wenn man nicht nur die Kanäle (die im Endeffekt ja "nichts" machen) sondern ihre Werte mit einbezieht.
Warum denkst du an die Datenmenge, die du mit 512 Kanälen übermitteln
kannst, wenn ich von Adressen rede ?
Wieviel Bit brauchst Du, wenn Du die Zahlen von 0 bis 511 darstellen willst ?
und wieviel Bit brauchst Du, wenn Du die Zahlen von 1 bis 512 darstellen willst ?
Jetzt bin ich hartnäckig ! :D Los ! Antworten ;)

Über dieses Problem nachzudenken wird dir mal dabei helfen, Resourcen in Prozessoren zu sparen.

Gruß
Dino
 
Also int für Ganze Zahlen.
3 würde ich sagen. Für jede Ziffer einen.#
Oder um die ganze Zahl zu speichern:
integer oder short integer....

Hab noch die letzten zwei Compilermeldungen wegbekommen.
F_CPU muss vor der delay.h definiert werden.
 
Ich habe die Tasterabfrage anders gemacht.

Und reichen 3ms zum entprellen?
 
Hallo Finn,

Wieviel Bit brauchst Du, wenn Du die Zahlen von 0 bis 511 darstellen willst ?
und wieviel Bit brauchst Du, wenn Du die Zahlen von 1 bis 512 darstellen willst ?
Jetzt bin ich hartnäckig ! :D Los ! Antworten ;)

Über dieses Problem nachzudenken wird dir mal dabei helfen, Resourcen in Prozessoren zu sparen.
Dann will ich dir die Antwort mal geben (ich bin ja nicht so) ...

0...255 => Dafür benötigt man ein Byte (8 Bit)
0...511 => Dafür sind mehr als ein Byte nötig, nämlich genau 9 Bit !!
für die Darstellung der Zahl 512 bräuchtest Du bereits das 10te Bit !

Warum ein Bit verschwenden, wenn man die Adresse 0 nicht benötigt.

Also wird ein 9-Bit-Zähler verwendet und der Wert 0 als 512 dargestellt.
Das macht man so ...
man setzt bei einer 0 einfach den Aussgangpin für das 10te Bit ;-)
Dann benötigt man im Prozessor nur einen 9-Bit-Zähler, kann aber die
Zahlen von 1 bis 512 nach draußen darstellen ;-)

Gruß
Dino
 
Hm, dass ist klug xD

Ohne Googlen hätte ich das nicht rausgefunden.

Im moment kämpfe ich noch mit der Tastenentprellung.
 
Ich habe mich erstmal für die Lösung mit einem Zähler. Allerdings zeigt die Anzeige bei Tastendruck keine Veränderung an.

Code:
/* DMX-Adressengeber
Version: 0.1
Datum: 027.02.2009
Autor: Finn 'Kani' Schürmann
Target: AtMega 8515
Lizenz: Keine
*/

#define F_CPU 1000000UL

#include <avr/io.h>
#include <util/delay.h>


int main (void)
{

    DDRC = 0b11111111;  // Alles auf Ausgang - Das sind die  Segmente
    DDRA = 0b00000111;  // PA0-2 auf Ausgang - Das sind die Transistoren
    PORTC = 0b00000000; // Alles auf Low da die Segmente die Kathoden sind
    PORTA = 0b11111111;  // Das schaltet den PNP-Transistor an PA7 ein
    
    
    //Variablen definieren

    unsigned char ziffer=0;
    int zaehlwert=0;
    int entprellung_taster1=0, entprellung_taster2=0;
    static unsigned char letztetastenposition1, letztetastenposition2;   
    int stelle1, stelle2, stelle3;
    unsigned char stellezwischenschritt;
    unsigned char seg[] =
        {
        0b11100111,//0
        0b10000100,//1
        0b11010011,//2
        0b11010110,//3
        0b10110100,//4
        0b01110110,//5
        0b01110111,//6
        0b11000100,//7
        0b11110111,//8
        0b11110110,//9
        };
    

    while(1)
    {
        _delay_ms(3);        //While-Schleife verlangsamen damit die Transistoren nicht zu oft schalten
        
        ziffer++;

       //Taster 1 (Up)
        
        if( ! (PINA & (1<<PA6) ))        //Wenn Up-Taster gedrüct ist
        {
                if( ! letztetastenposition1)    //
                {
                    entprellung_taster1++;
                }
            letztetastenposition1=1;            
        }
        else
        {    
            letztetastenposition1=0;    //Taster bei letztem Schleifendurchlauf nicht gedrückt
            entprellung_taster1=0;
        }
        
        if(entprellung_taster1 == 5)
        {
            zaehlwert++;
        }
        
        //Taster 1 ENDE
        

        //Taster 2 (Down)
          
        if( ! (PINA & (1<<PA7) ))
        {
                if(!letztetastenposition2)
                {    
                    entprellung_taster2++;
                }
            letztetastenposition2=1;
        }
        else
        {    
                letztetastenposition2=0;
                entprellung_taster2=0;
        }    
        
        if(entprellung_taster2 == 5)
        {
            zaehlwert--;
        }
        
        //Taster 2 ENDE
        
        
        //Kanal-Begrezung

        if(zaehlwert >511)
        {
          zaehlwert=0;
        }    
        
        if(zaehlwert < 0)
        {
            zaehlwert = 511;
        }            
          
        // 7-Segment-Anzeigen splitten

        stelle1 = zaehlwert/100;
        stellezwischenschritt = zaehlwert/10;
        stelle2 = stellezwischenschritt - (stelle1*10);
        stelle3 = zaehlwert - (stellezwischenschritt*10);

        
        //Schleifendurchläufzähler begrenzen
        
        if(ziffer>3)
        {
          ziffer=1;
        }  
        
        //Transistoren schalten

       if(ziffer == 3)
        {
            PORTA = 0b11111110;        //Ausgang low    
            PORTC =~ seg[stelle3];
        }

        if(ziffer == 2)
        {
            PORTA = 0b11111101;        //Ausgang low
            PORTC =~ seg[stelle2];
        }

        if(ziffer == 1)
        {
            PORTA = 0b11111011;        //Ausgang low
            PORTC =~ seg[stelle1];
        }
    }

    return 0;            
}   //END MAIN

0 Fehler und 0 Warnungen
 
Min Jung! Wenn du deine Gedanken nicht über den direkten Weg in Code bannen kannst, dann solltest du den Zwischenschritt über den Programmablaufplan in Erwägung ziehen.
Das soll heißen: Beim nächsten Mal will ich ein Flussdiagramm sehen.
 
Code:
/* DMX-Adressengeber
Version: 0.1
Datum: 027.02.2009
Autor: Finn 'Kani' Schürmann
Target: AtMega 8515
Lizenz: Keine
*/


#define F_CPU 1000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>



int main (void)
{
    DDRC = 0b11111111;  // Alles auf Ausgang - Das sind die  Segmente
    DDRA = 0b00000111;  // PA0-2 auf Ausgang - Das sind die Transistoren
    DDRB = 0xFF;        // DMX-Ausgabe
    DDRD = 0xFF;        // DMX-Ausgabe 2
    PORTC = 0b00000000; // Alles auf Low da die Segmente die Kathoden sind
    PORTA = 0b11111111;  // Das schaltet den PNP-Transistor an PA7 ein
    
    //Variablen definieren
    
    unsigned char ziffer=0;
    int entprellcount1, entprellcount2;
    int zaehlwertlastround; 
    int zaehlwertlastswitchon;
    long int zaehlwertroundcount;
    int zaehlwert=1;
    unsigned char letztetastenposition1,letztetastenposition2;
    unsigned char stelle1,stelle2,stelle3;
    unsigned char stellezwischenschritt;
    unsigned char seg[] =
        {
        0b11100111,//0
        0b10000100,//1
        0b11010011,//2
        0b11010110,//3
        0b10110100,//4
        0b01110110,//5
        0b01110111,//6
        0b11000100,//7
        0b11110111,//8
        0b11110110,//9
        };

    zaehlwertlastswitchon = eeprom_read_word(10);
    zaehlwert = zaehlwertlastswitchon;
    
    while(1)
    {
        _delay_ms(3);        //While-Schleife verlangsamen damit die Transistoren nicht zu oft schalten

        zaehlwertroundcount++;

        ziffer++;

        //Taster 1 (Up)

        if( ! (PINA & (1<<PA6) ))
        {
            entprellcount1++;
        }            
        else
        {
            entprellcount1=0;
        }
        
        if(entprellcount1 > 10)
        {
                if( ! letztetastenposition1)
                {
                    if(DDRC==0xFF)
                    {
                        zaehlwert++;
                    }
                    else
                    {
                        zaehlwertroundcount = 0;
                    }
                    
                    DDRC=0xFF;
                }

            letztetastenposition1=1;
        }
        else
        {
            letztetastenposition1=0;
        }

        if(entprellcount1 == 300)
        {
            zaehlwert++;
            entprellcount1=300-4;
        }
        //Taster 2 (Down)
        
        if( ! (PINA & (1<<PA7) ))
        {
            entprellcount2++;
        }            
        else
        {
            entprellcount2=0;
        }
        
        if(entprellcount2 > 10)
        {
                if( ! letztetastenposition2)
                {
                    if(DDRC==0xFF)
                    {
                        zaehlwert--;
                    }
                    else
                    {
                        zaehlwertroundcount = 0;
                    }

                    DDRC=0xFF;
                }

            letztetastenposition2=1;
        }
        else
        {
            letztetastenposition2=0;
        }
        
        if(entprellcount2 == 300)
        {
            zaehlwert--;
            entprellcount2=300-4;
        }
        //Taster 2 ENDE
        
        
        //Kanal-Begrezung

        if(zaehlwert >512)
        {
          zaehlwert=1;
        }    
        
        if(zaehlwert < 1)
        {
            zaehlwert = 512;
        }            
          
        // 7-Segment-Anzeigen splitten

        stelle1 = zaehlwert/100;
        stellezwischenschritt = zaehlwert/10;
        stelle2 = stellezwischenschritt - (stelle1*10);
        stelle3 = zaehlwert - (stellezwischenschritt*10);

        if(zaehlwertlastround != zaehlwert)
        {
            zaehlwertroundcount=0;
        }

        if(zaehlwertroundcount == 1200)
        {
            PORTB=    zaehlwert;
            PORTD=    zaehlwert>>8;
        }
        
        if(zaehlwertroundcount == 36000)
        {
            if(zaehlwert != zaehlwertlastswitchon)
            {
                eeprom_write_word(10,zaehlwert);
                zaehlwertlastswitchon=zaehlwert;
            }
            
            DDRC = 0b00001000;
        }

        //Schleifendurchläufzähler begrenzen
        
        if(ziffer>3)
        {
          ziffer=1;
        }  
        
        //Transistoren schalten

       if(ziffer == 3)
        {
            PORTA = 0b1111110;        //Ausgang low    
            PORTC =~ seg[stelle3];
            
            if(DDRC==0b00001000)
            {
                PORTC = 0b11110111;
            }
        }

        if(ziffer == 2)
        {
            PORTA = 0b11111101;        //Ausgang low
            PORTC =~ seg[stelle2];
        }

        if(ziffer == 1)
        {
            PORTA = 0b11111011;        //Ausgang low
            PORTC =~ seg[stelle1];
        }
    zaehlwertlastround = zaehlwert;
  
    }

    return 0;            
}   //END MAIN
 
Wie messe ich eigentlich eine Spannung oder Widerstand eines Temperaturfühlers? Mit dem ADC-Pin?
 
Hat der 8515 überhaupt einen ADU? Ich seh nichts.
Du kannst aber mit einer PWM einem RC-Glied und dem Analog Komperator einen eigenen kleinen ADU bauen wenn du willst.


Was ich aber eigentlich sagen wollte: Wir sollten doch dieses Kani Coaching -Dingens durchziehen. Mach einfach ein neues Thema auf wenn du soweit bist.(Ein "Nein, mit dem Vorgeplänkel bin ich schon durch" wird es da nicht geben, wir fangen von 0 an)
 
Hi Nomis, Kani,

der ATmega8515 hat keinen ADC!

Gruß,
Markus
 
N'Abend.

Ich habe mal an dem DMX-Adressengeber weitergearbeitet.
Habt ihr eventuell noch Verbesserungen für meine Platine?

Eine erste "Vor-ab-Version" habe ich mal als Anhang hochgeladen.
Die LEDs Links kommen wieder raus, bleiben bei meiner Schaltung allerdings drin, damit ich einfacher sehen kann, ob die Binäre Ausgabe funktioniert oder nicht.

Ich weiß auch, dass ich mir die Mühe mit den verdrahten der 7-Segment-Anzeigen garnicht machen müsste, da sie ja eh in ein Gehäuse kommen - denke ich mal. Ich wollte die Platine, wenn sie denn fertig ist, weg legen (deßhalb kommen die Anzeigen mit auf die Platine).
 

Anhänge

  • Unbenannt.jpg
    Unbenannt.jpg
    182 KB · Aufrufe: 14
Hallo Finn, altes Haus ! :)

Lange nichts von dir gehört. Schön das du noch dabei bist :)

Wenn Zeit ist kann ich ja mal drübersehen ...
Heute abend ist mein Kopf aber schon etwas leer ... :vollkommenauf:
Gleich mal ein wenig Augenschonung betreiben ... :sleep: ;)

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)