Durch Tastendrucke + 7 Segment Ports Schalten

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

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

int main (void)
{
	//Variablen definieren
	unsigned char Ziffer=0;
	int Zaehlwert=0;
	unsigned char letzteTastenposition1,letzteTastenposition2;
	unsigned char array[] = 
		{ 
		0b00000000,//0 
		0b00000000,//1 
		0b00000000,//2 
		0b00000000,//3 
		0b00000000,//4 
		0b00000000,//5 
		0b00000000,//6 
		0b00000000,//7 
		0b00000000,//8 
		0b00000000;//9 
		}
	while(1)
	{
		//While-Schleife verlangsamen
		//delay_ms() oder vllt. Watchdog?
		
		if( ! PINA & (1<<PA4) ))		//Wenn Up-Taster gedrüct wird
		{
			if(!letzteTastenposition1)	//Was bringt diese Anweisung, mann kan das doch direkt in die ersten if schreiben oder nicht?
			{
				Zaehlwert++;			//Zaehlwert einen hoch. 100 => 101
			}
		letzteTastenposition1=1			//Was wird hier gemacht?
		}
		else
		{	
			letzteTastenposition1=0;	//Hier wird der Taster zurückgesetzt?
		}

Soweit bin ich jetzt. Morgen kommt das nächste. Ich habe ein paar Kommentare reingeschrieben. Könntest du bitte schauen, ob das so richtig ist? Ich weiß deine Hilfe sehr zu schätzen. :)
 
Als allererstes: Ein Programmierer macht keine Klammern{ auf, wenn er nicht auch vorhat sie wieder zuzumachen}. Mmmkay?


Zum Verzögern: Watchdog ist dafür nicht gedacht. Mmmkay?
delay_ms() war aber genau das woran ich gedacht habe.


Mmmkay! Wir versuchen hier eine Flankenabfrage mit den Tastern zu machen. Das heißt dass der Zähler nur dann inkrementiert(++) oder dekrementiert(--) wenn der Taster gerade runtergedrückt WURDE.
Erinnere dich dass die Hauptschleife jede ms einmal durchlaufen soll, würde man nur überprüfen ob der Taster gerade gedrückt IST würde der Zählwert jede ms um eins Steigen/Sinken. Mmmkay?
Das wäre nicht sehr User- freundlich, Mmmkay!

Beispiel:
Du musst dir vorstellen dass der Controller diese Stelle 1000 mal in der Sekunde durchläuft:
Code:
if( ! PINA & (1<<PA4) ))		//Wenn Up-Taster gedrüct wird (IST)
		{
			if(!letzteTastenposition1)	//Was bringt diese Anweisung, mann kan das doch direkt in die ersten if schreiben oder nicht?
			{
				Zaehlwert++;			//Zaehlwert einen hoch. 100 => 101
			}
		letzteTastenposition1=1			//Was wird hier gemacht?
/*Hier merkt sich das Programm dass der Taster beim letzten Schleifendurchlauf gedrücht war*/

		}
		else
		{	
			letzteTastenposition1=0;	//Hier wird der Taster zurückgesetzt?
/*Nein!Hier merkt sich das Programm dass der Taster beim letzten Schleifendurchlauf nicht gedrücht war*/
		}
Wenn der Taster zu dem Zeitpunkt nicht gedrückt war steht die Variable letzteTastenposition1 auf 0.
für den Nächsten Schleifendurchlauf drücken wir den Taster mal runter:
Code:
 if( ! (PINA & (1<<PA4) ) )
    {
      //der Taster ist gedrückt
      if( ! letzteTastenposition1) //abfragen ob letzteTastenposition1 1 oder 0 ist
      {
       /*Der Taster war im letzten Schleifendurchlauf nicht gedrückt
       weshalb das Programm jetzt den Zaehlwert um eins erhöht:
       */
        Zaehlwert++;
      }
      /* das Programm merkt sich aber dass es für den derzeitigen Tastendruck
      schon einmal hochgezählt hat
      */
      letzteTastenposition1=1;
    }
    else
    {
      /*Der Taster ist gedrückt deshalb springt das Programm auch nicht hier 
      rein*/
      letzteTastenposition1=0;
    }
