016
22.04.2019, 12:39 Uhr
holm
|
Zitat: | srn schrieb
@Holm: Hätte ich eine einfachere Schaltung mit einem ATTiny gefunden, hätte ich diese genommen, aber diese hier tut's ja auch. Du weißt doch, daß ich nun nicht gerade der Hardware-Spezie bin.
|
Ja klar doch, das stelle ich doch nicht in Zweifel. Mir war halt nur aufgestoßen das mir das bekannt vorkommt und ich da was gemacht hatte. Hier der Sourcecode, einen Schaltplan gibts noch nicht (das war aus dem Kopf) läßt sich aber aus dem Programm restaurieren, ich mach da bei Gelegenheit noch und komme damit um die Ecke.. An PB0..7 kommen die Segmentanschlüsse (Kathoden der Displays), PD6 und PD5 sind die Ausgänge für PNP Transistoren die über einen 1,5K Vorwiderstand die Basis der Transistoren antrieben, Emitter an +5, Kollektor an die Anoden. Das Ding betriebt also die Anzeige in Multiplex. DS1,SD,ST,T0 (PD4,PD3,PD2,PA0) sind die Entsprechenden Signale vom Shugart Bus, und TG43 ist der Ausgang (PA1) für das Track43 Signal um das es mir eigentlich ging.
Es werden also außer dem Attiny 8(7) Segmentvorwiderstände und 2 Anodenvorwiderstände je nach LED Display und 2 Basisvorwiderstände 1,5-3,3K benörigt, mehr nicht. Evtl. noch die Resetbeschaltung für Atmels..
Quellcode: | /* * Holm Tiffe 01/13/2012 * TG43 Signalerzeugung + Track Anzeige 8 Zoll Floppy */
/* * Clk 8Mhz Attiny2313 internal RC Oszillator */
#include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include <util/delay.h> #include <avr/wdt.h>
#define DEBUG 1
/* * External Connections * * PB0 Seg e * PB1 Seg d * PB2 Seg c * PB3 Seg dp Display 7 Segm. TDSR 5150 common Anode * PB4 Seg b * PB5 Seg a * PB6 Seg f * PB7 Seg g * * PD6 Anode left L active * PD5 Anode right L active * PD4 /DS1 Input * PD3 /SD Input * PD2 /ST Input * PA0 /T0 Input * PA1 /TG43 Output L active to Floppy */
#define AnL PD6 #define AnR PD5 #define DS1 PD4 #define SD PD3 #define ST PD2 #define T0 PA0 #define TG43 PA1 #define TxD PD1 // not used #define RxD PD0 // not used
#define Seg_a (1<<PB5) #define Seg_b (1<<PB4) #define Seg_c (1<<PB2) #define Seg_d (1<<PB1) #define Seg_e (1<<PB0) #define Seg_f (1<<PB6) #define Seg_g (1<<PB7) #define Seg_dp (1<<PB3)
uint8_t chargen[] PROGMEM = { Seg_a|Seg_b|Seg_c|Seg_d|Seg_e|Seg_f, // 0 Seg_b|Seg_c, // 1 Seg_a|Seg_b|Seg_g|Seg_e|Seg_d, // 2 Seg_a|Seg_b|Seg_g|Seg_c|Seg_d, // 3 Seg_b|Seg_g|Seg_f|Seg_c, // 4 Seg_a|Seg_f|Seg_g|Seg_c|Seg_d, // 5 Seg_a|Seg_f|Seg_g|Seg_e|Seg_d|Seg_c, // 6 Seg_a|Seg_b|Seg_c, // 7 Seg_a|Seg_b|Seg_c|Seg_d|Seg_e|Seg_f|Seg_g, // 8 Seg_a|Seg_b|Seg_c|Seg_d|Seg_f|Seg_g, // 9 Seg_a|Seg_b|Seg_c|Seg_e|Seg_f|Seg_g, // A Seg_c|Seg_d|Seg_e|Seg_f|Seg_g, // b Seg_a|Seg_f|Seg_e|Seg_d, // C Seg_b|Seg_c|Seg_d|Seg_e|Seg_g, // d Seg_a|Seg_d|Seg_e|Seg_f|Seg_g, // E Seg_a|Seg_e|Seg_f|Seg_g, // F };
/*********************************************************************/
volatile uint8_t digit; volatile uint8_t dpl,dpr; volatile uint8_t led_val; volatile uint8_t digit; volatile uint8_t trackcount;
/*********************************************************************/ SIGNAL(SIG_TIMER0_OVF) { if(!digit) { PORTD|=(1<<AnL); // cut off Anode // set segments PORTB=~pgm_read_byte(&chargen[led_val & 0xf]); if(dpr) PORTB&=~Seg_dp; PORTD&=~(1<<AnR); // enable left anode digit++; } else { PORTD|=(1<<AnR); PORTB=~pgm_read_byte(&chargen[(led_val & 0xf0) >> 4]); if(dpl) PORTB&=~Seg_dp; PORTD&=~(1<<AnL); digit=0; }
} /*********************************************************************/ SIGNAL(SIG_INT0) {
// Triggers on falling Edge of Step
if(!(PIND & (1<<DS1))&&(!(PINA&(1<<T0)))) trackcount=0; // Reset Counter if(!(PIND & (1<<DS1))) // DS1 active, Controller is talking to us { if(PIND & (1<<SD)) // SD is high trackcount--; // step outward else trackcount++; // step inward
if(trackcount>99) // range limit trackcount=99; // if(trackcount >= 43) { else { PORTA|=(1<<TG43); // deactivate TG43 Line dpl=0; }
led_val=trackcount % 10; led_val|=((trackcount / 10) << 4); // to BCD }
} /*********************************************************************/ void ioinit(void) {
DDRA=(1<<TG43); // Output PORTA=(1<TG43)|(1<<T0); // TD0 inact + Pullup T0 DDRB=0xff; // all Outputs PORTB=0xff; // all inactive //DDRD=(1<<AnL)|(1<<AnR)|(1<<TxD); // Outputs DDRD=(1<<PD5)|(1<<PD6)|(1<<PD1); // Outputs PORTD=0xff; // inact/Pullups MCUCR=(1<<ISC01); // INT0 falling Edge GIMSK=(1<<INT0);
/* Timer 0 CTC Mode, Prescaler 256, Value 256, 8msec, 122Hz */ /* Zeitbasis */
TCCR0A=0; TCCR0B=(1<<CS02); // CLK/256 (Prescaler) TIMSK|=(1<<TOIE0); // Int enable
sei(); }
/*********************************************************************/
int main(void) { ioinit(); dpr=1; trackcount=0; led_val=0xff; while(1); // not reached }
|
Gruß,
Holm -- float R,y=1.5,x,r,A,P,B;int u,h=80,n=80,s;main(c,v)int c;char **v; {s=(c>1?(h=atoi(v[1])):h)*h/2;for(R=6./h;s%h||(y-=R,x=-2),s;4<(P=B*B)+ (r=A*A)|++u==n&&putchar(*(((--s%h)?(u<n?--u%6:6):7)+"World! \n"))&& (A=B=P=u=r=0,x+=R/2))A=B*2*A+y,B=P+x-r;} Dieser Beitrag wurde am 22.04.2019 um 12:47 Uhr von holm editiert. |