Servus,
ich hab mal mim Simulator (AVR Studio 4) für den ATMega16 eine Uhr geschrieben (Code am Ende).
Jetzt sind mir ein paar Fragen zum Anschluss gekommen. Wenn ich z.B. PB0 auf 1 setze (sprich PORTB = 0x01:wink: wird dann der Pin 1 mit GND oder VCC verbunden (habe noch keine Platform wo ich das testen kann…)?
Ich werd aus dem Datasheet in dem Punkt nicht schlau.
Benötige ich Widerstände zwischen den Pins und den Trasistoren für die 7-Segment-Anzeige? Ich komm irgendwie nicht drauf, welcher Strom zwischen Basis und PinX herrscht…
Was den Code Betrifft:
Standardmäßige Bezeichnung der Segmente a-h (inklusive Punkt) ist PortB, PINA zwei Taster und Multiplexing für die vier anzeigen.
#include
#include
#include
//Variablen für die Zeit
volatile unsigned int millisekunden;
volatile unsigned int sekunde;
volatile unsigned int minute;
volatile unsigned int stunde;
volatile unsigned int minute_dekade;
volatile unsigned int stunde_dekade;
volatile unsigned char cache_a=0;
unsigned int lastpress_hou = 0;
unsigned int lastpress_min = 0;
int main(void)
{
// Timer 0 konfigurieren
TCCR0 = 9;
OCR0 = 200-1;
TIMSK |= (12500?toSegment(stunde)+128:toSegment(stunde));
cache_a=2;
break;
case 2:
cache_b=toSegment(minute_dekade);
cache_a=4;
break;
case 3:
cache_b=toSegment(minute);
cache_a=8;
panel=-1;
break;
}
PORTB=cache_b;
PORTA=cache_a;
panel++;
}
}
int toSegment(unsigned int nr){
unsigned int rtn=0;
switch(nr){
case 0:rtn=63;break;
case 1:rtn=6;break;
case 2:rtn=91;break;
case 3:rtn=79;break;
case 4:rtn=102;break;
case 5:rtn=109;break;
case 6:rtn=124;break;
case 7:rtn=7;break;
case 8:rtn=127;break;
case 9:rtn=103;break;
}
return rtn;
}
//
ISR (TIMER0_COMP_vect)
{
millisekunden++;
switch(PINA-cache_a){
case 16:
if((millisekunden5000){
lastpress_hou=millisekunden;
stunde++;
if(stunde == 10){
stunde_dekade++;
stunde=0;
}
if(stunde==4&&stunde_dekade==2){
stunde_dekade=0;
stunde=0;
}
}
break;
case 32:
if((millisekunden5000){
lastpress_min=millisekunden;
minute++;
if(minute == 10){
minute = 0;
minute_dekade++;
if(minute_dekade==6){
minute_dekade=0;
}
}
}
break;
}
if(millisekunden == 5000)
{
sekunde++;
millisekunden = 0;
if(sekunde == 60){
minute++;
sekunde = 0;
}
if(minute == 10){
minute = 0;
minute_dekade++;
if(minute_dekade==6){
stunde++;
minute_dekade=0;
}
}
if(stunde == 10){
stunde_dekade++;
stunde=0;
}
if(stunde==4&&stunde_dekade==2){
stunde_dekade=0;
stunde=0;
}
}
}