Da wir den Taster innerhalb einer Millisekunde nicht loslassen können ist er im nächsten Schleifendurchlauf noch immer gedrückt.

Code:
 if( ! (PINA & (1<<PA4) ) )
    {
      //der Taster ist gedrückt
      /*
      man erinnere sich: 
      letzteTastenposition1=1;(und zwar noch vom letzten Schleifendurchlauf)
      */

      if( ! letzteTastenposition1)
      {
       /*Der Taster war im letzten Schleifendurchlauf gedrückt
       weshalb das Programm jetzt den Zaehlwert nicht um eins erhöht:
       */
        Zaehlwert++;
      }
      letzteTastenposition1=1;
    }
    else
    {
      /*Der Taster ist gedrückt deshalb springt das Programm auch nicht hier 
      rein*/
      letzteTastenposition1=0;
    }
 
Code:
int main(void)
{
  /*
  Variablen Definieren.
  z.b. auch das Array
  */ 
  unsigned char letzteTastenposition1,letzteTastenposition2;
  int Zaehlwert=0;

  while(1)
  {
    /*
    hier villeicht eine Funktion aufrufen, die sicherstellt 
    dass die Schleifendurchläufe nicht zu kurz werden.
    Die Transistoren sollen nicht zu oft schalten.
    */ 

     /*
    Taster Abfragen.
    */
    if( ! (PINA & (1<<PA4) ) )
    {
      //der Taster ist gedrückt
      if(!letzteTastenposition1)
      {
        /*
        Der Taster wurde gerade gedrückt.
        Selbst wenn er weiterhin gedrückt          
        werden würde, würde das Programm 
        nicht mehr hier her Springen
        */

        Zaehlwert++;
      }
      letzteTastenposition1=1;
    }
    else
    {
      //Der Taster ist nicht gedrückt
      letzteTastenposition1=0;
    }

 while(1)
  {
    /*
    hier villeicht eine Funktion aufrufen, die sicherstellt 
    dass die Schleifendurchläufe nicht zu kurz werden.
    Die Transistoren sollen nicht zu oft schalten.
    */ 

     /*
    Taster Abfragen.
    */
    if( ! (PINA & (1<<PA3) ) )
    {
      //der Taster ist gedrückt
      if(!letzteTastenposition2)
      {
        /*
        Der Taster wurde gerade gedrückt.
        Selbst wenn er weiterhin gedrückt          
        werden würde, würde das Programm 
        nicht mehr hier her Springen
        */

        Zaehlwert--;
      }
      letzteTastenposition2=1;
    }
    else
    {
      //Der Taster ist nicht gedrückt
      letzteTastenposition2=0;
    }

	

    /*
    Zeit sich um die 7Seg-Anzeige zu kümmern
    */ 

    /*
    Zählwert für DMX ausgeben
    */
  }
  return 0;
}

Au weia! Ich les das erst jetzt.
1) Klammern überprüfen.
2)Eine while(1) läuft ewiglich! Wenn die erste while(1) schon die ganze Zeit läuft, wann kommt denn bitte die 2te while(1) an die Reihe?
 
