- SF800 Solar Speicher Tutorial         
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
    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.

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    02.08.2011
    Beiträge
    7
    Der Quellcode von radbruch funktioniert einigermaßen. Jedoch benötigt der Microcontroller am Eingang ein Signal von ca. 2-4 Sekunden. Dann wird derjenige Anschluss geschaltet. Die Dauer des Signals am Ausgang hällt aber nur ca.4 Sekunden an. Weiß der Geier warum.

    Zur Erklärung von Sauerbruch:
    Müsste ich dann zwischen meinen geschriebenen Quellcode
    Code:
    Config Portd.6 = Output
    
    Const 1 = &B0001 'BCD Code für 1, usw.
    reinschreiben:
    Code:
    Config Portd.6 = Output
    
    Dim MaskedPort as Byte
    MaskedPort = Portd And &b00001111 'oder 15
    
    Const 1 = &B0001 'BCD Code für 1, usw.
    oder?
    mfg
    baschdi1649

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    MaskedPort = Pind And &b00001111 'oder 15

    Läuft dein Tiny wirklich mit 8MHz?

    Code:
    Dim Bcd_input As Byte , Bcd_input_old As Byte
    
    Declare Sub All_leds_off
    All_leds_off
    Bcd_input_old = 0
    
    Do
    
       Do
          Bcd_input = Pind And 255       'nur die Bits 0 bis 3 beachten
       Loop Until Bcd_input <> Bcd_input_old
    
       Select Case Bcd_input
          Case 10 : All_leds_off       '10 ist Ziffer "0"
          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
    
       Bcd_input_old = Bcd_input
    
       'Waitms 200
    
       Loop
    
    End
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    02.08.2011
    Beiträge
    7
    In dem einen Buch "Einfacher Einstieg in die Elektronik mit AVR..." steht hinten unter Attiny 2313 "Default-Takt: 8,00 MHz/8=1MHz.
    Ich dachte dann nehme ich 8MHz. Was würdet ihr nehmen?
    Danke für den Quelltext. Werde ihn später ausprobieren da momentan ein Gewitter bevorsteht

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    02.08.2011
    Beiträge
    7
    Hi,
    ich hab den Quelltext ausprobiert. Konnte ihn aber nicht richtig testen, da ich ein anderes Problem habe.
    Die LEDs an den Ausgängen flackern ständig. Einmal werden sie hell einmal dunkel. Dann nur die Eine dann die Andere.
    Dann binn ich hingegangen und habe in den Quelltext umgeändert und den Pullup Widerstand aktiviert. Den hab ich direkt unter die Input Definition der BCD Eingängen geschrieben. Das Flackern war weg, aber beim Anlegen eines Signals haben die LEDs aber nicht geschaltet
    Woran kann das liegen?

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    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):
    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
    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 :)

    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":
    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.
    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.

    [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:
    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
    Wenn das funktioniert könnte man noch die "0" auf PA1 legen... *träum*
    Geändert von radbruch (03.08.2011 um 18:44 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 Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Wenn man den internen Takt nutzt, kann man die Pins, die sonst für den Quarz sind, normal nutzen. Man hat dann also 17 IO Pins zur Verfügung. Nur die beiden Pins für die Versorgung gehen nicht und den Reset Pin sollte man nicht nutzen, das geht aber mit viel Aufwand (HV Programmierung) auch.

Ähnliche Themen

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

Stichworte

Berechtigungen

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

Solar Speicher und Akkus Tests