-
Huhu Frank,
ich habe jetzt schon ein paar Sachen in der Demo rumgeschoben. Dabei ist mir aufgefallen das Taste 1 bei mir das Display nicht auf 0 setzt. Wenn ich
Code:
For Z = 1 To 4
Led_display Z , 0
Next Z
unter Taste 3,4 und 5 Schreibe geht es jeweils mit sound "dii - düü" der unter Tastenabfrage definiert ist. Wenn ich taste 1 Drücke macht es nur "düü" (denke mal das es der 550er Sound ist) und das Display bleibt auf dem Wert den es vorher angezeigt hat.
Was sagt mit in dem Zusammenhang das?
Code:
Select Case Ws
Case 410 To 450
Hier nochmal meine umgebaute Demo:
Code:
'###################################################
'rncontrol_digitest.BAS Demo zu RN-Digi
'für
'RoboterNetz Board RN-CONTROL ab Version 1.1 und
'Zusatzboard RN-DIGI (vierstellig großes LED-Display per I2C)
'
'Aufgabe:
' Dieses Testprogramm demonstriert die Ansteuerung von RN-Digi
' Den verschiedenen Tasten sind bestimmte Funktionen zugeordnet
' Taste 1: Alle Ziffern auf 0 stellen (genau wie bei Reset)
' Taste 2: Nacheinander alle Ziffern von 0 bis 9 zählen
'Autor: Frank
'Weitere Beispiele und Beschreibung der Hardware
'unter http://www.Roboternetz.de oder robotikhardware.de
'Eigene Programmbeispiele sind im Roboternetz gerne willkommen!
'##############################################################
Declare Function Tastenabfrage() As Byte
Declare Sub Led_display_init()
Declare Sub Led_display(byval Ziffer As Byte , Byval Zahl As Byte)
$regfile = "m32def.dat"
$crystal = 16000000 'Quarzfrequenz
$baud = 9600
Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1
Const Rn_digi_slave_write = &H70
Const Rn_digi_slave_read = &H71
Const Dezimalpunktziffer = 2 'Segment wo Dezimalpunkt leuchten soll (0=keinen)
Dim Segmente As Byte
Dim Z As Byte
Dim I As Byte
Dim N As Integer
Dim Ton As Integer
Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung
Config Pina.7 = Input 'Für Tastenabfrage
Porta.7 = 1 'Pullup Widerstand ein
Dim Taste As Byte
I2cinit
Led_display_init
I = 0
Sound Portd.7 , 400 , 450 'BEEP
Sound Portd.7 , 400 , 250 'BEEP
Sound Portd.7 , 400 , 450 'BEEP
Do
Taste = Tastenabfrage()
If Taste <> 0 Then
Select Case Taste
Case 1
For Z = 1 To 4
Led_display Z , 0
Next Z
Case 2
For Z = 1 To 4 'Segmentnummer
For I = 0 To 9 'Zähle von 0 bis 9
Led_display Z , I
Waitms 50 'Wartezeit zwischen den Zahlen
Sound Portd.7 , 100 , 450 'BEEP
Next I
Sound Portd.7 , 50 , 650 'BEEP
Next Z
Case 3
For Z = 1 To 4
Led_display Z , 0
Next Z
Case 4
For Z = 1 To 4
Led_display Z , 0
Next Z
Case 5
For Z = 1 To 4
Led_display Z , 0
Next Z
End Select
Sound Portd.7 , 400 , 500 'BEEP
End If
Waitms 100
Loop
End
'Diese Unterfunktion fragt die Tastatur am analogen Port ab
Function Tastenabfrage() As Byte
Local Ws As Word
Tastenabfrage = 0
Ton = 600
Start Adc
Ws = Getadc(7)
If Ws < 1010 Then
Select Case Ws
Case 410 To 450
Tastenabfrage = 1
Ton = 550
Case 340 To 380
Tastenabfrage = 2
Ton = 500
Case 265 To 305
Tastenabfrage = 3
Ton = 450
Case 180 To 220
Tastenabfrage = 4
Ton = 400
Case 100 To 130
Tastenabfrage = 5
Ton = 350
End Select
Sound Portd.7 , 400 , Ton 'BEEP
End If
End Function
Sub Led_display_init()
I2cstart
I2cwbyte Rn_digi_slave_write
I2cwbyte 0 'Control Byte
'Dynamic Alternative Mode und Helligkeit
'Die oberen 3 Bits bestimmen die Helligkeit
'Wenn es dunkler sein soll dann z.b. &B0110111
I2cwbyte &B0010111
I2cstop
'Alle Ziffern auf 0
For Z = 1 To 4
Led_display Z , 0
Next Z
End Sub
Sub Led_display(ziffer An Byte , Zahl As Byte)
I2cstart
I2cwbyte Rn_digi_slave_write
I2cwbyte Ziffer
Select Case Zahl
Case 0:
Segmente = &H3F
Case 1:
Segmente = &H06
Case 2:
Segmente = &H5B
Case 3:
Segmente = &H4F
Case 4:
Segmente = &H66
Case 5:
Segmente = &H6D
Case 6:
Segmente = &H7D
Case 7:
Segmente = &H07
Case 8:
Segmente = &H7F
Case 9:
Segmente = &H67
Case Else :
Segmente = &H80 'Ansonsten Dezimalpunkt
End Select
If Dezimalpunktziffer = Ziffer Then Segmente = Segmente Or &H80
I2cwbyte Segmente
I2cstop
End Sub
-
Hi Max,
du mußt die Tastenabfrage eventuell an dein RN-Control anpaßen. Die Tastenabfrage erfolgt über einige Widerstände am analogen Port. Durch gewisse Toleranzen liefern die Tasten bei jedem RN-COntrol geringfügig andere Tastenwerte. Ich hab die Select Case Anweisungen bei dem Demo auf die schnelle etwas zu eng definiert, daher rutscht manchmal eine Taste neben den definierten Bereich.
Am besten mal PC mit Terminaprogramm anschließen und mit Print in der Tastenabfrage den Wert WS ausgeben lassen. Bei jeder Taste kommt ein anderer Wert raus.
Du mußt die Select Case Anweisung so anpassen, das der WS-Wert bei jeder Taste in etwa in der Mitte der einzelnen Case-Anweisung liegt
Das muß nur einmal gemacht werden, dann kannst du immer wieder diese Werte nehmen.
In der Regel paßt jedoch folgende Tastenfunktion bei fast allen RN-Control´s:
Code:
'Diese Unterfunktion fragt die Tastatur am analogen Port ab
Function Tastenabfrage() As Byte
Local Ws As Word
Tastenabfrage = 0
Ton = 600
Start Adc
Ws = Getadc(7)
Print "Tastenabfrage anpassen!ADC Wert ws=" ; Ws
If Ws < 500 Then
Select Case Ws
Case 400 To 450
Tastenabfrage = 1
Ton = 550
Case 330 To 380
Tastenabfrage = 2
Ton = 500
Case 260 To 305
Tastenabfrage = 3
Ton = 450
Case 180 To 220
Tastenabfrage = 4
Ton = 400
Case 90 To 130
Tastenabfrage = 5
Ton = 350
End Select
Sound Portd.7 , 400 , Ton 'BEEP
End If
End Function
Eventuell also diese Funktion einfach gegen deine austauschen!
Oben siehst du auch den Print Befehl, der den WS Wert auf einem Terminalprogramm ausgeben kann. Der Sound Befehl ist ja ganz nützlich, aber für weitere experimente solltest du auch Terminalprogramm und RS232 Verbindung nutzen. In Bascom ist Terminalprogramm eingebaut.
Das hat aber eigentlich nichts mit RN-Digi zu tun
Und noch gleich ein Hinweis, du solltest unter Optionen/COmpiler/Chip bei Bascom bei HW Stack, SW Stack und Framesize höhere Werte einsetzen. Wenn du überall 32 einsetzt, dann bist du zumindest bei diesem und ähnlichen Programmen auf der sicheren Seite. Ansonsten kann der Stack bei der Verwendung von Unterfunktionen schnell mal überlaufen.
-
Hallo Frank,
es funktioniert. :)
Das Ws so ne Art Toleranz ist dachte ich mir fast. Ich wußte nur nicht was es genau ist.
Nur hab ich nun mit der Demo von Bascom das Problem das die rummeckert das ich über 2k nicht Compilieren darf... naja ich hab dann alle Print Anweisungen rausgemacht (auch die neue ;) ) dann geht es.
Danke nochmal für die schnelle Hilfe =D>
-
Hallo Frank
Ich habe die RN-Digi zusammengebaut, mit meiner RN-Control über I2C verbunden, das Demo-Programm für die RN-Digi auf meine RN-Control geladen und Saft angelegt.
LED1, alles OK
LED3, funktioniert segment "c" nicht
LED2&4 tut sich garnichts!
RESET-Taster auf RN-Control und erkennen können, das LED1&3 "0" anzeigen.
Taste 2 gedrückt, LED1 zählt perfekt durch, LED2 wird vermutlich vom Programm angesteuert, da LED3 dann ordnungsgemäß durchzählt, wobei "c" tot bleibt, dann vergeht die zeit damit LED4 auch durchzählt und es kommt ein "peep"
Daraus schliesse ich das die RN-Control und RN-DIGI ordnungsgemäß kommunizieren, dh RN-Control sendet die I2C-Befehle, der Philps Baustein gibt der RN-Control keinen Anlaß einen fehler zu melden.
Nach Studium der Unterlagen habe ich einen Lötfehler in der Verbindung zwischen LED3 und dem Philips-Steuerbaustein für möglich gehalten, Ansprache "Segment "c", leider Fehlanzeige.
Betreff LED2&4 hätten es die Steuersignale an PIN 3&8 der LED`s sein können, sprich das multiplexen klappt nicht. Auch hier Lötstellen überprüft, leider vergeblich. Auch die Lötstellen am T2 OK.
War heute bei Conrad und habe mir 2 neue LED's besorgt, sowie 2 Transistoren um Material zum debuggen zu haben. Philips Baustein war dort nicht zu bekommen. Bekomme ich den bei dir?
Welches weitere Vorgehen empfiehlst du?
-
Kommunikation scheint bei Dir richtig zu funktionieren. Und wenn du nix am Programm verändert hast, dann kanns eigentlich nur noch an irgend einen Lötfehler/Bestückungsfehler liegen.
Prüfe mal ob alles bei den Transistoren richtig stimmt (richtigrum?). Und schau auch mal das du C3 nicht verwechselst.
Dann hast du ein Lötfehler genannt. Du solltest mal prüfen ob das nicht doch die Ursache sein könnte, eine ungünstige Brücke könnte duchaus auch den Philips SAA Chip himmeln.
Ein defektes LED halt ich für unwahrscheinlich, zum einen sind die recht teuer und werden garantiert bei Produktion geprüft und so ganz schnell bekommt man die großen Segmente auch nicht kaputt. Wenn du IC aus Fassung nimmst, kannst du natürlich auch alles mit Ohmmeter ein wenig durchmessen
Ich würde alles nochmal genau prüfen und wenn alles stimmt mal den SAA Chip austauschen. Kannst du auch bei Reichelt bekommen, falls du da zufällig gerade was brauchst, ansonsten bei mir.
-
So Überraschung ich hab ein Problem. Und zwar ich hab den ATMega128Funk darum habe ich versucht das Programm von Frank entsprechend zu modifizieren.
'################################################# ##
'rncontrol_digitest.BAS Demo zu RN-Digi
'für
'RoboterNetz Board RN-CONTROL ab Version 1.1 und
'Zusatzboard RN-DIGI (vierstellig großes LED-Display per I2C)
'
'Aufgabe:
' Dieses Testprogramm demonstriert die Ansteuerung von RN-Digi
' Den verschiedenen Tasten sind bestimmte Funktionen zugeordnet
' Taste 1: Alle Ziffern auf 0 stellen (genau wie bei Reset)
' Taste 2: Nacheinander alle Ziffern von 0 bis 9 zählen
'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 Led_display_init()
Declare Sub Led_display(byval Ziffer As Byte , Byval Zahl As Byte)
$regfile = "m128def.dat"
Const Rn_digi_slave_write = &H70
Const Rn_digi_slave_read = &H71
Const Dezimalpunktziffer = 2 'Segment wo Dezimalpunkt leuchten soll (0=keinen)
Dim Segmente As Byte
Dim Z As Byte
Dim Zahl As Byte
$crystal = 16000000 'Quarzfrequenz
$baud = 9600
Config Scl = Portd.7
Config Sda = Portd.0 'Ports fuer IIC-Bus
I2cinit
Led_display_init
Sub Led_display_init()
I2cstart
I2cwbyte Rn_digi_slave_write
I2cwbyte 0 'Control Byte
'Dynamic Alternative Mode und Helligkeit
'Die oberen 3 Bits bestimmen die Helligkeit
'Wenn es dunkler sein soll dann z.b. &B0110111
I2cwbyte &B1110111
I2cstop
'Alle Ziffern auf 0
For Z = 1 To 9
Led_display Zahl , Z
Next Z
End Sub
Sub Led_display(ziffer An Byte , Zahl As Byte)
I2cstart
I2cwbyte Rn_digi_slave_write
I2cwbyte Ziffer
Select Case Zahl
Case 0:
Segmente = &H3F
Case 1:
Segmente = &H06
Case 2:
Segmente = &H5B
Case 3:
Segmente = &H4F
Case 4:
Segmente = &H66
Case 5:
Segmente = &H6D
Case 6:
Segmente = &H7D
Case 7:
Segmente = &H07
Case 8:
Segmente = &H7F
Case 9:
Segmente = &H67
Case Else :
Segmente = &H80 'Ansonsten Dezimalpunkt
End Select
If Dezimalpunktziffer = Ziffer Then Segmente = Segmente Or &H80
I2cwbyte Segmente
I2cstop
End Sub
Bin mir aber recht sicher zumindest bei der For-Schleife Mist gebaut zu haben. Den es gibt zwar keine Fehlermeldungen aus. Tut aber bei der Rn-Digi 7-Segmentanzeige auch nichts.
Hat jemand Vorschläge?
Wäre aber schon dankbar wenn jemand mein Programm durchlesen und mich auf Fehler und Verbesserungen aufmerksam machen kann.
Danke Simon