Wie der geübte Programmierer leicht erkennen kann handelt es sich um eine zusammenstellung aus verschiedenen Quellen, die kommentare stimmen teilweise nichtmehr mit dem code überein ;o)) sowas, da war gerade noch eine telefonnummer mitten im code, die ich mir heute fix notiert hatte ;o)) geradenochso gefunden ;o))
$regfile = "m16def.dat" 'ATMega16 $crystal = 16000000 'Quarz:
3.6864 MHz $baud = 9600 'Baudrate der UART: 9600 Baud Config Rc5 = Pinc.6 , Timer = 2 $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 ' default use 40 for the frame space
' PD4 an Taste 2, PD3 (Int1) an Taste 1 ' PD2 (Int0) an RTS-Ausgang vom MAX232
Ddra = &B00000000 'Pa3 Eingang, komplett Porta = &B00011111 Ddrb = &B11111111 Portb = &B00000000 Ddrc = &B10111111 Portc = &B01000111 Ddrd = &B11111000 'Ddrd = &B00000000
$lib "mcsbyte.lbx" $lib "i2c_twi.lbx" Config Sda = Portc.1 Config Scl = Portc.0 'I2cinit
Dim Dmx(100) As Byte At &H60 Dim Dmxmute(100) As Byte Dim Ftoggle As Bit , Dmxstatus As Byte , Datenraus As Bit Dim Dmxadress As Byte Dim Dmx1 As Byte At &H61 Overlay , Dmx2 As Byte At &H62 Overlay , Dmx3 As Byte At &H63 Overlay , Dmx4 As Byte At &H64 Overlay , Dmx5 As Byte At &H65 Overlay Dim Dmx6 As Byte At &H66 Overlay , Dmx7 As Byte At &H67 Overlay , Dmx8 As Byte At &H68 Overlay , Dmx9 As Byte At &H69 Overlay , Dmx10 As Byte At &H6A Overlay Dim Address As Byte , Command As Byte , Rohcommand As Byte , Alt As Byte , Zeit As Word 'für IR Dim S As Byte , Mute As Byte , Temp As Byte , Hatsichwasgetan As Byte , Adresseingabe1 As Byte , Adresseingabe2 As Byte Dim Tutsichwas As Byte
Dim Twi_control As Byte ' Controlrgister lokale kopie Dim Twi_status As Byte Dim Twi_data As Byte Dim B As Byte ' Zeichen von UART Dim Error As Byte ' Fehlermerker
Declare Sub Twi_send_byte(byval Slave As Byte , Byval Zeichen As Byte)
' TWI init Twcr = &B00000100 ' erstmal nur TWI aktivieren Twsr = 0 ' Status und Prescaler Register Twbr = 72 ' Bit Rate Register, 100kHz
Portb.5 = 1 Dmx1 = 1 Dmx2 = 2 Dmx6 = 6 Dmx7 = 7
On Urxc Onrxd 'Interrupt-Routine setzen Enable Urxc 'Interrupt URXC einschalten Enable Interrupts 'Interrupts global zulassen '---------------------------------------------------------
Do 'Hauptschleife Getrc5(address , Rohcommand) If S > 0 Then Command = S Rohcommand = S S = 0 End If Dmx(1) = Dmxadress If Rohcommand < 255 Then Command = Rohcommand And &B01111111 Print Address ; Print " " ; Print Command ; Print "---" ; Print Rohcommand If Command > 9 Then Adresseingabe1 = 0 If Alt = Rohcommand Then Tutsichwas = 2 Else Tutsichwas = 1 End If End If
If Tutsichwas = 1 Then Select Case Command Case 32 : Incr Dmxadress Case 33 : Decr Dmxadress Case 16 : Incr Dmx(dmxadress) Case 17 : Decr Dmx(dmxadress) Case 12 : Gosub Ontaste12 Case 13 : Gosub Onmute Case 52 : Dmx(dmxadress) = 255 Case 55 : Dmx(dmxadress) = 0 End Select If Command < 10 Then Gosub On0_9 End If
If Tutsichwas = 2 Then Select Case Command Case 16 : Incr Dmx(dmxadress) Case 17 : Decr Dmx(dmxadress) End Select End If
if tutsichwas>0 then Command = 0 'Dmx10 = Command ' Den Wert zum Slave senden ' Call Twi_send_byte(&H40 , Dmx10)
' Ausgabe, damit wir sehen was geschehen ist Print "dmxadresse: " ; Print Dmxadress; Print " wert : " ; Print Dmx(dmxadress); Print " error: "; Print Hex(error) ' error status Ausgeben tutsichwas=0 endif
Waitms 1 Portc.7 = 1 Select Case Command Case 2 : Incr Dmx1 Case 1 : Decr Dmx1 Case 4 : Incr Dmx2 Case 5 : Decr Dmx2 Case 7 : Decr Dmx3 Case 8 : Incr Dmx3 Case 32 : Print "ch+" Case 33 : Print "ch-" Case 16 : Print "V+" Case 17 : Print "V-" End Select
Waitms 1 Portc.7 = 0 Command = 0
Loop '---------------------------------------------------------
' TWI send_byte ' sendet ein Byte und schliesst die Übertragung ab Sub Twi_send_byte(slave As Byte , Zeichen As Byte) Error = 0 ' Fehler zurücksetzen
' Startbedingung Twcr = &B10100100 ' TWINT | TWSTA | TWEN
' warten bis TWINT gesetzt ist Gosub Twi_wait_int
' wenn Zugriff auf den Bus erlaubt, Slaveadresse ausgeben If Twi_status = &H08 Or Twi_status = &H10 Then Twdr = Slave And &HFE ' slave adresse + Write Twcr = &B10000100 ' TWINT löschen, Byte senden
' warten bis TWINT gesetzt ist Gosub Twi_wait_int
' Slave hat sich gemeldet If Twi_status = &H18 Or Twi_status = &H20 Then Temp = 0 Do 'zählschleife Incr Temp Twdr = Dmx(temp) ' Daten Twcr = &B10000100 ' TWINT löschen, Byte senden
' warten bis TWINT gesetzt ist Gosub Twi_wait_int Loop Until Temp = 100 'bis temp 100 ' Zeichen wurden gesendet If Twi_status = &H28 Or Twi_status = &H30 Then Error = 0 ' kein Fehler Else Error = Twi_status ' Fehler End If
Else ' kein slave Error = Twi_status ' Fehler End If
' Stopbedingung kommt hier immer im Ablauf, egal welcher Status Twcr = &B10010100 ' TWINT löschen, Stop senden
Else ' Bus belegt, wird er wieder freigegeben Twcr = &B10000100 ' TWINT löschen, Bus freigeben Error = Twi_status ' Fehler End If
End Sub
' warten bis TWINT gesetzt ist, status auslesen Twi_wait_int: Do Twi_control = Twcr And &H80 Loop Until Twi_control = &H80
Twi_status = Twsr And &HF8 ' status
' status nur zu Debugzwecken ausgeben, weil Bus sehr langsam wird ! ' Print "Err " ; Hex(twi_status) Return
On0_9: If Adresseingabe1 = 0 Then Adresseingabe2 = Command Adresseingabe1 = 1 Elseif Adresseingabe1 = 1 Then Dmxadress = Adresseingabe2 * 10 Dmxadress = Dmxadress + Command Adresseingabe1 = 0 Adresseingabe2 = 0 End If Return
Ontaste12: Temp = 0 Do Incr Temp Dmx(temp) = 0 Loop Until Temp = 100 Return
Onmute: If Dmx(dmxadress) > 0 Then Dmxmute(dmxadress) = Dmx(dmxadress) Dmx(dmxadress) = 0 Else Dmx(dmxadress) = Dmxmute(dmxadress) End If Return
Onrxd: S = Udr 'Byte aus der UART auslesen Print S 'Byte als Echo zurückgeben If S = "x" Then Print "->IKS