- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 15

Thema: Attiny 2313 BCD Eingang und Stromstoßschaltung Ausgang

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    02.08.2011
    Beiträge
    7

    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.
    Geändert von baschdi1649 (02.08.2011 um 16:07 Uhr)

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    05.03.2011
    Ort
    Graz
    Beiträge
    29
    Hallo,

    Da der PortD teilweise auch als Ausgang konfiguriert ist vermute ich hier den Fehler... Versuche mal den Port vor der Abfrage zu maskieren, zb. so:

    Code:
    Dim MaskedPort as Byte
    ...
    MaskedPort = Portd And &b00001111
    If MaskedPort = S Then
    ...
    mfg

  3. #3
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Das Signal von Eingängen an Port d fragt man über das Register Pind ab, nicht über Portd. Portd ist für das Ausgangssignal bzw. zum Aktivieren von Pullups.

    Beschwert sich der der Compiler nicht über Definitionen wie
    Const 1 = &B0001 'BCD Code für 1, usw.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    05.03.2011
    Ort
    Graz
    Beiträge
    29
    Hallo,

    Pind, natürlich
    Der Compiler meckert zwar nicht bei dieser Konstantendefinition, scheint ihn intern aber doch durcheinanderzubringen.
    Ist so aber auf jeden Fall eine sehr potente Fehlerquelle, da würde ich einen Präfix dazuschreiben, zb. Const Bcd_1 = &B0001

    mfg

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    02.08.2011
    Beiträge
    7
    hi,
    ich probiere das, wie da_reefer meinte, mit maskedport aus. Jedoch verstehe ich das nicht ganz.

    Code:
    Dim MaskedPort as Byte
    ...
    MaskedPort = Pind And &b00001111
    If MaskedPort = S Then
    ...
    ich muss dim maskedport as byte nur einmal erwähnen.
    Dann MaskedPort = Pind And &b00001111 so abändern, dass da wo die 4 Einsen sind die BCD Codes hinkommen. Also so etwa?
    Code:
    Dim Maskedport As Byte
    
    Maskedport = Pind And &B00000001
    Maskedport = Pind And &B00000010
    Maskedport = Pind And &B00000011
    Maskedport = Pind And &B00000100
    Maskedport = Pind And &b00000101
    Maskedport = Pind And &B00000110
    Maskedport = Pind And &B00000111
    Maskedport = Pind And &B00001000
    Maskedport = Pind And &B00001001
    Maskedport = Pind And &B00001011
    Maskedport = Pind And &B00001100
    aber wo werden dann die BCD Namen verteilt, wie 1, 2, 3, 4, ..., s, r?
    Oder stehe ich aufem Schlauch ?
    gruß baschdi1649

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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.
    Klicke auf die Grafik für eine größere Ansicht

Name:	mt8870.jpg
Hits:	2
Größe:	8,2 KB
ID:	19544
    Geändert von radbruch (03.08.2011 um 13:21 Uhr)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Oder stehe ich aufem Schlauch ?
    Ein bisschen, aber das kriegen wir hin

    Die Idee mit dem "Maskieren" beruht auf folgendem Ansatz:

    Wenn X ein Bit ist (also die Werte 0 oder 1 annehmen kann), dann gilt folgendes:

    X AND 0 = 0 (egal welchen Wert X hat: Eine "und"-Verknüpfung mit 0 ergibt immer 0)
    X AND 1 = X (0 AND 1 = 0, 1 AND 1 = 1)

    Wenn Du also folgenden Befehl ausführst:

    Byte = Byte AND &B00001111

    dann werden die linken 4 Bits auf 0 gesetzt, während die rechten 4 Bits ihren Wert unverändert beibehalten. Logisch, oder?

    Und darauf bezog sich auch die Antwort von da_reefer: Wenn der BCD-Wert an PIND.0-3 anliegt, Du aber den kompletten Port abfragst (Byte = PIND), könnte es theoretisch sein, dass die Bits PIND.4-7 das Byte verfälschen. Deshalb solltest Du sie sicherheitshalber mit dem AND &B00001111-Befehl löschen. Und der ist in der Tat nur ein mal erforderlich, und zwar nachdem Du den Wert von PIND in ein Byte übernommen hast.

Ähnliche Themen

  1. ATTiny 2313
    Von Goliath im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 2
    Letzter Beitrag: 09.04.2008, 16:54
  2. ATTINY-2313
    Von Che Guevara im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 22.03.2008, 16:45
  3. ATtiny 2313 Einstellung
    Von Picht im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 16.08.2007, 21:23
  4. ATtiny 2313
    Von TDK im Forum AVR Hardwarethemen
    Antworten: 22
    Letzter Beitrag: 06.04.2007, 14:37
  5. Attiny 2313 programmieren
    Von Geimel im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 5
    Letzter Beitrag: 27.10.2006, 18:01

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen