Hallo
Bitte entschuldige, aber den letzten Quellcode habe ich nicht richtig durchdacht und leider auch nur hingeschleudert (Pind and 255?). Ich glaube, ohne Auswertung von StD wird das nicht funktionieren, weil der MT8870 zwischen den Tönen die Pegel nicht hält. Hier hilft mein theoretisches Programmieren offensichtlich nicht weiter.
Für einen schnellen Test könntest du mal den StD-Ausgang des MT8870 auf PD3 legen (Q4 hängt dann frei):
Die Megas und Tinies werden defaultmässig mit internem Takt /8 ausgeliefert, das sollte dann 1MHz (1,2 MHz beim Tiny13) entsprechen. Waitms funktioniert nur richtig, wenn $crystal richtig angegeben ist ($crystal ändert nicht die Fuses!). Deshalb ist das waitms 200 kritisch, weil möglicherweise das StD zu kurz gesetzt wird und dein Tiny währenddessen in der Wait-Schleife hängt. Da hilft nur eins: Versuch macht kluch :)Code:$regfile = "attiny2313.dat" $crystal = 1000000 ' default für Tiny 2313 Config Portd.0 = Input 'für die BCD Eingänge Config Portd.1 = Input 'für die BCD Eingänge Config Portd.2 = Input 'für die BCD Eingänge Config Portd.3 = Input 'Eingang StD S_ausgang Alias Portd.4 'Ausgang für Stern R_ausgang Alias Portd.5 'Ausgang für Raute 1_ausgang Alias Portb.7 'Ausgang für 1, usw. 2_ausgang Alias Portb.6 3_ausgang Alias Portb.5 4_ausgang Alias Portb.4 5_ausgang Alias Portb.3 6_ausgang Alias Portb.2 7_ausgang Alias Portb.1 8_ausgang Alias Portb.0 9_ausgang Alias Portd.6 Config S_ausgang = Output Config R_ausgang = Output Config 1_ausgang = Output Config 2_ausgang = Output Config 3_ausgang = Output Config 4_ausgang = Output Config 5_ausgang = Output Config 6_ausgang = Output Config 7_ausgang = Output Config 8_ausgang = Output Config 9_ausgang = Output Dim Bcd_input As Byte Declare Sub All_leds_off All_leds_off Bcd_input = 0 Do If Pind.3 = 1 Then 'PD3 ist Std, gesetzt wenn Daten bereit Bcd_input = Pind And 7 'nur die Bits 0 bis 2 beachten While Pind.3 = 1 ' warten bis StD wieder low ist Wend End If Select Case Bcd_input Case 1 : Toggle 1_ausgang Case 2 : Toggle 2_ausgang Case 3 : Toggle 3_ausgang Case 4 : Toggle 4_ausgang Case 5 : Toggle 5_ausgang Case 6 : Toggle 6_ausgang Case 7 : Toggle 7_ausgang '( Case 8 : Toggle 8_ausgang Case 9 : Toggle 9_ausgang Case 10 : All_leds_off '10 ist Ziffer "0" Case 11 : Toggle S_ausgang Case 12 : Toggle R_ausgang ') End Select Waitms 200 Loop End Sub All_leds_off S_ausgang = 0 R_ausgang = 0 1_ausgang = 0 2_ausgang = 0 3_ausgang = 0 4_ausgang = 0 5_ausgang = 0 6_ausgang = 0 7_ausgang = 0 8_ausgang = 0 9_ausgang = 0 End Sub
Wenn's funktioniert wäre es clever, wenn du StD auf einen interruptfähigen Eingang (INTx) legen würdest.
Gruß
mic
[Edit]
Der Standartspruch im Datenblatt des 2313 unter "Default Clock Source":
Wobei CKSEL = “0100” eben "Calibrated internal RC Oscillator 8MHz" bedeutet und zusammen mit dem aktivierten "clock prescaling of 8" dein Tiny wohl mit 1MHz rennt.The device is shipped with CKSEL = “0100”, SUT = “10”, and CKDIV8 programmed.
The default clock source setting is the Internal RC Oscillator with longest start-up time
and an initial system clock prescaling of 8. This default setting ensures that all users can
make their desired clock source setting using an In-System or Parallel programmer.
[Edit2]
Ups, der 2313 hat gar nicht soviele Pins wie erwartet. Zufällig ist PD3 auch INT1, deshalb müsste Q4 dann auf PA0 oder PA1 gelegt werden, wenn man das Std-Signal per Pinchange-Interrupt abfragen möchte. Bei internem Takt sollten diese zwei Pins frei nutzbar sein, aber das weiß ich nicht sicher.
Ungetesteter Code mit Q4 an PA0 und StD an PD3, Auswertung per Int1-Interrupt:
Wenn das funktioniert könnte man noch die "0" auf PA1 legen... *träum*Code:$regfile = "attiny2313.dat" $crystal = 1000000 Config Portd.0 = Input 'für die BCD Eingänge Config Portd.1 = Input 'für die BCD Eingänge Config Portd.2 = Input 'für die BCD Eingänge Config Porta.0 = Input 'für die BCD Eingänge PA0 ??? Config Portd.3 = Input 'Eingang StD S_ausgang Alias Portd.4 'Ausgang für Stern R_ausgang Alias Portd.5 'Ausgang für Raute 1_ausgang Alias Portb.7 'Ausgang für 1, usw. 2_ausgang Alias Portb.6 3_ausgang Alias Portb.5 4_ausgang Alias Portb.4 5_ausgang Alias Portb.3 6_ausgang Alias Portb.2 7_ausgang Alias Portb.1 8_ausgang Alias Portb.0 9_ausgang Alias Portd.6 Config S_ausgang = Output Config R_ausgang = Output Config 1_ausgang = Output Config 2_ausgang = Output Config 3_ausgang = Output Config 4_ausgang = Output Config 5_ausgang = Output Config 6_ausgang = Output Config 7_ausgang = Output Config 8_ausgang = Output Config 9_ausgang = Output Config Int1 = Rising On Int1 Int1_isr Enable Int1 Enable Interrupts Dim Bcd_input As Byte Declare Sub All_leds_off All_leds_off Bcd_input = 0 Do Select Case Bcd_input Case 1 : Toggle 1_ausgang Case 2 : Toggle 2_ausgang Case 3 : Toggle 3_ausgang Case 4 : Toggle 4_ausgang Case 5 : Toggle 5_ausgang Case 6 : Toggle 6_ausgang Case 7 : Toggle 7_ausgang Case 8 : Toggle 8_ausgang Case 9 : Toggle 9_ausgang Case 10 : All_leds_off '10 ist Ziffer "0" Case 11 : Toggle S_ausgang Case 12 : Toggle R_ausgang End Select Waitms 200 Loop End Int1_isr: Bcd_input = Pind And 7 'nur die Bits 0 bis 2 beachten If Pina.0 = 1 Then Bcd_input = Bcd_input + 8 ' PA0 ist Q4 Return Sub All_leds_off S_ausgang = 0 R_ausgang = 0 1_ausgang = 0 2_ausgang = 0 3_ausgang = 0 4_ausgang = 0 5_ausgang = 0 6_ausgang = 0 7_ausgang = 0 8_ausgang = 0 9_ausgang = 0 End Sub







Zitieren

Lesezeichen