Attiny 2313 BCD Eingang und Stromstoßschaltung Ausgang
Hallo Leute,
ich will mich noch kurz vorstellen, da ich neu hier im Board bin.
Nun zu meinem Problem:
Ich habe hier einen DTMF Dekoder (MT8870). Dieser gibt die DTMF Töne als BCD aus.
Da ich mir einen BCD zu Dezimaldekoder sparen möchte will ich das ganze mit dem Attiny 2313 erledigen.
Dazu kommt noch, dass die Ausgänge getoggelt werden sollen.
Ich habe das Problem, dass der Attiny in der Schaltung nicht vom 0 auf 1 Zustand schaltet. Egal welche Zahl ich dem DTMF Dekoder vorgebe.
Das Signal liegt aber bei jeder Zahl am Attiny an.
Hier der geschriebene Quellcode:
Code:
$regfile = "attiny2313.dat"
$crystal = 8000000
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 'für die BCD Eingänge
Config Portd.4 = Output
Config Portd.5 = Output
Config Portb.7 = Output
Config Portb.6 = Output
Config Portb.5 = Output
Config Portb.4 = Output
Config Portb.3 = Output
Config Portb.2 = Output
Config Portb.1 = Output
Config Portb.0 = Output
Config Portd.6 = Output
Const 1 = &B0001 'BCD Code für 1, usw.
Const 2 = &B0010
Const 3 = &B0011
Const 4 = &B0100
Const 5 = &B0101
Const 6 = &B0110
Const 7 = &B0111
Const 8 = &B1000
Const 9 = &B1001
Const S = &B1011 'BCD Code für Stern
Const R = &B1100 'BCD Code für Raute
Portd.4 = 0 'Ausgänge auf GND
Portd.5 = 0
Portb.7 = 0
Portb.6 = 0
Portb.5 = 0
Portb.4 = 0
Portb.3 = 0
Portb.2 = 0
Portb.1 = 0
Portb.0 = 0
Portd.6 = 0
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
Do
If Portd = 1 Then
Toggle 1_ausgang
Waitms 200
End If
If Portd = 2 Then
Toggle 2_ausgang
Waitms 200
End If
If Portd = 3 Then
Toggle 3_ausgang
Waitms 200
End If
If Portd = 4 Then
Toggle 4_ausgang
Waitms 200
End If
If Portd = 5 Then
Toggle 5_ausgang
Waitms 200
End If
If Portd = 6 Then
Toggle 6_ausgang
Waitms 200
End If
If Portd = 7 Then
Toggle 7_ausgang
Waitms 200
End If
If Portd = 8 Then
Toggle 8_ausgang
Waitms 200
End If
If Portd = 9 Then
Toggle 9_ausgang
Waitms 200
End If
If Portd = S Then
Toggle S_ausgang
Waitms 200
End If
If Portd = R Then
Toggle R_ausgang
Waitms 200
End If
Loop
End
Ich hoffe, dass mir jemand helfen kann.;)
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo
BCD-Namen sind unsinnig, weil BCD ja lediglich bedeutet, dass die Ziffern 0 bis 9 in jeweils einem Nipple dargestellt werden. Deshalb würde ich es einfach so lösen:
Code:
$regfile = "attiny2313.dat"
$crystal = 8000000
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 'für die BCD Eingänge
Dim Bcd_input As Byte
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
'Const 1 = &B0001 'BCD Code für 1, usw.
'Const 2 = &B0010
'Const 3 = &B0011
'Const 4 = &B0100
'Const 5 = &B0101
'Const 6 = &B0110
'Const 7 = &B0111
'Const 8 = &B1000
'Const 9 = &B1001
'Const S = &B1011 'BCD Code für Stern
'Const R = &B1100 'BCD Code für Raute
Declare Sub All_leds_off
All_leds_off
Do
Bcd_input = Pind And 15 'nur die Bits 0 bis 3 beachten
Select Case Bcd_input
Case 0 : All_leds_off
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 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
Das ist allerdings ungetestet.
Allerdings ist die direkte Abfrage der Eingangspins kritisch, weil die Pins nie gleichzeitig ihre Pegel wechseln, bzw. erreichen. Deshalb verwendet man bei parallelen Schnittstellen wenigstens ein Gültig-Signal an dem der lesende Partner erkennt, dass alle Datenpins stabile Spannungen haben:
' Pseudocode für Sender
set_bcd_daten
waitms 10 ' warten bis alle Pegel passen
set_bcd_gültig
waitms 300 ' warten bis mindestens einmal gelesen wurde
unset_bcd_gültig
waitms 10 ' warten bis lesen wirklich beendet ist
unset_bcd_daten
' Code für Empfänger:
if bcd_gültig then Bcd_input = Pind And 255
Gruß
mic
[Edit]
Das Gültig-Signal beim MT8870 heißt vermutlich StD:
Zitat:
Zitat von Datenblatt des MT8870
Q1-Q4 4-BIT DECODED TONE OUTPUT.
StD DELAYED STEERING OUTPUT. INDICATES THAT VALID FREQUENCIES HAVE BEEN PRESENT/ABSENT FOR THE REQUIRED
GUARD TIME THUS CONSTITUTING A VALID SIGNAL.
Anhang 19544