Warum denkst du an die Datenmenge, die du mit 512 Kanälen übermittelnDas 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.
Dann will ich dir die Antwort mal geben (ich bin ja nicht so) ...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 ! Los ! Antworten
Über dieses Problem nachzudenken wird dir mal dabei helfen, Resourcen in Prozessoren zu sparen.
/* 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
/* 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