Aaaalso - Mmmkay!
Ich weiß nicht was mit dir los ist, entweder du bist betrunken, stehst sonst unter irgendeinen von Drogen hervorgerufenen Rausch und/oder hast einfach nur die letzen 10 Staffeln Southpark geschaut und fandest Mr. Mackey zum heulen lustig. (Von dem stammt nämlich das "Mmmkay!") ;) :cool: :aetsch:
Ich habe nichts gegen Kritik, nur wenn sie nicht konstruktiv ist und sie jemand auf provozierende und "angeberische" Weise wiedergibt. Klingt logisch, ist auch so! - Mmmkay! ;-) (Ich denke du kannst dir vorstellen was ich meine.)
Soviel dazu! Sorry, nehm das bitte nicht persönlich, ich bin dankbar für jede Hilfe, geduldig und schätze jeden Tipp. Vorallem wenn man die Leute nicht perönlich kennt, weiß man im Internet nicht, wen man "vor sich" hat, deßhalb versuche ich, wenn mir irgendwas "gegen den Strich" geht, immer förmlich zu bleiben.
_______________________________________________________________
Zu deinen Kommentaren:
Ein Programmierer macht keine Klammern{ auf, wenn er nicht auch vorhat sie wieder zuzumachen}. Mmmkay?
Ich habe extra geschrieben, dass ist noch nicht fertig bin!
delay_ms() war aber genau das woran ich gedacht habe.
Danke. Ich glaube das habe ich irgendwo schonmal geschrieben. Wenn nicht, tut es mir leid, Vorwürfe gemacht zu haben.
Au weia! Ich les das erst jetzt.
...
2)Eine while(1) läuft ewiglich! Wenn die erste while(1) schon die ganze Zeit läuft, wann kommt denn bitte die 2te while(1) an die Reihe?
Hast du selber gemerkt, dass du im Beipsiel deiner seits vorrangegangen bist und While () immer auf wahr (=1 oder nicht?) gesetzt hast? (Bezug auf "Au Waia") Ich habe mir da auch Gedanken drum gemacht, dass wäre meine nächste Frage an Dich gewesen.
Ich werde morgen mal deine Ratschläge befolgen. Trotzdem Danke ich vom ganzen Herzen. Allerdings, auch wenn ich jetzt ein bisschen übertrieben reagiere, fande ich dieses "Mmmkay!" schon ziemlich dreist. Man hilft Menschen nicht, in denen man die "niedermacht". Jedoch hoffe ich, dass du mir weiter hilfst und schlucke das jetzt einfach, da du meine Hilfe bist (und hoffentlich auch bleibst). Ich kenne mich mit Konflikten aus. (Jahrelange Jugendarbeit z.B).

Naja gut.
Gute Nacht noch und bis morgen.
Danke!
Mit freundlichen Grüßen,
Finn
 
It's easy mmmkay! :D

Ja! Es tut mir leid. Ich hab das was du nacher noch draneditiert hast nicht mehr gelesen.
Du verzeihst mir doch, mmmkay?
 
Aaaalso - Mmmkay!
Ich weiß nicht was mit dir los ist, entweder du bist betrunken, stehst sonst unter irgendeinen von Drogen hervorgerufenen Rausch und/

Reggae, Lavalampen und ......äh Southpark natürlich.

Nein im Ernst: Ich bin gegen Drogen, es sei denn die sind von einem Artzt verschrieben. Ich trinke nichtmal.
 
Mmmkay! xD
Hab vllt. ein bisschen überreagiert. Aber ist ja ok. xD
Ich mach gleich mal weiter. While(), also ohne Zahl drin, ist richtig oder?
Wenn da eine 0 drin wäre, wäre der Taster ja nie gedrückt werden.
 
So. Ich habe den zweiten Taster auch noch mit eingefügt. Kannst dir ja mal anschauen.

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

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

int main (void)
{
	//Variablen definieren
	unsigned char Ziffer=0;
	int Zaehlwert=0;
	unsigned char letzteTastenposition1,letzteTastenposition2;
	unsigned char array[] = 
		{ 
		0b00000000,//0 
		0b00000000,//1 
		0b00000000,//2 
		0b00000000,//3 
		0b00000000,//4 
		0b00000000,//5 
		0b00000000,//6 
		0b00000000,//7 
		0b00000000,//8 
		0b00000000;//9 
		}
	
	while()
	{
		_delay_ms(5);					//While-Schleife verlangsamen
		
		//Taster 1 (Up)

		if( ! PINA & (1<<PA4) ))		//Wenn Up-Taster gedrüct ist
		{
			if(!letzteTastenposition1)	//
			{
				Zaehlwert++;			//Zaehlwert einen hoch. 100 => 101
			}
		letzteTastenposition1=1			
		}
			else
			{	
			letzteTastenposition1=0;	//Taster bei letztem Schleifendurchlauf nicht gedrückt
			}
		}	//Taster 1 ENDE
		
		//Taster 2 (Down)
		
		if( ! PINA & (1<<PA3) ))
		{
			if(!letzte Tastenposition2)
			{
				Zaehlwert--;			
			}
		letzteTastenposition2=1
		}
			else
			{	
				letzteTastenposition2=0;
			}
		}	//Taster 2 ENDE
		
		
		// SIEBEN-SEGMENT-ANZEIGEN!!
		
			
}   //Main-Schleife => Zu
 
