$regfile = "m8515.dat" $crystal = 16000000 ' $baud = 19200 'zum echten Betrieb auskommentieren $prog &HFF , &H2A , &HC1 , &H00 ' generated. Take care that the chip supports all fuse bytes. ' Print "Hello" 'nur zum debuggen 'Port A ist der Eingang für Daten, er wird als Eingang mit Pullup's eingestellt Daten Alias Pina Config Porta = Input Porta = &B11111111 'Port C ist der Eingang für Adressen, er wird als Eingang mit Pullup's eingestellt Adressen Alias Pinc Config Portc = Input Portc = &B11111111 'die Ports B und D sind die Ausgänge der nachgebildeten Schieberegister Config Portb = Output 'Port C als Ausgang Config Portd = Output 'Port D als Ausgang 'Port E.0 ist Eingang für /Write mit Pullup Config Porte.0 = Input Porte.0 = 1 'Port E.1 und E.2 sind Eingänge für Jumper mit Pullup's zur Festlegung des Adressbereichs 'es gibt 4 Einstellungen: ' 1. 192-207 = binär 1100xxxx ' 2. 208-233 = binär 1101xxxx ' 3. 224-239 = binär 1110xxxx ' 4. 240-255 = binär 1111xxxx 'Bits 7+8 haben den fixen Wert 192, der Rest ermittelt sich aus den Jumpern 'zum Debuggen auskommentieren weil die Pins als Ausgang für die Triggerung des Oscars benutzt sind Config Porte.1 = Input Porte.2 = 1 Config Porte.1 = Input Porte.2 = 1 On Timer0 Isr_timer0 Tccr0 = &B00000101 'kein High-Level-Befehl weil der nicht funktioniert! Enable Timer0 On Int2 Write_aktiv 'Deklaration Serviceroutine wenn auf die Steuerung geschrieben werden soll Config Int2 = Falling 'Interrupt bei fallender Flanke (Write ist Low aktiv) Enable Int2 'Interrupt Int2 aktiv Enable Interrupts 'alle Interrupts ein Dim Zaehler_erhoehen As Bit 'wird in der ISR Timer0 gesetzt und in der Hauptschleife gelöscht Dim Zaehler As Byte 'Zustands-Wert für die Aktionen zu den einzelnen Bits '******************************************************** 'zum Debuggen brauchen wir ein Triggersignal 'dafür wird PortE.1 und PortE.2 zum Ausgang ' Config Porte.1 = Output ' Config Porte.2 = Output '******************************************************** Wait 1 'sicherheitshalber mal 1 Sekunde warten bevor es losgeht Dim Adressbereich As Byte Adressbereich = 192 'zum Debuggen auskommentieren If Pine.2 = 0 Then Adressbereich = Adressbereich + 32 If Pine.1 = 0 Then Adressbereich = Adressbereich + 16 'jetzt steht in Adressbereich 192, 208, 224 oder 240 abhängig von den Jumpern Dim Tmp_adresse As Byte 'die vom Bus gelesene Adresse Dim Adr_oben As Byte 'darin legen wir die oberen 4 Bits der gelesenen Adresse ab Dim Adr_unten As Byte 'darin legen wir die 4 unteren Bits der Adresse ab (0-15) Dim Wert(16) As Byte 'die Daten die auf die 16 Adressen geschrieben wurden ' Dim Wertalt(16) As Byte 'die zuletzt ausgegebenen Werte, nur zum Debuggen Dim Bit_position As Byte 'nimmt Werte von 0 bis 7 an um das aktuelle Bit darzustellen Dim Tmp_daten As Byte 'temporäre Variable zum Aufnehmen der Daten-Bits ' Print "Adressbereich: " ; Adressbereich 'nur zum Debuggen Wait 1 Anfang: 'für jeden Wert von Zaehler, der Werte von 1 bis 156 annehmen kann, muss die Hauptschleife einmal durchlaufen werden. 'Zaehler_erhoehen wird von der ISR für Timer0 einmal pro 1 ms auf 1 gesetzt. Dann wird Zaehler um 1 erhöht If Zaehler_erhoehen = 1 Then Reset Zaehler_erhoehen Incr Zaehler If Zaehler = 157 Then Zaehler = 1 End If If Zaehler = 1 Then 'alle Bits ausschalten Portb = 0 Portd = 0 '*********zum Debuggen: triggersignal auf Port e ' Porte.1 = 1 ' Porte.2 = 1 ' Else ' Porte.1 = 0 ' Porte.2 = 0 '*********bis hier zum Debuggen End If If Zaehler = 2 Then 'wenn das Bit 7 einer Zahl 1 ist, wird nur ein kurzer Impuls ausgegeben Bit_position = 7 Gosub Ausgabe End If If Zaehler = 7 Then 'alle Bits einschalten Portb = 255 Portd = 255 End If If Zaehler = 11 Then 'alle Bits ausschalten Portb = 0 Portd = 0 End If If Zaehler = 12 Then 'wenn das Bit 6 einer Zahl 1 ist, wird nur ein kurzer Impuls ausgegeben Bit_position = 6 Gosub Ausgabe End If If Zaehler = 17 Then 'alle Bits einschalten Portb = 255 Portd = 255 End If If Zaehler = 21 Then 'alle Bits ausschalten Portb = 0 Portd = 0 End If If Zaehler = 22 Then 'wenn das Bit 5 einer Zahl 1 ist, wird nur ein kurzer Impuls ausgegeben Bit_position = 5 Gosub Ausgabe End If If Zaehler = 27 Then 'alle Bits einschalten Portb = 255 Portd = 255 End If If Zaehler = 31 Then 'alle Bits ausschalten Portb = 0 Portd = 0 End If If Zaehler = 32 Then 'wenn das Bit 4 einer Zahl 1 ist, wird nur ein kurzer Impuls ausgegeben Bit_position = 4 Gosub Ausgabe End If If Zaehler = 37 Then 'alle Bits einschalten Portb = 255 Portd = 255 End If If Zaehler = 41 Then 'alle Bits ausschalten Portb = 0 Portd = 0 End If If Zaehler = 42 Then 'wenn das Bit 3 einer Zahl 1 ist, wird nur ein kurzer Impuls ausgegeben Bit_position = 3 Gosub Ausgabe End If If Zaehler = 47 Then 'alle Bits einschalten Portb = 255 Portd = 255 End If If Zaehler = 51 Then 'alle Bits ausschalten Portb = 0 Portd = 0 End If If Zaehler = 52 Then 'wenn das Bit 2 einer Zahl 1 ist, wird nur ein kurzer Impuls ausgegeben Bit_position = 2 Gosub Ausgabe End If If Zaehler = 57 Then 'alle Bits einschalten Portb = 255 Portd = 255 End If If Zaehler = 61 Then 'alle Bits ausschalten Portb = 0 Portd = 0 End If If Zaehler = 62 Then 'wenn das Bit 1 einer Zahl 1 ist, wird nur ein kurzer Impuls ausgegeben Bit_position = 1 Gosub Ausgabe End If If Zaehler = 67 Then 'alle Bits einschalten Portb = 255 Portd = 255 End If If Zaehler = 71 Then 'alle Bits ausschalten Portb = 0 Portd = 0 End If If Zaehler = 72 Then 'wenn das Bit 0 einer Zahl 1 ist, wird nur ein kurzer Impuls ausgegeben Bit_position = 0 Gosub Ausgabe End If If Zaehler = 77 Then 'alle Bits einschalten Portb = 255 Portd = 255 End If Goto Anfang End Write_aktiv: 'hier prüfen wir ob eine der Adressen getroffen wurde und legen ggfs. den Wert der Daten ab Tmp_adresse = Adressen 'aktuelle Adresse einlesen Tmp_daten = Daten 'die aktuellen Daten-Bits werden gemerkt Adr_oben = Tmp_adresse And 240 'die 4 unteren Bits werden gelöscht If Adr_oben = Adressbereich Then 'Prüfen auf Adressbereich 'der "heiße" Bereich ist getroffen Adr_unten = Tmp_adresse And 15 'die oberen 4 Bits werden gelöscht Incr Adr_unten 'zu der Zahl von 0 bis 15 müssen wir 1 addieren um auf den Index 1-16 zu kommen Wert(adr_unten) = Tmp_daten 'Daten-Wert in Array ablegen ' Rest nur zum Debuggen ' If Wert(adr_unten) <> Wertalt(adr_unten) Then 'nur zum Debuggen: ' Print "Adresse: " ; Tmp_adresse ; " Wert: " ; Wert(adr_unten) '; " Zähler: " ; Zaehler ' Wertalt(adr_unten) = Wert(adr_unten) ' End If End If Return Isr_timer0: Timer0 = 239 'mit dem Preload von 239 wird etwa pro 1 ms ein Interrupt ausgelöst Set Zaehler_erhoehen Return Ausgabe: 'bit_position wurde vorher mit 0 bis 7 bestückt If Wert(1).bit_position = 1 Then Set Portb.0 If Wert(2).bit_position = 1 Then Set Portb.1 If Wert(3).bit_position = 1 Then Set Portb.2 If Wert(4).bit_position = 1 Then Set Portb.3 If Wert(5).bit_position = 1 Then Set Portb.4 If Wert(6).bit_position = 1 Then Set Portb.5 If Wert(7).bit_position = 1 Then Set Portb.6 If Wert(8).bit_position = 1 Then Set Portb.7 If Wert(9).bit_position = 1 Then Set Portd.0 If Wert(10).bit_position = 1 Then Set Portd.1 If Wert(11).bit_position = 1 Then Set Portd.2 If Wert(12).bit_position = 1 Then Set Portd.3 If Wert(13).bit_position = 1 Then Set Portd.4 If Wert(14).bit_position = 1 Then Set Portd.5 If Wert(15).bit_position = 1 Then Set Portd.6 If Wert(16).bit_position = 1 Then Set Portd.7 Return