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 ??
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
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 ??
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