Tiny45 und PCINT0

Hallo zusammen,

mittlerweile habe ich die SW fertig gestrickt (s.u.).

Das Problem war scheinbar tatsächlich, der der "emuilierte" I²C-Bus sich mit dem Interrupt stört - vielleicht gibt es einen Guru hier der dies erklären kann ??:flowers:

Fakt ist: Ich habe die Schaltung auf die Hardware-I2C-Busleitungen umgebaut und es funktioniert. Noch ein bisschen gefummel an den Stacks und es läuft.

Nochmal angehängt hier nun der endgültige Code und Schaltplan
Code:
'
'  Name:       Audio-Switch
'  Rev:        1.1
'  Hardware:   'tr026-2009' ab R02
'
'  Date: 12.08.09
'
'  Description:
'  - Umschaltung von in Summe fünf Audioquellen
'  - Umschalten kann über Tastendruck oder per IR RC5-Code vorgenonmmen werden
'  - externer I²C-Bus kann ebenfalls Steuerung übernehmen
'
'  Belegung µC
'  PB0     Bi     SDA      MOSI  Pin 5
'  PB1            LED      MISO  Pin 6  (nur für Testzwecke)
'  PB2     Input  SCL      SCK   Pin 7
'  PB3     Input  Taster         Pin 2
'  PB4     Input  IF-RC5         Pin 3
'  PB5                     RST   Pin 1

' -------------------------  µC-Setup ------------------------------------------
   $regfile = "ATtiny45.DAT"
   $crystal = 1000000
   $hwstack = 48
   $swstack = 24
   $framesize = 48
' -------------------------  µC-Setup Ende--------------------------------------


' -------------------------  Konfiguration -------------------------------------


   Config Sda = Portb.0
   Config Portb.1 = Output                                  ' LED für Testzwecke
   Led Alias Portb.1
   Config Scl = Portb.2                                     '

   Config Pinb.3 = Input                                    ' Taster
   Taster Alias Pinb.3                                      ' Alias für bessere Lesbarkeit
   Config Pinb.4 = Input                                    ' IR-Empfänger (extern)
   Config Rc5 = Pinb.4

   Const Max4550_adr = 152

   Dim Kanal As Byte

   Gimsk = &B0010_0000                                      ' Pin Chane Int.Enable=1
   Pcmsk = &B0000_1000                                      'maskiere PCINT4
   On Pcint0 Isr_pcint0                                     ' wenn Taste gedückt wid, löst INT aus

   Dim Address As Byte , Command As Byte

' -------------------------  Konfiguration Ende --------------------------------
'
' -------------------------  Subroutinen Deklaration ---------------------------
   Declare Sub Schalten                                     ' (byval Kanal As Byte)

' -------------------------  Subroutinen Deklaration Ende ----------------------



' ------------------------------------------------------------------------------
' ------------------------- START ----------------------------------------------
   Kanal = 4
   Wait 1
   Call Schalten                                            ' Initialisierung auf Defaultwerte (Kanal und LED)


   Enable Interrupts

   Dim I As Byte

   Do                                                       'Endlosschleife
      Getrc5(address , Command)
      If Address <> 255 Then
        Command = Command And &B01111111                    'clear toggle bit

         If Address = 20 Then
            Select Case Command
               Case 0
                  Kanal = 4
               Case 1 To 4
                  Kanal = Command - 1
               Case 30
                  Kanal = Kanal + 1
               Case 31
                  Kanal = Kanal - 1


            End Select
            Call Schalten
            Waitms 500

         End If
      End If

   Loop


End


' ------------------------- ENDE -----------------------------------------------
' ------------------------------------------------------------------------------


 ' -------------------------  Subroutinen --------------------------------------

   Sub Schalten                                             ' (byval Kanal As Byte)
      Toggle Led
      Local Commandwort As Byte
      Local Datawort As Byte
     ' Local Shiftkanal As Byte

      If Kanal > 4 Then Kanal = 0                           'auf den gültigen Bereich einschränken

      Commandwort = &B00000101                              ' , COM1B, COM1A sind ausgewählt
      Datawort = &B00000001

      Shift Datawort , Left , Kanal                         ' den richtigen Kanal durch Schiebbefehle auswählen

      I2cstart
      I2cwbyte Max4550_adr
      I2cwbyte Commandwort
      I2cwbyte Datawort
      I2cstop

      Commandwort = &B00010000
      Datawort = &HFF - Datawort                            ' weil LED mit inverser Logik arbeiten
      I2cstart
      I2cwbyte Max4550_adr
      I2cwbyte Commandwort
      I2cwbyte Datawort
      I2cstop



   End Sub

' ------------------------------------------------------------------------------


' ------------------------- Interrupt Service Routine --------------------------
Isr_pcint0:

   If Taster = 0 Then
      Kanal = Kanal + 1
      Call Schalten
      Waitms 500                                            ' um zu Entprellen
   End If
   Return
 

Anhänge

  • tr026-2009-R02.sch.pdf
    107,8 KB · Aufrufe: 4
Hallo Timo!

Freut mich, dass es nun funktioniert! :)

Ich denke einfach mal, dass es schon seinen Sinn hat, warum die Pins für SDA und SCL am Controller extra ausgewiesen sind. ;)

Wenn es nun damit funktioniert, solltest du vielleicht beim nächsten Mal doch auf die angegebenen Pin-Bezeichnungen Rücksicht nehmen.

Leider habe ich mit I2C noch gar nicht experimentiert und kann dir dabei auch nicht weiterhelfen.
Vielleicht hat ja ein anderer User (oder Moderator) mehr Erfahrung damit und kann dir evtl. einen Hinweis geben. :)

Gruß,
Cassio
 
Hallo zusammen,

man sollte auf jeden Fall versuchen, bei der angeschlossenen Hardware
(SPI, I2C, RS232, ...) die Hardwareunterstützung des Atmel zu verwenden.
Das entlastet den Prozessor und läuft immer sauberer als eine Emulation.

Ich schätze mal, das der PCINT das Timing der I2C-Emulation zersäbelt hat.
Um das aber genau raus zu bekommen müßte man wissen das da in den
BASCOM-Routinen für die Software-I2C so alles abläuft und was benötigt wird.

So ein Problem hab ich bei mir zB auch wenn ich ein LCD am Controller habe
und auch mit Interrupts arbeite. Dann muß ich vor jedem Zugriff auf das LCD
die Interrupts deaktivieren damit das Timing vom LCD nicht durcheinander
gerät und danach werden die Interrupts wieder aktiviert. Der gesamte
Ablauf des LCD-Zugriffs läuft über Software und ist nicht ganz unkritisch.

Gruß
Dino
 
...und es geht noch weiter:

Ich dachte zwar alles funktioniert einwandfrei, aber jetzt habe ich das Problem, dass bei Tastendruck der Kanal inkrementiert wird, aber über den I²C-Bus andere Daten gesendet werden. Per IR-Fernsteuerung geht es tadellos. Habe also die RC5-Routine abgeklemmt und alles läuft rund.
Fazit: der PCINT und sein handling in Bascom ist eine Mimose! Ich habe einen I²C-Sniffer an den Bus gehängt und sehe genau, welcher Nonsens über den Bus läuft. Theoretisch sollte alles laufen, die Praxis ist was anderes :(
Leider bin ich noch nicht am Ende.....
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)