(Master Transmitter & Receiver mit DS1621) |
(Fehlercodetabelle dazu) |
||
Zeile 176: | Zeile 176: | ||
If Temp_usisr.0 = 1 Then | If Temp_usisr.0 = 1 Then | ||
Usi_twi_errorstate = &H05 | Usi_twi_errorstate = &H05 | ||
+ | If Cnt = 1 Then | ||
+ | Usi_twi_errorstate = &H06 {{vbcomment|Es hat sich kein Slave gemeldet}} | ||
+ | End If | ||
Exit For {{vbcomment|hier wird die Schleife bei einem NACK verlasssen}} | Exit For {{vbcomment|hier wird die Schleife bei einem NACK verlasssen}} | ||
End If | End If | ||
Zeile 470: | Zeile 473: | ||
{{vbcomment|kein ACK gekommen}} | {{vbcomment|kein ACK gekommen}} | ||
If Temp_usisr.0 = 1 Then | If Temp_usisr.0 = 1 Then | ||
− | Usi_twi_errorstate = &H05 {{vbcomment| | + | Usi_twi_errorstate = &H05 {{vbcomment|Der Slave hat die Daten mit NACK quittiert}} |
If Cnt = 1 Then | If Cnt = 1 Then | ||
− | Usi_twi_errorstate = &H06 {{vbcomment| | + | Usi_twi_errorstate = &H06 {{vbcomment|Es hat sich kein Slave gemeldet}} |
End If | End If | ||
Exit For {{vbcomment|die Schleife bei einem Fehler verlasssen}} | Exit For {{vbcomment|die Schleife bei einem Fehler verlasssen}} | ||
Zeile 550: | Zeile 553: | ||
---- | ---- | ||
+ | |||
+ | === Fehlercodes aus den Beispielen === | ||
+ | |||
+ | Wenn ein unerwartetes Ereignis auftreten sollte, wird eine Zahl ausgegeben, hier ist deren Bedeutung dazu. | ||
+ | Die Fehlercodes wurden aus den Beispielen von Atmel übernommen. (siehe Weblinks) | ||
+ | |||
+ | <div align="center"> | ||
+ | {| {{Blauetabelle}} | ||
+ | |- {{Hintergrund1}} | ||
+ | !| Code || Kurzbezeichnung || Fehlerbeschreibung | ||
+ | |- | ||
+ | |align="center"|02 | ||
+ | | USI_TWI_UE_START_CON || Unerwartete Start Bedingung aufgetreten | ||
+ | |- | ||
+ | |align="center"|03 | ||
+ | | USI_TWI_UE_STOP_CON || Unerwartete Stop Bedingung aufgetreten | ||
+ | |- | ||
+ | |align="center"|04 | ||
+ | | USI_TWI_UE_DATA_COL || Unerwartete Data Collision (arbitration) | ||
+ | |- | ||
+ | |align="center"|05 | ||
+ | | USI_TWI_NO_ACK_ON_DATA || Der Slave hat die Daten nicht per ACK quittiert | ||
+ | |- | ||
+ | |align="center"|06 | ||
+ | | USI_TWI_NO_ACK_ON_ADDRESS || Es hat sich kein Slave per ACK gemeldet | ||
+ | |- | ||
+ | |align="center"|07 | ||
+ | | USI_TWI_MISSING_START_CON || Erzeugte Start Bedingung nicht erkannt | ||
+ | |- | ||
+ | |align="center"|08 | ||
+ | | USI_TWI_MISSING_STOP_CON || Erzeugte Stop Bedingung nicht erkannt | ||
+ | |} | ||
+ | </div> | ||
+ | |||
== USI-I2C-Slave == | == USI-I2C-Slave == |
Version vom 3. Dezember 2006, 02:00 Uhr
In diesem Artikel folgen einige Programmbeispiele um das USI-Hardwaremodul der AVRs zu verwenden. Mit dem USI-Modul können die Schnittstellen I2C (TWI) und SPI nachgebildet werden. Näheres zu USI, I2C und SPI finden sich in den entsprechenden Artikeln. Die Beispiele sind zwar in Bascom Basic verfasst, aber so ausgeführt, das es möglich sein sollte das Prinzip mit jeder anderen Sprache nachvollziehen zu können.
Inhaltsverzeichnis
USI-I2C-Master
Ist der AVR Master, bestimmt er was und wie schnell es auf dem I2C-Bus zugeht. (Ausnahme: Clock_Stretching )
Zur Generierung der gewünschten Busgeschwindigkeit ist die Software zuständig, die länge der Pausen zwischen den Takten muss erechnet werden, im Beispielprogramm für ca. 100kHz bei 16MHz CPU-Frequenz. Der Takt kann auch mithilfe eines Timers erzeugt werden, dies wird erst zu einem späteren Zeitpunkt mit einem Beispiel gezeigt.
In den Beispielen wird als Master das Board RN-Control mit einem Tiny2313, und als Slave ein PCF8574, da sich dieser leicht ansteuern lässt.
Transmitter
- Nur Senden
Der Master sendet einem Slave ein (oder mehrere) Byte, und schliesst die Übertragung anschliessend ab.
Das Gegenstück wäre Slave Receiver.
Beispielprogramm sendet ein Byte zum Slave mit Adresse 64 (0x40 bzw. &H40):
' USI-I2C Testprogramm ' mit PCF8574 @ &H40 ' ' ohne Interrupt und ohne Timer ' ein Byte senden $regfile = "attiny2313.dat" $crystal = 16000000 $baud = 9600 ' Unterprogramme für die USI-Kommunikation Declare Sub Usi_twi_master_initialise() Declare Sub Usi_twi_start_transceiver() Declare Sub Usi_twi_master_stop() Declare Sub Usi_twi_master_transfer() ' einige Aliases anlegen Pout_usi_scl Alias Portb.7 Pin_usi_scl Alias Pinb.7 Ddr_usi_scl Alias Ddrb.7 Pout_usi_sda Alias Portb.5 Pin_usi_sda Alias Pinb.5 Ddr_usi_sda Alias Ddrb.5 Dim Usi_twi_errorstate As Byte ' eigener Fehlerstatus ' Array der Daten die übertragen werden Dim Messagebuf(4) As Byte Dim Temp_usisr As Byte ' Tempvariable für Unterprogramm Dim Anzahlbuf As Byte ' Anzahl Zeichen die gesendet werden sollen Dim Cnt As Byte ' Zähler Dim B As Byte ' Zeichen von UART oder Testzeichen zum senden über USI ' Prepare register value to: Clear flags, and set USI to shift 8 bits i.e. count 16 clock edges. Const Temp_usisr_8bit = &HF0 ' Prepare register value to: Clear flags, and set USI to shift 1 bit i.e. count 2 clock edges. Const Temp_usisr_1bit = &HFE B = 0 Anzahlbuf = 2 ' in diesem Beispiel immer nur 2 Zeichen Waitms 300 ' Sicherheitspause nach Reset Call Usi_twi_master_initialise Print Print "Tiny2313 USI-TWI-Test" Messagebuf(1) = &H40 ' Adresse von 8574 Do ' warten bis etwas über UART kommt Input B ' oder automatisch zählen lassen ' Incr B ' Den Wert zum Slave senden Messagebuf(2) = Not B ' not, weil andersrum Call Usi_twi_start_transceiver ' Ausgabe, damit wir sehen was geschehen ist Print B ; Print " " Print Hex(usi_twi_errorstate); Print " " ; Print Hex(temp_usisr) Call Usi_twi_master_initialise ' nochmal initialisieren falls ein Fehler aufgetreten ist ' Waitms 700 ' Wenn automatisch gezählt werden soll, eine kleine Pause, damit man auch was sehen kann Loop End ' USI TWI single master initialization function Sub Usi_twi_master_initialise() ' Direction Out Ddr_usi_scl = 1 Ddr_usi_sda = 1 ' Release SCL & SDA Pout_usi_scl = 1 Pout_usi_sda = 1 ' Preload dataregister with "released level" data. Usidr = &HFF ' Disable Interrupts. ' Set USI in Two-wire mode. ' Software stobe as counter clock source Usicr = &B00101010 ' Clear flags, and reset counter. Usisr = &B11110000 End Sub ' USI Transmit and receive function. Sub Usi_twi_start_transceiver() Usi_twi_errorstate = 0 ' Test if any unexpected conditions have arrived prior to this execution. ' Ist eine Startbedingung aufgetreten ? If Usisr.7 = 1 Then ' USISIF Usi_twi_errorstate = &H02 ' Usi_twi_ue_start_con Exit Sub End If ' Ist eine Stopbedingung aufgetreten ? If Usisr.5 = 1 Then ' USIPF Usi_twi_errorstate = &H03 ' Usi_twi_ue_stop_con Exit Sub End If ' Ist eine Datenkollision aufgetreten ? If Usisr.4 = 1 Then ' USIDC Usi_twi_errorstate = &H04 ' Usi_twi_ue_data_col Exit Sub End If ' Release SCL to ensure that (repeated) Start can be performed Pout_usi_scl = 1 Waitus 5 ' Generate Start Condition Pout_usi_sda = 0 ' Force SDA LOW. Waitus 4 Pout_usi_scl = 0 ' Pull SCL LOW. Pout_usi_sda = 1 ' Release SDA. ' checken ob die Startsequenz vom eigenen USI erkannt wurde If Usisr.7 = 0 Then ' USISIF Usi_twi_errorstate = &H07 Exit Sub End If ' Write address and Read/Write data For Cnt = 1 To Anzahlbuf ' Write a byte Pout_usi_scl = 0 ' Pull SCL LOW. Usidr = Messagebuf(cnt) Temp_usisr = Temp_usisr_8bit Call Usi_twi_master_transfer ' Clock and verify (N)ACK from slave Ddr_usi_sda = 0 ' Enable SDA as input. Temp_usisr = Temp_usisr_1bit Call Usi_twi_master_transfer ' kein ACK gekommen, Slave meldet sich nicht If Temp_usisr.0 = 1 Then Usi_twi_errorstate = &H05 If Cnt = 1 Then Usi_twi_errorstate = &H06 ' Es hat sich kein Slave gemeldet End If Exit For ' hier wird die Schleife bei einem NACK verlasssen End If Next Cnt Call Usi_twi_master_stop End Sub ' Function for generating a TWI Stop Condition. Used to release the TWI bus. Sub Usi_twi_master_stop() Pout_usi_sda = 0 ' Pull SDA LOW. Pout_usi_scl = 1 ' Release SCL. ' Wait for SCL to go high. While Pin_usi_scl = 0 Wend Waitus 4 Pout_usi_sda = 1 ' Release SDA. Waitus 5 ' checken ob die Stopsequenz vom eigenen USI erkannt wurde If Usisr.5 = 0 Then ' USIPF Usi_twi_errorstate = &H08 ' Exit Sub ' Exit nicht nötig da schon das Ende erreicht End If Usisr.5 = 1 ' USIPF zurücksetzen End Sub ' Core function for shifting data in and out from the USI. ' Data to be sent has to be placed into the USIDR prior to calling ' this function. Data read, will be return'ed from the function. Sub Usi_twi_master_transfer() Usisr = Temp_usisr Temp_usisr = &B00101011 ' for Toggle Clock Port. Do Waitus 5 Usicr = Temp_usisr ' Wait for SCL to go high. While Pin_usi_scl = 0 Wend Waitus 4 Usicr = Temp_usisr Loop Until Usisr.6 = 1 ' USIOIF, Check for transfer complete. Waitus 5 Temp_usisr = Usidr ' Read out data. Usidr = &HFF ' Release SDA. Ddr_usi_sda = 1 ' Enable SDA as output. End Sub
Receiver
- Nur Empfangen
Der Master holt von einem Slave ein (oder mehrere) Byte, und schliesst die Übertragung anschliessend ab.
Das Gegenstück wäre Slave Transmitter.
Beispielprogramm holt ein Byte vom Slave mit Adresse 64 (0x40 bzw. &H40):
' USI-I2C Testprogramm ' mit PCF8574 @ &H40 ' ' ohne Interrupt und ohne Timer ' ein Byte lesen Do Loop End
Transmitter und Receiver mit DS1621 als Slave
- Senden und Empfangen (Repeated Start)
Im Beispiel wird ein DS1621 Temperatursensor mit I2C-Schnittstelle verwendet Der Master sendet einem Slave ein Kommando, stellt um auf Empfang und holt den Temperaturwert, schliesst die Übertragung anschliessend ab.
Der Temperaturwert wird über UART (RS232) im Klartext ausgegeben.
Die Subroutinen sind im Prinzip die gleichen wie bei Master Transmitter. Da der DS1621 aber mit 400kHz kommunizieren kann, wurden die Waitus zwischen den Pegelwechseln weggelassen da die Befehle hier sowieso nicht schnell genug sind, und ein Wait unnötig machen. Sie sind aber als Kommentar eingefügt, damit zu sehen ist an welchen Stellen ansonsten gewartet werden sollte.
Beispielprogramm holt Temperaturwert vom Slave mit Adresse 144 (0x90 bzw. &H90):
(Das Beispiel belegt 1348 Byte im Flash, das sind ca. 65% eines Tiny2313 !)
' USI-I2C Testprogramm ' mit DS1621 @ &H90 ' ' ohne Interrupt und ohne Timer ' Temperatur von DS1621 lesen, und über UART ausgeben $regfile = "attiny2313.dat" $crystal = 16000000 $baud = 9600 ' Unterprogramme für die USI-Kommunikation Declare Sub Usi_twi_master_initialise() Declare Sub Usi_twi_start_transceiver() Declare Sub Usi_twi_master_stop() Declare Sub Usi_twi_master_transfer() ' einige Aliases anlegen Pout_usi_scl Alias Portb.7 Pin_usi_scl Alias Pinb.7 Ddr_usi_scl Alias Ddrb.7 Pout_usi_sda Alias Portb.5 Pin_usi_sda Alias Pinb.5 Ddr_usi_sda Alias Ddrb.5 Dim Usi_twi_errorstate As Byte ' eigener Fehlerstatus ' Array der Daten die übertragen werden Dim Messagebuf(4) As Byte Dim Temp_usisr As Byte ' Tempvariable für Unterprogramm Dim Anzahlbuf As Byte ' Anzahl Zeichen die gesendet werden sollen Dim Cnt As Byte ' Zähler Dim Rw As Bit ' Read/Write Flag ' Prepare register value to: Clear flags, and set USI to shift 8 bits i.e. count 16 clock edges. Const Temp_usisr_8bit = &HF0 ' Prepare register value to: Clear flags, and set USI to shift 1 bit i.e. count 2 clock edges. Const Temp_usisr_1bit = &HFE Anzahlbuf = 2 ' in diesem Beispiel immer nur 2 Zeichen Waitms 500 ' Sicherheitspause nach Reset Call Usi_twi_master_initialise Dim Device As Byte Dim Deviceread As Byte Dim Lowtemp As Byte Dim Hightemp As Byte Device = &H90 Deviceread = &H91 Sound Portd.5 , 300 , 450 ' BEEP Print Print "DS1621-USI Temperatur" ' Hauptprogramm Do Messagebuf(1) = Device ' Adresse von DS1621 Messagebuf(2) = &HEE ' Temperaturmessung anstoßen Anzahlbuf = 2 Call Usi_twi_start_transceiver ' Print Hex(usi_twi_errorstate) If Usi_twi_errorstate = 0 Then ' kein Fehler aufgetreten Call Usi_twi_master_stop ' Print Hex(usi_twi_errorstate) ' Waitms 1 Messagebuf(1) = Device ' Adresse von DS1621 Messagebuf(2) = &HAA ' Temperaturmessung Lesekommando Anzahlbuf = 2 Call Usi_twi_start_transceiver ' Print Hex(usi_twi_errorstate) ' kein STOP an dieser Stelle ! ' es folgt ein Repeated START ! If Usi_twi_errorstate = 0 Then ' kein Fehler aufgetreten ' Temperatur lesen Messagebuf(1) = Deviceread ' Adresse von DS1621 Messagebuf(2) = 0 Messagebuf(3) = 0 Anzahlbuf = 3 Call Usi_twi_start_transceiver ' Print Hex(usi_twi_errorstate) If Usi_twi_errorstate = 0 Then ' kein Fehler aufgetreten Call Usi_twi_master_stop ' Print Hex(usi_twi_errorstate) Lowtemp = Messagebuf(2) Hightemp = Messagebuf(3) Print Lowtemp ; "," ; If Hightemp = &H80 Then Print "5" Else Print "0" End If End If End If End If If Usi_twi_errorstate <> 0 Then ' bei einem Fehler den Fehlercode ausgeben Print "Error " ; Hex(usi_twi_errorstate) End If Call Usi_twi_master_initialise ' nochmal initialisieren falls ein Fehler aufgetreten ist Waitms 2000 Loop End ' USI TWI single master initialization function Sub Usi_twi_master_initialise() ' Direction Out Ddr_usi_scl = 1 Ddr_usi_sda = 1 ' Release SCL & SDA Pout_usi_scl = 1 Pout_usi_sda = 1 ' Preload dataregister with "released level" data. Usidr = &HFF ' Disable Interrupts. ' Set USI in Two-wire mode. ' Software stobe as counter clock source Usicr = &B00101010 ' Clear flags, and reset counter. Usisr = &B11110000 End Sub ' USI Transmit and receive function. Sub Usi_twi_start_transceiver() Usi_twi_errorstate = 0 ' Test if any unexpected conditions have arrived prior to this execution. If Usisr.7 = 1 Then ' USISIF Usi_twi_errorstate = &H02 ' Usi_twi_ue_start_con Exit Sub End If If Usisr.5 = 1 Then ' USIPF Usi_twi_errorstate = &H03 ' Usi_twi_ue_stop_con Exit Sub End If If Usisr.4 = 1 Then ' USIDC Usi_twi_errorstate = &H04 ' Usi_twi_ue_data_col Exit Sub End If ' Release SCL to ensure that (repeated) Start can be performed Pout_usi_scl = 1 Waitus 1 ' 5 ' Generate Start Condition Pout_usi_sda = 0 ' Force SDA LOW. ' Waitus 4 Pout_usi_scl = 0 ' Pull SCL LOW. Pout_usi_sda = 1 ' Release SDA. ' checken ob die Startsequenz vom eigenen USI erkannt wurde If Usisr.7 = 0 Then ' USISIF Usi_twi_errorstate = &H07 Exit Sub End If Rw = Messagebuf(1).0 ' Write address and Read/Write data For Cnt = 1 To Anzahlbuf ' SlaveAdresse immer Write, sonst auf R/W prüfen ' RW-Bit : Messagebuf(1).0 ist 1 If Cnt = 1 Or Rw = 0 Then ' Write a byte Pout_usi_scl = 0 ' Pull SCL LOW. Usidr = Messagebuf(cnt) Temp_usisr = Temp_usisr_8bit Call Usi_twi_master_transfer ' Clock and verify (N)ACK from slave Ddr_usi_sda = 0 ' Enable SDA as input. Temp_usisr = Temp_usisr_1bit Call Usi_twi_master_transfer ' kein ACK gekommen If Temp_usisr.0 = 1 Then Usi_twi_errorstate = &H05 ' Der Slave hat die Daten mit NACK quittiert If Cnt = 1 Then Usi_twi_errorstate = &H06 ' Es hat sich kein Slave gemeldet End If Exit For ' die Schleife bei einem Fehler verlasssen End If Else ' Read a Byte Ddr_usi_sda = 0 ' Enable SDA as input. Temp_usisr = Temp_usisr_8bit Call Usi_twi_master_transfer Messagebuf(cnt) = Temp_usisr ' Empfangenes Byte ins Array ' Prepare to generate ACK (or NACK in case of End Of Transmission) If Cnt = Anzahlbuf Then Usidr = &HFF ' Load NACK to confirm End Of Transmission. Else Usidr = &H00 ' Load ACK. Set data register bit 7 (output for SDA) low. End If Temp_usisr = Temp_usisr_1bit Call Usi_twi_master_transfer ' ACK oder NACK senden End If Next Cnt End Sub ' Function for generating a TWI Stop Condition. Used to release the TWI bus. Sub Usi_twi_master_stop() Pout_usi_sda = 0 ' Pull SDA LOW. Pout_usi_scl = 1 ' Release SCL. ' Wait for SCL to go high. While Pin_usi_scl = 0 Wend ' Waitus 4 Pout_usi_sda = 1 ' Release SDA. Waitus 1 ' 5 ' checken ob die Stopsequenz vom eigenen USI erkannt wurde If Usisr.5 = 0 Then ' USIPF Usi_twi_errorstate = &H08 ' Exit Sub ' Exit nicht nötig da schon das Ende erreicht End If Usisr.5 = 1 ' USIPF zurücksetzen End Sub ' Core function for shifting data in and out from the USI. ' Data to be sent has to be placed into the USIDR prior to calling ' this function. Data read, will be return'ed from the function. Sub Usi_twi_master_transfer() Usisr = Temp_usisr Temp_usisr = &B00101011 ' for Toggle Clock Port. Do ' Waitus 5 Usicr = Temp_usisr ' Wait for SCL to go high. While Pin_usi_scl = 0 Wend ' Waitus 4 Usicr = Temp_usisr Loop Until Usisr.6 = 1 ' USIOIF, Check for transfer complete. ' Waitus 5 Temp_usisr = Usidr ' Read out data. Usidr = &HFF ' Release SDA. Ddr_usi_sda = 1 ' Enable SDA as output. End Sub
Fehlercodes aus den Beispielen
Wenn ein unerwartetes Ereignis auftreten sollte, wird eine Zahl ausgegeben, hier ist deren Bedeutung dazu. Die Fehlercodes wurden aus den Beispielen von Atmel übernommen. (siehe Weblinks)
Code | Kurzbezeichnung | Fehlerbeschreibung |
---|---|---|
02 | USI_TWI_UE_START_CON | Unerwartete Start Bedingung aufgetreten |
03 | USI_TWI_UE_STOP_CON | Unerwartete Stop Bedingung aufgetreten |
04 | USI_TWI_UE_DATA_COL | Unerwartete Data Collision (arbitration) |
05 | USI_TWI_NO_ACK_ON_DATA | Der Slave hat die Daten nicht per ACK quittiert |
06 | USI_TWI_NO_ACK_ON_ADDRESS | Es hat sich kein Slave per ACK gemeldet |
07 | USI_TWI_MISSING_START_CON | Erzeugte Start Bedingung nicht erkannt |
08 | USI_TWI_MISSING_STOP_CON | Erzeugte Stop Bedingung nicht erkannt |
USI-I2C-Slave
Da der I2C-Master den Takt vorgibt, sind die Anmerkungen zur CPU-Frequenz zu beachten.
In den Beispielen wird als Master das Board RN-Mega8 mit einem Mega8, und als Slave das RN-Control Board, mit dem Adapter auf dem der Tiny2313 sitzt, verwendet. Da nur diese beiden Boards am Bus hängen, wurde ebenfalls als Slaveadresse 64 (0x40 bzw. &H40) verwendet, damit man die vorhergehenden Beispiele gleich weiterverwenden kann.
Transmitter
- auf Abruf Senden
Der Slave wird von einem Master über eine festgelegte Adresse angesprochen, ein (oder mehrere) Byte werden zum Master übertragen, und anschliessend die Übertragung beendet.
Das Gegenstück wäre Master Receiver.
Das Beispielprogramm gibt Bytewerte zurück die sich bei jeder Abfrage um eins erhöhen. Verwendet man beim Master das Beispiel von Master Receiver, wird der Wert nach jeder Eingabe von Enter angezeigt.
' USI-I2C-Slave test ' zum simulieren eines PCF8574 Do Loop End
Receiver
- Nur Empfangen
Der Slave wird von einem Master über eine festgelegte Adresse angesprochen, ein (oder mehrere) Byte werden zum Slave übertragen, und anschliessend die Übertragung beendet.
Das Gegenstück wäre Master Transmitter.
Das Beispielprogramm gibt die Bytewerte an PortC aus (aber nur die oberen 6 bit, da die beiden unteren für I2C verwendet werden), an dem beim RN-Control eine LED-Reihe angeschlossen ist. Verwendet man beim Master das Beispiel von Master Transmitter, wird der Wert, den man dort eingibt am Slave Binär angezeigt.
' TWI-slave test ' zum simulieren eines PCF8574 Do Loop End
Siehe auch
- Avr - Infos zu AVR allgemein
- I2C - Details zu I2C
- TWI - Two-wire Serial Interface
- SPI - Serial Peripheral Interface
- TWI Praxis - Bascom-Beispiele für Hardware TWI
- TWI Praxis Multimaster - Bascom-Beispiele für Hardware TWI
WebLinks
- [1] - Thread im Forum der zu diesem hier geführt hat
- [2] - DS1621 bei Robotikhardware
- Atmel_AVR310 - Using the USI module as a I2C master
- Atmel_AVR312 - Using the USI module as a I2C slave
Baustelle
An diesem Artikel arbeitet gerade Mitglied Linux_80.
Am besten momentan noch keine gravierenden Ergänzungen / Änderungen vornehmen. Dieser Hinweis verschwindet wenn der Autor soweit ist. Sollte dieser Hinweis länger als drei Tage auf einer Seite sein, bitte beim Autor Linux_80 per PM / Mail oder Forum nachfragen ob er vergessen wurde. |
--Linux 80 02:11, 26. Nov 2006 (CET)