Ja Passt.
Die Wahrheitstabelle kannst du schon ausfüllen, du kannst die Begrenzung für den Zählwert mit einbauen und selbst wie du die Adressen an das DMX-Dingens weitergibt hab ich schon mal gepostet.

Außerdem hab ich dir im Post# 18 schon angedeutet wie du die einzelnen Ziffern anzeigen lassen kannst.(denk daran: in jedem Schleifendurchlauf wird nur eine Ziffer angezeigt)
Wie du die Ziffern errechnest weißt du ja schon und wie du sie ausgibst hab ich auch schon verraten.

wenn du das hast kannst du das Programm nochmal Posten.
Danach kannst du gleich mal versuchen den Algorithmus soweit auszubauen dass, wenn die Taste etwas länger gedrückt wurde schneller hochgezählt wird
 
Min Jung! Streng die Birne an!

Wenn man sich Gedanken um einen Algorithmus macht formuliert man ihn zuerst auf deutsch aus:
Während 3 Schleifendurchläufen sollen sich volgende Vorgänge abspielen:

In jedem Durchlauf) Soll der Zählwert auf 3 Ziffern aufgespalten werden.

Im 1.Durchlauf) Die zuvor in der Hauptschleife(while(1)) ermittelte höherwertige Ziffer soll an der Linken 7Seg ausgegeben werden.

Im 2.Durchlauf) Die zuvor in der Hauptschleife(while(1)) ermittelte mittlere Ziffer soll an der mittleren 7Seg ausgegeben werden.

Im 3.Durchlauf) Die zuvor in der Hauptschleife(while(1)) ermittelte niederwertigste Ziffer soll an der linken 7Seg ausgegeben werden.

Danach soll sich das Ganze wieder wiederholen.

Was Braucht man dazu:
1)Eine Variable in der sich das Programm merken kann, in welchem der 3 Durchläufe es sich gerade befindet(Verweis auf Post 18).
Diese Variable sollte in jedem Durchlauf um eins erhöht werden und falls sie den Wert 3 überschreitet wieder auf 0 zurückgesetzt werden.

2)Eine Abfrage in welchem der drei Durchläufe man sich gerade befindet.
if( ... == ...);//geschickter wäre switch case aber if kennen wir schon

3)Wir müssen wissen wie wir den Transistor einer 7Segment aktiviren und wie wir danach die einzelnen Segmente ansprechen: Um einen Transistor Durchsalten zu lassen, müssen sollten wir nur den Entsprechenden PORT(pin) auf Low(gegen Masse, auf 0) schalten.
Wie wir danach die einzelnen Segmente ansprechen wissen wir schon(habs ein paar mal geschrieben).


So und jetzt übersetz das von Deutsch auf C.
 
Hiermal mein aktueller Stand.

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

#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#define F_CPU 16000000UL

int main (void)
{
	//Variablen definieren
	unsigned char ziffer=0;
	int zaehlwert=0;
	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
		}
	
	while()
	{
		_delay_ms(5);					//While-Schleife verlangsamen
		
		//Taster 1 (Up)

		if( ! PINA & (1<<PA4) ))		//Wenn Up-Taster gedrüct ist
		{
			if(!letztetastenposition1)	//
			{
				zaehlwert++;			//Zaehlwert einen hoch. 100 => 101
			}
		letztetastenposition1=1			
		}
			else
			{	
			letztetastenposition1=0;	//Taster bei letztem Schleifendurchlauf nicht gedrückt
			}
		}	//Taster 1 ENDE
		
		//Taster 2 (Down)
		
		if( ! PINA & (1<<PA3) ))
		{
			if(!letztetastenposition2)
			{
				zaehlwert--;			
			}
		letztetastenposition2=1
		}
			else
			{	
				letztetastenposition2=0;
			}	//Taster 2 ENDE
			
		//Kanal-Begrezung

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

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

		switch(stelle1)
		{
			PORTC = count[0];
			PORTC = count[1];
			PORTC = count[2];
			PORTC = count[3];
			PORTC = count[4];
			PORTC = count[5];
			PORTC = count[6];
			PORTC = count[7];
			PORTC = count[8];
			PORTC = count[9];
		}

		switch(stelle2)
		{
			PORTC = count[0];
			PORTC = count[1];
			PORTC = count[2];
			PORTC = count[3];
			PORTC = count[4];
			PORTC = count[5];
			PORTC = count[6];
			PORTC = count[7];
			PORTC = count[8];
			PORTC = count[9];
		}

		switch(stelle3)
		{
			PORTC = count[0];
			PORTC = count[1];
			PORTC = count[2];
			PORTC = count[3];
			PORTC = count[4];
			PORTC = count[5];
			PORTC = count[6];
			PORTC = count[7];
			PORTC = count[8];
			PORTC = count[9];
		}


		// SIEBEN-SEGMENT-ANZEIGEN!!
		
	return 0;			
}   //Main-Schleife => Zu

