Frank
24.09.2004, 14:17
http://www.shop.robotikhardware.de/shop/catalog/images/meinelogos/roboternetzstandard.gif
Als passende Ergänzung zu den bisherigen Projekten
ist nun auch ein Mega8 Board fertig
RN-MEGA 8
Dieses Board wurde speziell zum Experimentieren mit dem AVR Mikrocontroller MEGA8 entworfen. Der Controller Mega 8 eignet sich wegen seines günstigen Preises als auch geringen Baugröße für zahlreiche Aufgaben, bei denen ein Mega16 überdimensioniert oder einfach zu groß wäre.
Im Bereich Robotik kann dieser Controller ideal als CoController für Servosteuerung, Motorsteuerung, Display Ausgabe, Sensorüberwachung und viele mehr eingesetzt werden. Oft sind kaum externe Bauteile notwendig. Um den Controller jedoch für eine spezielle Aufgabe programmieren zu können, bedarf es einer Entwicklungsumgebung die quasi alle Ports steckbar zugänglich macht, als auch die visuelle Überwachung der Port-Zustände erlaubt.
Für diese Aufgabe ist RN-MEGA8 ideal! Ganze 20 Ports können gleichzeitig visuell über Leuchtbalken überwacht werden. Nahezu alle Ports sind über einfache Steckklemmen erreichbar. Zudem verfügt das Board über einen genormten LCD-Display- , I2C-Bus-, RS232-, Servo- und ISP-Anschluß.
RN-MEGA8 soll also kein Ersatz für das inzwischen recht beliebte und bereits vielfach eingesetzte Board RN-CONTROL (https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=138) sein, sondern vielmehr ein universelles Ergänzungsboard.
http://www.robotikhardware.de/bilder/rnmega8/rnmega8display.jpg
Als hier die Leistungsmerkmale auf einen Blick:
Beliebiger Quarz kann eingesteckt werden (7,37 und 16 Mhz im Lieferumfang)
Schneller AVR Mega 8 Mikrocontroller (bis zu 8K Flash Speicher, 1K Ram und 0,5K EEPROM), 23 programmierbare I/O Pins, 6 AD Ports u.v.m.
20 Leuchtdioden über zwei Balkenanzeigen auf dem Board – über Jumper deaktivierbar
fast alle Portleitungen sind über Steckklemmen mit Hebelmechanik herausgeführt. Kein löten mehr, Drähte und Litze kann einfach eingeklemmt werden
Alle Stecker RS232, ISP, LCD, I2C-BUS entsprechen der vereinbarten Roboternetz-Norm
Potentiale (GND und +5V) send mehrfach über Steckbuchsen erreichbar. Ideal zum experimentieren da einfach Drähte (ca. 0,5mm²) eingesteckt werden (kein Löten oder schrauben).
Integrierter programmierbarer Mini-Lautsprecher um Töne auszugeben
Ein Reset Taster
5 Taster für beliebige Verwendung. Sie belegen nur einen analogen Port!
5 V Spannungsstabilisierung mit 2 A Belastbarkeit, auch herausgeführt für Erweiterungen
Eingangsspannung gegen Verpolung geschützt
ISP-Dongel wird über Diode versorgt (da einige Dongels dies nicht eingebaut haben)
RS232 mit normgerechtem Pegelwandler (MAX232) – PC direkt anschließbar
Batteriespannung kann im Programm abgefragt werden
ISP – Programmierschnittstelle für übliche AVR-Programmieradapter (10polig)
Betriebsspannung wahlweise zwischen 7 und 18V (empfohlen 7 bis 20 V)
Sehr kompakt, nur halbes Europaformat nach Roboternetz-Norm ( 100x78mm)
I2C-Bus über die zahlreiche Erweiterungsplatinen anschließbar sind (z.B. Sprachausgabe RN-Speak, Relaisboard RN-Relais, Servoboards, LCD´s, RN-Control uvm.).
RN-MEGA8 kann auch selbst als Slave Erweiterung für anderes Board (z.B. RN-Control) dienen
Ein- und Ausschalter auf der Platine
Programmierbar in zahlreichen Sprachen, z.B. Basic (BASCOM Compiler, eingeschränkt bis 2K wird mitgeliefert), C (C-Compiler GCC wird mitgeliefert), Assembler, Pascal
Deutsche Doku mit Basic Programmbeispiel
Preiswerter Bausatz erhältlich – einfacher Aufbau
Kein Starter- oder Applikationsboard notwendig – bereits alles integriert!
Display Anschluß und Kontrastregler auf Board
Bauanleitung im Download Bereich :
https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=170
Platine oder Bausatz kann auch über robotikhardware.de (http://www.robotikhardware.de) bezogen werden
Platinen-Übersicht hier:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=1511
Hier ein erstes Ansteuerbeispiel. Ist wirklich einfach:
'################################################# ##
'rnmega8test.BAS
'für
'RoboterNetz Board RN-MEGA8 ab Version 1.0
'Das neue preiswerte Entwicklungsboard zum experimentieren
'
'Aufgabe:
' Dieses Testprogramm testet gleich mehrere Eigenschaften auf dem Board
' Den verschiedenen Tasten sind bestimmte Funktionen zugeordnet
' Taste 1: Zeigt Batteriespannung über RS232 und LCD an
' Taste 2: Gibt per Zufall einen Lottozahlentip ab - 6 aus 49
' Taste 3: Einige male Lauflicht über ein Balken-LED´s (2 Ports bleiben an, da dies rs232 Ports sind)
' Bei einer LED kommt es zu leichtem Knacksen, da der Piepser diesen Port ebenfalls nutzt
' Taste 4: Ein einfaches Sirenengeräusch
''Taste 5: Zeigt Copyriht auf LCD Display
' Ser gut kann man aus dem Demo auch entnehmen wie Sound ausgegeben wird,
' wie Tasten abgefragt werden und wie Subroutinen und Funktionen angelegt werden
'Autor: Frank
'Weitere Beispiele und Beschreibung der Hardware
'unter http://www.Roboternetz.de oder robotikhardware.de
'Eigene Programmbeispiele sind im Roboternetz gerne willkommen!
'################################################# #############
Declare Sub Batteriespannung()
Declare Sub Lauflicht()
Declare Function Tastenabfrage() As Byte
Declare Sub Textauflcdausgeben()
Declare Sub Lottozahlen()
Declare Sub Sirene()
$regfile = "m8def.dat"
Dim I As Integer
Dim N As Integer
Dim Ton As Integer
Dim Ws As Word 'Wird für Messung bei Tastenabfrage verwendet
Dim Adc_ohne_taste As Word
$crystal = 16000000 'Quarzfrequenz
'$crystal = 7372800 'Quarzfrequenz
$baud = 9600
Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung
Config Pinc.0 = Input 'Für Tastenabfrage
Portc.0 = 1 'Pullup Widerstand ein
Start Adc
Const Ref = 2.5 / 1023 'Für Batteriespannungsberechnung
'Bei einer anderen Referenzspannung muss die 2.5 durch entsprechend ersetzt werden
'Die Referenzspannung wird durch den Spannungsteiler R12/R13 festgelegt
Dim Taste As Byte
Dim Volt As Single
Config Pind.6 = Output
Portd.6 = 0
' Falls ein LCD Display angeschlossen ist
Dim ___lcdno As Bit
Config Lcdpin = Pin , E = Portc.3 , E2 = Portd.7 , Rs = Portc.2 , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5
Config Lcd = 40 * 4
I = 0
Sound Portb.0 , 400 , 450 'BEEP
Sound Portb.0 , 400 , 250 'BEEP
Sound Portb.0 , 400 , 450 'BEEP
Print
Print "**** RN-MEGA8 V1.0 *****"
Print "Das neue Mega 8 Entwicklungsboard von www.robotikhardware.de"
Print
Call Textauflcdausgeben
Adc_ohne_taste = Getadc(0) 'Messe Spannung wenn keine Taste gedrückt ist
Adc_ohne_taste = Adc_ohne_taste - 2 'für Toleranz abziehen
Do
Taste = Tastenabfrage()
If Taste <> 0 Then
Select Case Taste
Case 1
Call Batteriespannung 'Taste 1 Zeigt Bateriespannung über RS232 an
Case 2
Call Lottozahlen 'Gibt Lottozahlen-Tip (ohne Gewähr) über rs232 und lcd
'Bei Gewinn bitte mit Autor Frank teilen :-)
Case 3
Call Lauflicht 'Einige male Lauflicht über Balken LED´s anzeigen
Case 4
Call Sirene
Case 5
Call Textauflcdausgeben
End Select
Sound Portb.0 , 400 , 500 'BEEP
End If
Waitms 100
Loop
End
'Diese Unterfunktion fragt die Tastatur am analogen Port ab
Function Tastenabfrage() As Byte
Tastenabfrage = 0
Ton = 600
Ws = Getadc(0)
' Print "ws=" ; Ws
If Ws < Adc_ohne_taste Then
Select Case Ws
Case 880 To 900
Tastenabfrage = 1
Ton = 550
Case 800 To 850
Tastenabfrage = 2
Ton = 500
Case 650 To 690
Tastenabfrage = 3
Ton = 450
Case 450 To 500
Tastenabfrage = 4
Ton = 400
Case 230 To 280
Tastenabfrage = 5
Ton = 350
Case Else
Print "Bitte Tastenabfrage an Messert ws=" ; Ws ; " anpassen!"
End Select
Sound Portb.0 , 400 , Ton 'BEEP
End If
End Function
'Diese Unterfunktion zeigt Bateriespannung an
Sub Batteriespannung()
Local W As Word
Start Adc
W = Getadc(1)
Volt = W * Ref
Volt = Volt * 5.2941
Print "Die aktuelle Spannung beträgt: " ; Volt ; " Volt"
'Auch auf LCD ausgeben
___lcdno = 0
Cls
Locate 1 , 1
Lcd "Spannung:" ; Fusing(volt , "#.##") ; " Volt"
End Sub
'Dies Funktion gibt auf einem angeschlossenen LCD-Display (2x27 Zeichen)
'eine Copyright Meldung aus
Sub Textauflcdausgeben()
___lcdno = 0 'Ober Displayhälfte initialisieren, wenn das Display zwei LCD-Controller besitzt
Initlcd
Cursor Off
Cls
Home
Lcd "Das neue Experimentierboard"
Locate 2 , 4
Lcd "***** RN-MEGA 8 *****"
___lcdno = 1 'Dies ist nur notwendig wenn das Display zwei LCD-Controller besitzt
Initlcd
Cursor Off
Cls
Home
Lcd "nach Roboternetz Standard"
Locate 2 , 3
Lcd "(c) robotikhardware.de"
End Sub
'Einige male Lauflicht über Balkenanzeige laufen lassen
Sub Lauflicht()
Config Portd = Output
Config Pinb.0 = Output
Config Pinb.1 = Output
Portd = 0
Portb.0 = 0
Portb.1 = 0
For N = 1 To 10
For I = 0 To 9
Select Case I
Case 0 To 7 :
Portd.i = 1
Waitms 150
Portd.i = 0
Case 8:
Portb.0 = 1
Waitms 150
Portb.0 = 0
Case 9:
Portb.1 = 1
Waitms 150
Portb.1 = 0
End Select
Next I
Next N
Config Portd = Input
Config Pinb.0 = Input
Config Pinb.1 = Input
!Call 0 'Führt RESET aus
End Sub
Sub Lottozahlen()
Print "Lotozahlen: ";
___lcdno = 0 'Ober Displayhälfte initialisieren, wenn das Display zwei LCD-Controller besitzt
Initlcd
Cursor Off
Cls
Home
Lcd "Lottozahlentip-ohne Gewaehr):" "
Locate 2 , 1
For I = 1 To 6
N = Rnd(48)
N = N + 1
Print " " ; N ;
Lcd " " ; N;
Next I
Print
End Sub
Sub Sirene()
For N = 1 To 5
For I = 500 To 900
Sound Portb.0 , 5 , I
Next I
For I = 900 To 500 Step -1
Sound Portb.0 , 5 , I
Next I
Next N
End Sub
http://www.robotikhardware.de/bilder/rnmega8/rnmega8diagrammgross.jpg
Kombinationsmöglichkeiten als Grafik hier (https://www.roboternetz.de/bilder/boardkombination.gif)
Als passende Ergänzung zu den bisherigen Projekten
ist nun auch ein Mega8 Board fertig
RN-MEGA 8
Dieses Board wurde speziell zum Experimentieren mit dem AVR Mikrocontroller MEGA8 entworfen. Der Controller Mega 8 eignet sich wegen seines günstigen Preises als auch geringen Baugröße für zahlreiche Aufgaben, bei denen ein Mega16 überdimensioniert oder einfach zu groß wäre.
Im Bereich Robotik kann dieser Controller ideal als CoController für Servosteuerung, Motorsteuerung, Display Ausgabe, Sensorüberwachung und viele mehr eingesetzt werden. Oft sind kaum externe Bauteile notwendig. Um den Controller jedoch für eine spezielle Aufgabe programmieren zu können, bedarf es einer Entwicklungsumgebung die quasi alle Ports steckbar zugänglich macht, als auch die visuelle Überwachung der Port-Zustände erlaubt.
Für diese Aufgabe ist RN-MEGA8 ideal! Ganze 20 Ports können gleichzeitig visuell über Leuchtbalken überwacht werden. Nahezu alle Ports sind über einfache Steckklemmen erreichbar. Zudem verfügt das Board über einen genormten LCD-Display- , I2C-Bus-, RS232-, Servo- und ISP-Anschluß.
RN-MEGA8 soll also kein Ersatz für das inzwischen recht beliebte und bereits vielfach eingesetzte Board RN-CONTROL (https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=138) sein, sondern vielmehr ein universelles Ergänzungsboard.
http://www.robotikhardware.de/bilder/rnmega8/rnmega8display.jpg
Als hier die Leistungsmerkmale auf einen Blick:
Beliebiger Quarz kann eingesteckt werden (7,37 und 16 Mhz im Lieferumfang)
Schneller AVR Mega 8 Mikrocontroller (bis zu 8K Flash Speicher, 1K Ram und 0,5K EEPROM), 23 programmierbare I/O Pins, 6 AD Ports u.v.m.
20 Leuchtdioden über zwei Balkenanzeigen auf dem Board – über Jumper deaktivierbar
fast alle Portleitungen sind über Steckklemmen mit Hebelmechanik herausgeführt. Kein löten mehr, Drähte und Litze kann einfach eingeklemmt werden
Alle Stecker RS232, ISP, LCD, I2C-BUS entsprechen der vereinbarten Roboternetz-Norm
Potentiale (GND und +5V) send mehrfach über Steckbuchsen erreichbar. Ideal zum experimentieren da einfach Drähte (ca. 0,5mm²) eingesteckt werden (kein Löten oder schrauben).
Integrierter programmierbarer Mini-Lautsprecher um Töne auszugeben
Ein Reset Taster
5 Taster für beliebige Verwendung. Sie belegen nur einen analogen Port!
5 V Spannungsstabilisierung mit 2 A Belastbarkeit, auch herausgeführt für Erweiterungen
Eingangsspannung gegen Verpolung geschützt
ISP-Dongel wird über Diode versorgt (da einige Dongels dies nicht eingebaut haben)
RS232 mit normgerechtem Pegelwandler (MAX232) – PC direkt anschließbar
Batteriespannung kann im Programm abgefragt werden
ISP – Programmierschnittstelle für übliche AVR-Programmieradapter (10polig)
Betriebsspannung wahlweise zwischen 7 und 18V (empfohlen 7 bis 20 V)
Sehr kompakt, nur halbes Europaformat nach Roboternetz-Norm ( 100x78mm)
I2C-Bus über die zahlreiche Erweiterungsplatinen anschließbar sind (z.B. Sprachausgabe RN-Speak, Relaisboard RN-Relais, Servoboards, LCD´s, RN-Control uvm.).
RN-MEGA8 kann auch selbst als Slave Erweiterung für anderes Board (z.B. RN-Control) dienen
Ein- und Ausschalter auf der Platine
Programmierbar in zahlreichen Sprachen, z.B. Basic (BASCOM Compiler, eingeschränkt bis 2K wird mitgeliefert), C (C-Compiler GCC wird mitgeliefert), Assembler, Pascal
Deutsche Doku mit Basic Programmbeispiel
Preiswerter Bausatz erhältlich – einfacher Aufbau
Kein Starter- oder Applikationsboard notwendig – bereits alles integriert!
Display Anschluß und Kontrastregler auf Board
Bauanleitung im Download Bereich :
https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=170
Platine oder Bausatz kann auch über robotikhardware.de (http://www.robotikhardware.de) bezogen werden
Platinen-Übersicht hier:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=1511
Hier ein erstes Ansteuerbeispiel. Ist wirklich einfach:
'################################################# ##
'rnmega8test.BAS
'für
'RoboterNetz Board RN-MEGA8 ab Version 1.0
'Das neue preiswerte Entwicklungsboard zum experimentieren
'
'Aufgabe:
' Dieses Testprogramm testet gleich mehrere Eigenschaften auf dem Board
' Den verschiedenen Tasten sind bestimmte Funktionen zugeordnet
' Taste 1: Zeigt Batteriespannung über RS232 und LCD an
' Taste 2: Gibt per Zufall einen Lottozahlentip ab - 6 aus 49
' Taste 3: Einige male Lauflicht über ein Balken-LED´s (2 Ports bleiben an, da dies rs232 Ports sind)
' Bei einer LED kommt es zu leichtem Knacksen, da der Piepser diesen Port ebenfalls nutzt
' Taste 4: Ein einfaches Sirenengeräusch
''Taste 5: Zeigt Copyriht auf LCD Display
' Ser gut kann man aus dem Demo auch entnehmen wie Sound ausgegeben wird,
' wie Tasten abgefragt werden und wie Subroutinen und Funktionen angelegt werden
'Autor: Frank
'Weitere Beispiele und Beschreibung der Hardware
'unter http://www.Roboternetz.de oder robotikhardware.de
'Eigene Programmbeispiele sind im Roboternetz gerne willkommen!
'################################################# #############
Declare Sub Batteriespannung()
Declare Sub Lauflicht()
Declare Function Tastenabfrage() As Byte
Declare Sub Textauflcdausgeben()
Declare Sub Lottozahlen()
Declare Sub Sirene()
$regfile = "m8def.dat"
Dim I As Integer
Dim N As Integer
Dim Ton As Integer
Dim Ws As Word 'Wird für Messung bei Tastenabfrage verwendet
Dim Adc_ohne_taste As Word
$crystal = 16000000 'Quarzfrequenz
'$crystal = 7372800 'Quarzfrequenz
$baud = 9600
Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung
Config Pinc.0 = Input 'Für Tastenabfrage
Portc.0 = 1 'Pullup Widerstand ein
Start Adc
Const Ref = 2.5 / 1023 'Für Batteriespannungsberechnung
'Bei einer anderen Referenzspannung muss die 2.5 durch entsprechend ersetzt werden
'Die Referenzspannung wird durch den Spannungsteiler R12/R13 festgelegt
Dim Taste As Byte
Dim Volt As Single
Config Pind.6 = Output
Portd.6 = 0
' Falls ein LCD Display angeschlossen ist
Dim ___lcdno As Bit
Config Lcdpin = Pin , E = Portc.3 , E2 = Portd.7 , Rs = Portc.2 , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5
Config Lcd = 40 * 4
I = 0
Sound Portb.0 , 400 , 450 'BEEP
Sound Portb.0 , 400 , 250 'BEEP
Sound Portb.0 , 400 , 450 'BEEP
Print "**** RN-MEGA8 V1.0 *****"
Print "Das neue Mega 8 Entwicklungsboard von www.robotikhardware.de"
Call Textauflcdausgeben
Adc_ohne_taste = Getadc(0) 'Messe Spannung wenn keine Taste gedrückt ist
Adc_ohne_taste = Adc_ohne_taste - 2 'für Toleranz abziehen
Do
Taste = Tastenabfrage()
If Taste <> 0 Then
Select Case Taste
Case 1
Call Batteriespannung 'Taste 1 Zeigt Bateriespannung über RS232 an
Case 2
Call Lottozahlen 'Gibt Lottozahlen-Tip (ohne Gewähr) über rs232 und lcd
'Bei Gewinn bitte mit Autor Frank teilen :-)
Case 3
Call Lauflicht 'Einige male Lauflicht über Balken LED´s anzeigen
Case 4
Call Sirene
Case 5
Call Textauflcdausgeben
End Select
Sound Portb.0 , 400 , 500 'BEEP
End If
Waitms 100
Loop
End
'Diese Unterfunktion fragt die Tastatur am analogen Port ab
Function Tastenabfrage() As Byte
Tastenabfrage = 0
Ton = 600
Ws = Getadc(0)
' Print "ws=" ; Ws
If Ws < Adc_ohne_taste Then
Select Case Ws
Case 880 To 900
Tastenabfrage = 1
Ton = 550
Case 800 To 850
Tastenabfrage = 2
Ton = 500
Case 650 To 690
Tastenabfrage = 3
Ton = 450
Case 450 To 500
Tastenabfrage = 4
Ton = 400
Case 230 To 280
Tastenabfrage = 5
Ton = 350
Case Else
Print "Bitte Tastenabfrage an Messert ws=" ; Ws ; " anpassen!"
End Select
Sound Portb.0 , 400 , Ton 'BEEP
End If
End Function
'Diese Unterfunktion zeigt Bateriespannung an
Sub Batteriespannung()
Local W As Word
Start Adc
W = Getadc(1)
Volt = W * Ref
Volt = Volt * 5.2941
Print "Die aktuelle Spannung beträgt: " ; Volt ; " Volt"
'Auch auf LCD ausgeben
___lcdno = 0
Cls
Locate 1 , 1
Lcd "Spannung:" ; Fusing(volt , "#.##") ; " Volt"
End Sub
'Dies Funktion gibt auf einem angeschlossenen LCD-Display (2x27 Zeichen)
'eine Copyright Meldung aus
Sub Textauflcdausgeben()
___lcdno = 0 'Ober Displayhälfte initialisieren, wenn das Display zwei LCD-Controller besitzt
Initlcd
Cursor Off
Cls
Home
Lcd "Das neue Experimentierboard"
Locate 2 , 4
Lcd "***** RN-MEGA 8 *****"
___lcdno = 1 'Dies ist nur notwendig wenn das Display zwei LCD-Controller besitzt
Initlcd
Cursor Off
Cls
Home
Lcd "nach Roboternetz Standard"
Locate 2 , 3
Lcd "(c) robotikhardware.de"
End Sub
'Einige male Lauflicht über Balkenanzeige laufen lassen
Sub Lauflicht()
Config Portd = Output
Config Pinb.0 = Output
Config Pinb.1 = Output
Portd = 0
Portb.0 = 0
Portb.1 = 0
For N = 1 To 10
For I = 0 To 9
Select Case I
Case 0 To 7 :
Portd.i = 1
Waitms 150
Portd.i = 0
Case 8:
Portb.0 = 1
Waitms 150
Portb.0 = 0
Case 9:
Portb.1 = 1
Waitms 150
Portb.1 = 0
End Select
Next I
Next N
Config Portd = Input
Config Pinb.0 = Input
Config Pinb.1 = Input
!Call 0 'Führt RESET aus
End Sub
Sub Lottozahlen()
Print "Lotozahlen: ";
___lcdno = 0 'Ober Displayhälfte initialisieren, wenn das Display zwei LCD-Controller besitzt
Initlcd
Cursor Off
Cls
Home
Lcd "Lottozahlentip-ohne Gewaehr):" "
Locate 2 , 1
For I = 1 To 6
N = Rnd(48)
N = N + 1
Print " " ; N ;
Lcd " " ; N;
Next I
End Sub
Sub Sirene()
For N = 1 To 5
For I = 500 To 900
Sound Portb.0 , 5 , I
Next I
For I = 900 To 500 Step -1
Sound Portb.0 , 5 , I
Next I
Next N
End Sub
http://www.robotikhardware.de/bilder/rnmega8/rnmega8diagrammgross.jpg
Kombinationsmöglichkeiten als Grafik hier (https://www.roboternetz.de/bilder/boardkombination.gif)