also der 6-polige Stecker vom Programmer hat an einer Breit-Seite einen kleinenWieviel Spannung muss an den ISP Pins und - anliegen? Ich habe auch schon die Kabel getauscht, also auch kein Kabelbruch.
ISP-Anschluß
__
| |
MISO 1 <|OO| 2 VTG
SCK 3 |OO| 4 MOSI
RST 5 |OO| 6 GND
|__|
sieht so aus ;-)Ups, Fehler gefunden!
/* 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 = 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;
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(1)
{
_delay_ms(10); //While-Schleife verlangsamen damit die Transistoren nicht zu oft schalten
ziffer++;
//Taster 1 (Up)
if( ! (PINA & (1<<PA3) )) //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<<PA4) ))
{
if(!letztetastenposition2)
{
zaehlwert--;
}
letztetastenposition2=1;
}
else
{
letztetastenposition2=0;
} //Taster 2 ENDE
//Kanal-Begrezung
if(zaehlwert >511)
{
zaehlwert=0;
}
if(zaehlwert < 0)
{
zaehlwert = 512;
}
// 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 = 0b1111110; //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
noch nen Bock drinDer Fehler ist - naja, sagen wir mal - dämlich. Wie Dino schon meinte, sieht man oft den Wald for lauter Bäumen nicht mehr. Schaut euch mal das letzte Bild an. Blickpunkt: Widerstände.
/* 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 1000000UL
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;
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(1)
{
_delay_ms(10); //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) //
{
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<<PA7) ))
{
if(!letztetastenposition2)
{
zaehlwert--;
}
letztetastenposition2=1;
}
else
{
letztetastenposition2=0;
} //Taster 2 ENDE
//Kanal-Begrezung
if(zaehlwert >511)
{
zaehlwert=0;
}
if(zaehlwert < 0)
{
zaehlwert = 512;
}
// 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 = 0b1111110; //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
@Nomis: Jap ich bin doof, ich weiß
Jeder hat seine Spezialgebiete.
Der ist aber schonmal geschubst worden, und zwar von mir und in die andere Richtung.Aber für nen Gedankenschubs sollte es reichen ;-)
der Algorithmus klappt gut. Pro Hauptschleifendurchlauf wird 1 Bit in dasIch muss aber sagen dass der Algorithmus den Kani bisher angestrebt hat besser auf unterschiedliche Prellverhalten adaptierbar ist.
Was wenn die Zeit zwischen den den Prellflanken so groß ist dass damit ein ganzes byte mit 1ern gefüllt werden kann? Ich würd aber grob schätzen dass dein Algorithmus in diesem Fall(bei kanis Abtastrate) praktischer ist.
das ist kein Allrounder. Bei meinem Analyzer hab ich über PinChangeInterruptAlso ist Dino's Lösung der "Allrounder"?
Dann probier ich das mal. Ich melde mich, wenn ich soweit bin.