Hups, dass switch-case ist ja noch garnicht fertig. Da fehlt ja noch, welche Variable mit stelle1 passt.
Wie man die nacheinander ansteuert weiß ich noch nicht. Kannst du mir vllt. einen Tipp geben? Wie man Pins usw schaltet weiß ich.
 
Auch wenn du noch nicht fertig bist ist das absolut der Falsche Ansatz.
Überall wo switch steht hast du mist gebaut.

1)Wo ist die Stelle wo die Variable, in der gespeichert ist welche Ziffer im aktuellen Schleifendurchlauf gerade angezeigt werden soll hochzählst?

2)Hast du dir dir schon mal was über switch-Case Durchgelesen?(sieht nicht so aus)

3)Wieso benennst du das Array mit deiner Wahrheitstabelle am Anfang mit "seg[]" und schreibst dann zeilen wie "PORTC = count[9];"?

4) Wieso belegst du denn den PortC so oft hintereinander mit neuen Werten

5)Gut du bist noch nicht fertig, aber vergiss nicht die Transistoren, die die 7Segs auswählen, durchzuschalten.

Nur Mut, du wirst es schon lernen.
 
Aktuell:
Code:
/* DMX-Adressengeber
Version: 0.1
Datum: 027.02.2009
Autor: Finn 'Kani' Schürmann
Target: AtMega 8515
Lizenz: Keine
*/

#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#define F_CPU 16000000UL

int main (void)
{
    //Variablen definieren
    unsigned char ziffer=0;
    int zaehlwert=0;
    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
        }
    
    while()
    {
        _delay_ms(5);                    //While-Schleife verlangsamen
        
        //Taster 1 (Up)

        if( ! PINA & (1<<PA4) ))        //Wenn Up-Taster gedrüct ist
        {
            if(!letztetastenposition1)    //
            {
                zaehlwert++;            //Zaehlwert einen hoch. 100 => 101
            }
        letztetastenposition1=1            
        }
            else
            {    
            letztetastenposition1=0;    //Taster bei letztem Schleifendurchlauf nicht gedrückt
            }
        }    //Taster 1 ENDE
        
        //Taster 2 (Down)
        
        if( ! PINA & (1<<PA3) ))
        {
            if(!letztetastenposition2)
            {
                zaehlwert--;            
            }
        letztetastenposition2=1
        }
            else
            {    
                letztetastenposition2=0;
            }    //Taster 2 ENDE
            
        //Kanal-Begrezung

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

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

        //Schleifendurchläufzähler begrenzen

        if(ziffer > 3)
        {    
            ziffer = 1;
        {
    
        switch(stelle1)
        {
            case '0' : PORTC = count[0] ; break;
            case '1' : PORTC = count[1] ; break;
            case '2' : PORTC = count[2] ; break;
            case '3' : PORTC = count[3] ; break;
            case '4' : PORTC = count[4] ; break;
            case '5' : PORTC = count[5] ; break;
            case '6' : PORTC = count[6] ; break;
            case '7' : PORTC = count[7] ; break;
            case '8' : PORTC = count[8] ; break;
            case '9' : PORTC = count[9] ; break;
        }

        switch(stelle2)
        {
            case '0' : PORTC = count[0] ; break;
            case '1' : PORTC = count[1] ; break;
            case '2' : PORTC = count[2] ; break;
            case '3' : PORTC = count[3] ; break;
            case '4' : PORTC = count[4] ; break;
            case '5' : PORTC = count[5] ; break;
            case '6' : PORTC = count[6] ; break;
            case '7' : PORTC = count[7] ; break;
            case '8' : PORTC = count[8] ; break;
            case '9' : PORTC = count[9] ; break;
        }

        switch(stelle3)
        {
            case '0' : PORTC = count[0] ; break;
            case '1' : PORTC = count[1] ; break;
            case '2' : PORTC = count[2] ; break;
            case '3' : PORTC = count[3] ; break;
            case '4' : PORTC = count[4] ; break;
            case '5' : PORTC = count[5] ; break;
            case '6' : PORTC = count[6] ; break;
            case '7' : PORTC = count[7] ; break;
            case '8' : PORTC = count[8] ; break;
            case '9' : PORTC = count[9] ; break;
        }

        
        
    return 0;            
}   //Main-Schleife => Zu
1. Zu dem Array "seg". Woher weiß der Mikrocontroller, welcher Port gemeint ist, wenn ich nicht PORTC schreibe?

2. Kann ich die Schleifendurchläufe durch das speichern in einer Variablen bestimmen? Wie gebe ich das dann aus? :pcguru:

3. Transistoren schalten.
Wenn Ziffer = 1, dann schalte PA5 an. PA6 und PA7 aus.
Wenn Ziffer = 2, dann schalte PA6 an. PA5 und PA7 aus.
Wenn Ziffer = 3, dann schalte PA7 an. PA5 und PA6 aus.
 
1)Wieso Benennst du das Array mit seg[] und versuchst mit count darauf zuzugreifen?


2)Switch Case ist zwar jetzt syntaxmäßig richtig, aber sie dir nochmal genauer an was du willst.

So wie du schreibst übergibst du beispielsweise dem PORTC den 0ten Wert aus dem Array wenn die erste Stelle 0 ist, oder übergibst dem PORTC den 1ten Wert des Arrays wenn die Stelle den Wert 1 hat.
Wieso Schreibst du dann nicht:
PORTC = count[stelle1];
Damit sparst du dir ein switch case, was aber nicht heist dass du nicht noch eins brauchst(oder wahlweise 3 if).



3)Bezüglich der Variable "Ziffer" bist du schon auf dem richtigen Weg. Du solltest sie aber noch hochzählen(++).
 
Mit "PORTC = count[stelle1];" will ich doch einen bestimmt Ziffer auf der 7-Segment-Anzeige anzeigen lassen. Jetzt ist doch der Bezug zum Array mit der Wahrheitstabelle verloren oder?
Code:
    unsigned char count[] = 
        { 
        0b11100111,//0 
        0b10000100,//1 
        0b11010011,//2 
        0b11010110,//3 
        0b10110100,//4 
        0b01110110,//5 
        0b01110111,//6 
        0b11000100,//7 
        0b11110111,//8 
        0b11110110;//9
        }
Die angesprochenen 3 if sind ja für die zuweisung, wo welche Ziffer angezeigt wird.

_________________________________
Code:
while()
    {
        _delay_ms(10);                    //While-Schleife verlangsamen
        
        ziffer++;

        //Taster 1 (Up)

        if( ! PINA & (1<<PA4) ))        //Wenn Up-Taster gedrüct ist
        {
            if(!letztetastenposition1)    //
            {
                zaehlwert++;            //Zaehlwert einen hoch. 100 => 101
            }
        letztetastenposition1=1            
        }
            else
            {    
            letztetastenposition1=0;    //Taster bei letztem Schleifendurchlauf nicht gedrückt
            }
        }    //Taster 1 ENDE
"ziffer" wird durch jeden Schleifendurchlauf um einen erhöht und durch
Code:
if(ziffer > 3)
        {    
            ziffer = 1;
nach 3 Stück wieder auf 1 gesetzt.
 
Code:
/* DMX-Adressengeber
Version: 0.1
Datum: 027.02.2009
Autor: Finn 'Kani' Schürmann
Target: AtMega 8515
Lizenz: Keine
*/

#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#define F_CPU 16000000UL

int main (void)
{
    DDRC = 0xFF;    //PORTC auf Ausgang
    
    
    //Variablen definieren
    unsigned char ziffer=0;
    int zaehlwert=0;
    unsigned char letztetastenposition1,letztetastenposition2;
    unsigned char stelle1,stelle2,stelle3; 
    unsigned char stellezwischenschritt; 
    unsigned char count[] = 
        { 
        0b11100111,//0 
        0b10000100,//1 
        0b11010011,//2 
        0b11010110,//3 
        0b10110100,//4 
        0b01110110,//5 
        0b01110111,//6 
        0b11000100,//7 
        0b11110111,//8 
        0b11110110;//9
        }
    
    while()
    {
        _delay_ms(10);                    //While-Schleife verlangsamen
        
        ziffer++;

        //Taster 1 (Up)

        if( ! PINA & (1<<PA4) ))        //Wenn Up-Taster gedrüct ist
        {
            if(!letztetastenposition1)    //
            {
                zaehlwert++;            //Zaehlwert einen hoch. 100 => 101
            }
        letztetastenposition1=1            
        }
            else
            {    
            letztetastenposition1=0;    //Taster bei letztem Schleifendurchlauf nicht gedrückt
            }
        }    //Taster 1 ENDE
        
        //Taster 2 (Down)
        
        if( ! PINA & (1<<PA3) ))
        {
            if(!letztetastenposition2)
            {
                zaehlwert--;            
            }
        letztetastenposition2=1
        }
            else
            {    
                letztetastenposition2=0;
            }    //Taster 2 ENDE
            
        //Kanal-Begrezung

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

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

        //Schleifendurchläufzähler begrenzen

        if(ziffer > 3)
        {    
            ziffer = 1;
        {
    
        if(ziffer = 1)
        {
            DDRA &= ~( (1<<PA5 );    //Ausgang setzen => AN
            DDRA |= ( 1<<PA6 ) | ( 1<<PA7 ) );        //Eingang => AUS
        }

        if(ziffer = 2)
        {
            DDRA &= ~( 1<<PA6 );    
            DDRA |= ( 1<<PA5 ) | ( 1<<PA7 ) );
        }

        if(ziffer = 3)
        {
            DDRA &= ~( (1<<PA7 );
            DDRA |= ( 1<<PA5 ) | ( 1<<PA7 ) );
        }


        if(ziffer = 1)

        PORTC = count[stelle1];
        PORTC = count[stelle1];
        PORTC = count[stelle1];
        PORTC = count[ste];
        PORTC = count[4];
        PORTC = count[5];
        PORTC = count[6];
        PORTC = count[7];
        PORTC = conut[8];
        PORTC = count[9];


        
        
    return 0;            
}   //Main-Schleife => Zu

Das das Array noch nicht funktioniert weiß ich.
 
Fast!

Die ersten 3 beziehen sich auf den codeschnipsel
Code:
  if(ziffer = 1)
        {
            DDRA &= ~( (1<<PA5 );    //Ausgang setzen => AN
            DDRA |= ( 1<<PA6 ) | ( 1<<PA7 ) );        //Eingang => AUS
        }
1) Du sollst jeweils nur den Transistor Durschalten der zum 7Seg passt.

2) "=" ist eine Zuweisung. "==" ist ein vergleich.

3)Du musst innerhalb dieses(und der 2 anderen) IFs noch das Array auslesen und somit die Pins für die einzelnen segmente durchschalten. z.b.
PORTC = count[stelle1];


4)Was soll das? Das ist Fehl am Platz.
Code:
 if(ziffer = 1)

        PORTC = count[stelle1];
        PORTC = count[stelle1];
        PORTC = count[stelle1];
        PORTC = count[ste];
        PORTC = count[4];
        PORTC = count[5];
        PORTC = count[6];
        PORTC = count[7];
        PORTC = conut[8];
        PORTC = count[9];
 

Ü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)