PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler in Software oder Programmer defekt?



tiller
25.09.2008, 16:14
Hallo,

hier erstmal mein Programm (auf das Nötigste gekürzt)



$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

' ================================================== ===========================
' Variablendeklaration
' ================================================== ===========================
Dim I As Integer 'Zählvariable

Dim Servodevice As Byte 'Servoansteuerung
Dim Servocommand As Byte
Dim Servonummer As Byte
Dim Servodata As Byte

Dim Greifer As Integer 'Greiferposition
Dim Greifergelenk As Integer
Dim Mittelgelenk As Integer
Dim Hauptgelenk1 As Integer
Dim Hauptgelenk2 As Integer


' ================================================== ===========================
' Konfiguration
' ================================================== ===========================
Config Portb = Input 'Input1 für Taster
Config Portc = Output 'Output für LEDs
Config Portd = Input 'Input2 für Taster
Config Portd.7 = Output 'Output für Sounds
Config Scl = Portc.0 'Ports fuer I2C-Bus
Config Sda = Portc.1

Config Pina.0 = Output 'Kommunikation
Stepper_enable Alias Porta.0 'mit MOTCTRL
Config Pina.1 = Output
Stepper_richtung Alias Porta.1
Config Pina.2 = Output
Stepper_takt Alias Porta.2


' ================================================== ===========================
' Statusmeldung "OK"
' ================================================== ===========================
Sound Portd.7 , 400 , 200
Waitms 100
Sound Portd.7 , 400 , 300
Waitms 100
Sound Portd.7 , 400 , 400
Waitms 100
Sound Portd.7 , 400 , 500
Waitms 100
Sound Portd.7 , 400 , 600
Waitms 100
Sound Portd.7 , 400 , 700
Waitms 100
Sound Portd.7 , 400 , 800
Waitms 100
Sound Portd.7 , 900 , 900
Waitms 100


' ================================================== ===========================
' Initialisierung
' ================================================== ===========================
Portc.0 = 0 'Alle LEDs an
Portc.1 = 0
Portc.2 = 0
Portc.3 = 0
Portc.4 = 0
Portc.5 = 0
Portc.6 = 0
Portc.7 = 0

Portb.0 = 1 'Pullup-Widerstände
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
Portb.5 = 1
Portb.6 = 1
Portb.7 = 1

Portd.0 = 1
Portd.2 = 1
Portd.4 = 1
Portd.6 = 1

Stepper_enable = 0 'Motor aus


' ================================================== ===========================
' Eigentliches Programm als Endlosschleife
' ================================================== ===========================
Do
' ================================================== ===========================
' Taster 1 nach links schwenken
' ================================================== ===========================
If Pinb.0 = 1 Then
Portc.0 = 0
Else
Portc.0 = 1
End If
' ================================================== ===========================
' Taster 2 nach rechts schwenken
' ================================================== ===========================
If Pinb.2 = 1 Then
Portc.1 = 0
Else
Portc.1 = 1
End If
' ================================================== ===========================
' Taster 3 Element 1 heben
' ================================================== ===========================
If Pinb.4 = 1 Then
Portc.2 = 0
Else
Portc.2 = 1
End If
' ================================================== ===========================
' Taster 4 Element 1 senken
' ================================================== ===========================
If Pinb.6 = 1 Then
Portc.3 = 0
Else
Portc.3 = 1
End If
' ================================================== ===========================
' Taster 5 Greifer öffnen
' ================================================== ===========================
If Pinb.1 = 1 Then
Portc.4 = 0
Else
Portc.4 = 1
End If
' ================================================== ===========================
' Taster 6 Greifer schließen
' ================================================== ===========================
If Pinb.3 = 1 Then
Portc.5 = 0
Else
Portc.5 = 1
End If
' ================================================== ===========================
' Taster 7 Element 2 heben
' ================================================== ===========================
If Pinb.5 = 1 Then
Portc.6 = 0
Else
Portc.6 = 1
End If
' ================================================== ===========================
' Taster 8 Element 2 senken
' ================================================== ===========================
If Pinb.7 = 1 Then
Portc.7 = 0
Else
Portc.7 = 1
End If
' ================================================== ===========================
' Taster 9 Greifer heben
' ================================================== ===========================
If Pind.0 = 1 Then
'Portc.0 = 0
Else
Sound Portd.7 , 400 , 200
End If
' ================================================== ===========================
' Taster 10 Greifer senken
' ================================================== ===========================
If Pind.2 = 1 Then
'Portc.0 = 0
Else
Sound Portd.7 , 400 , 200
End If
' ================================================== ===========================
' Taster 11 UNBELEGT
' ================================================== ===========================
If Pind.4 = 1 Then
'Portc.0 = 0
Else
Sound Portd.7 , 400 , 200
End If
' ================================================== ===========================
' Taster 12 UNBELEGT
' ================================================== ===========================
If Pind.6 = 1 Then
'Portc.0 = 0
Else
Sound Portd.7 , 400 , 200
End If
Loop


End


Ich benutze den USB-Programmer von Robotik-Hardware, habe diesen aber - wie ich an dieser Stelle leider zugeben muss - aus Versehen kurz an die I2C-Schnittstelle des RN-Boards angeschlossen und versucht, Daten zu übertragen, deswegen der Verdacht des Defekts.

Lasse ich dieses Programm nun auf dem Board laufen, "denkt" dieses, Taste 3 wäre durchgehend gedrückt, auch wenn meine Selbstbau-Tastatur garnicht angeschlossen ist. Vorher funktionierte alles, aber vllt habe ich ja doch einen Fehler in der Software.
Seltsam ist auch, dass der Fehler nur bei angeschlossenem Programmer auftaucht, andere (hier nicht gepostete) Teile des Programms funktionieren aber auch dann nicht mehr wie noch vor 2 Tagen.

Was denkt ihr, habe ich den Programmer geschrottet oder liegt's an was anderem?

Thx für eure Hilfe!

PicNick
25.09.2008, 19:24
Diese Verwechslung kann einiges zerstören. Sowohl den Programmer als auch den µC.
In deinem Falle ist möglicherweise nur der Teil beschädigt, der mit der Taste 3 beschäftig ist. Vielleicht also nur ein PIN.

tiller
26.09.2008, 12:29
Einen Defekt des µC kann ich mittlerweile ausschließen. Eine Übertragung der Software auf ein anderes Board bringt den gleichen Fehler mit sich. Es kann also sehr wohl sein, dass der Programmer defekt ist? Kann man das irgendwie nachprüfen?
Hast du mal einen Blick auf den Quelltext geworfen? Da sollte alles in Ordnung sein, oder?

PicNick
26.09.2008, 12:49
Versuch mit einem Testprogramm, ob du den Pin f. Taste 3 auf 0 und 1 setzen kannst.


Config Pinb.4=output
DO
portb.4 = 0
Waitms 1000
portb.4 = 1
Waitms 1000
LOOP


Einziges special mit dem Pin ist der SPI. Wenn der aktiviert wäre, schnappt er sich ggf. den PIN


BTW:
Hat nix damit zu tun, aber hier:
Config Portd.7 = Output
sollte sein:
Config Pind.7 = Output

(ganzes Port -> "Config PortX=" einzelne Pin ->"Config PinX.Y=" )

tiller
26.09.2008, 14:59
Ja, ich kann ihn zwischen 0 und 1 hin und her schalten, funktioniert einwandfrei.
Kann es etwas mit dem, was du da erwähnt hast, zu tun haben? Wenn ich also einen ganzen Port ändern möchte, brauche ich port und ansonsten pin, richtig? Aber wieso schreibst du dann in deinem Quelltext:


portb.4 = 0

?

PicNick
26.09.2008, 15:26
Bascom ist da ein wenig schizoid.

Beim Config gilt:
(ganzes Port -> "Config PortX=" einzelne Pin ->"Config PinX.Y=" )

Bei den Befehlen gilt immer
PINB od PINB.x wenn's um den Input geht,
PORTB od. PORTB.x wenn's um den Output geht.

Du solltest einmal (bei deinem Programm) den Input Pinb.4 messen und schauen, wer sich nun irrt:
Liest der µC ein "1", obwohl der Pin auf 0 Volt steht, bzw.
liest der µC ein "0", obwohl der Pin auf ~5 Volt steht

Jaecko
26.09.2008, 15:39
Tip von mir: Ich hab die ISP-Buchsen sowie den Stecker vom Programmer rot/weiss angepinselt; die I2C-Buchsen bleiben schwarz;
Hab mir mit so ner Verwechslung auch mal nen Programmer zerschossen...

tiller
26.09.2008, 16:51
@ Jaecko:
Gute Idee, werde deinen Rat befolgen :-)

@ PicNick:
Ah, so ist das, in der Tat seltsam.

Der Quelltext sieht nun so aus:


$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

' ================================================== ===========================
' Variablendeklaration
' ================================================== ===========================
Dim I As Integer 'Zählvariable

Dim Servodevice As Byte 'Servoansteuerung
Dim Servocommand As Byte
Dim Servonummer As Byte
Dim Servodata As Byte

Dim Greifer As Integer 'Greiferposition
Dim Greifergelenk As Integer
Dim Mittelgelenk As Integer
Dim Hauptgelenk1 As Integer
Dim Hauptgelenk2 As Integer


' ================================================== ===========================
' Konfiguration
' ================================================== ===========================
Config Portb = Input 'Input1 für Taster
Config Portc = Output 'Output für LEDs
Config Portd = Input 'Input2 für Taster
Config Pind.7 = Output 'Output für Sounds
'Config Scl = Portc.0 'Ports fuer I2C-Bus
'Config Sda = Portc.1

Config Pina.0 = Output 'Kommunikation
Stepper_enable Alias Pina.0 'mit MOTCTRL
Config Pina.1 = Output
Stepper_richtung Alias Pina.1
Config Pina.2 = Output
Stepper_takt Alias Pina.2


' ================================================== ===========================
' Statusmeldung "OK"
' ================================================== ===========================
Sound Portd.7 , 400 , 200
Waitms 100
Sound Portd.7 , 400 , 300
Waitms 100
Sound Portd.7 , 400 , 400
Waitms 100
Sound Portd.7 , 400 , 500
Waitms 100
Sound Portd.7 , 400 , 600
Waitms 100
Sound Portd.7 , 400 , 700
Waitms 100
Sound Portd.7 , 400 , 800
Waitms 100
Sound Portd.7 , 400 , 900
Waitms 100


' ================================================== ===========================
' Initialisierung
' ================================================== ===========================
Portc.0 = 0 'Alle LEDs an
Portc.1 = 0
Portc.2 = 0
Portc.3 = 0
Portc.4 = 0
Portc.5 = 0
Portc.6 = 0
Portc.7 = 0

Portb.0 = 1 'Pullup-Widerstände
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
Portb.5 = 1
Portb.6 = 1
Portb.7 = 1

Portd.0 = 1
Portd.2 = 1
Portd.4 = 1
Portd.6 = 1

Stepper_enable = 0 'Motor aus


' ================================================== ===========================
' Eigentliches Programm als Endlosschleife
' ================================================== ===========================
Do
' ================================================== ===========================
' Taster 1 nach links schwenken
' ================================================== ===========================
If Pinb.0 = 1 Then
Portc.0 = 0
Else
Portc.0 = 1
End If
' ================================================== ===========================
' Taster 2 nach rechts schwenken
' ================================================== ===========================
If Pinb.2 = 1 Then
Portc.1 = 0
Else
Portc.1 = 1
End If
' ================================================== ===========================
' Taster 3 Element 1 heben
' ================================================== ===========================
If Pinb.4 = 1 Then
Portc.2 = 0
Else
Portc.2 = 1
End If
' ================================================== ===========================
' Taster 4 Element 1 senken
' ================================================== ===========================
If Pinb.6 = 1 Then
Portc.3 = 0
Else
Portc.3 = 1
End If
' ================================================== ===========================
' Taster 5 Greifer öffnen
' ================================================== ===========================
If Pinb.1 = 1 Then
Portc.4 = 0
Else
Portc.4 = 1
End If
' ================================================== ===========================
' Taster 6 Greifer schließen
' ================================================== ===========================
If Pinb.3 = 1 Then
Portc.5 = 0
Else
Portc.5 = 1
End If
' ================================================== ===========================
' Taster 7 Element 2 heben
' ================================================== ===========================
If Pinb.5 = 1 Then
Portc.6 = 0
Else
Portc.6 = 1
End If
' ================================================== ===========================
' Taster 8 Element 2 senken
' ================================================== ===========================
If Pinb.7 = 1 Then
Portc.7 = 0
Else
Portc.7 = 1
End If
' ================================================== ===========================
' Taster 9 Greifer heben
' ================================================== ===========================
If Pind.0 = 1 Then
'Portc.0 = 0
Else
Sound Portd.7 , 400 , 200
End If
' ================================================== ===========================
' Taster 10 Greifer senken
' ================================================== ===========================
If Pind.2 = 1 Then
'Portc.0 = 0
Else
Sound Portd.7 , 400 , 200
End If
' ================================================== ===========================
' Taster 11 UNBELEGT
' ================================================== ===========================
If Pind.4 = 1 Then
'Portc.0 = 0
Else
Sound Portd.7 , 400 , 200
End If
' ================================================== ===========================
' Taster 12 UNBELEGT
' ================================================== ===========================
If Pind.6 = 1 Then
'Portc.0 = 0
Else
Sound Portd.7 , 400 , 200
End If
Loop


End

Bei den Bedingungen bin ich mir nicht ganz sicher. Muss es da


If PinX.Y...

heißen oder doch


If PortX.Y ...

?
Das mit dem Messen werde ich morgen nachholen, muss jetzt zur Arbeit.

PicNick
26.09.2008, 16:54
Genauso isses ok


If Pinb.4 = 1 Then
Portc.2 = 0
Else
Portc.2 = 1
End If

tiller
27.09.2008, 15:57
Gut, dann wäre das geklärt.
Habe deinen Rat befolgt und das Ganze mal durchgemessen. Bei diesem Programm (wie es auch oben steht)


$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

' ================================================== ===========================
' Variablendeklaration
' ================================================== ===========================
Dim I As Integer 'Zählvariable

Dim Servodevice As Byte 'Servoansteuerung
Dim Servocommand As Byte
Dim Servonummer As Byte
Dim Servodata As Byte

Dim Greifer As Integer 'Greiferposition
Dim Greifergelenk As Integer
Dim Mittelgelenk As Integer
Dim Hauptgelenk1 As Integer
Dim Hauptgelenk2 As Integer


' ================================================== ===========================
' Konfiguration
' ================================================== ===========================
Config Portb = Input 'Input1 für Taster
Config Portc = Output 'Output für LEDs
Config Portd = Input 'Input2 für Taster
Config Pind.7 = Output 'Output für Sounds
'Config Scl = Portc.0 'Ports fuer I2C-Bus
'Config Sda = Portc.1

Config Pina.0 = Output 'Kommunikation
Stepper_enable Alias Pina.0 'mit MOTCTRL
Config Pina.1 = Output
Stepper_richtung Alias Pina.1
Config Pina.2 = Output
Stepper_takt Alias Pina.2


' ================================================== ===========================
' Statusmeldung "OK"
' ================================================== ===========================
Sound Portd.7 , 400 , 200
Waitms 100
Sound Portd.7 , 400 , 300
Waitms 100
Sound Portd.7 , 400 , 400
Waitms 100
Sound Portd.7 , 400 , 500
Waitms 100
Sound Portd.7 , 400 , 600
Waitms 100
Sound Portd.7 , 400 , 700
Waitms 100
Sound Portd.7 , 400 , 800
Waitms 100
Sound Portd.7 , 600 , 900
Waitms 100


' ================================================== ===========================
' Initialisierung
' ================================================== ===========================
Portc.0 = 0 'Alle LEDs an
Portc.1 = 0
Portc.2 = 0
Portc.3 = 0
Portc.4 = 0
Portc.5 = 0
Portc.6 = 0
Portc.7 = 0

Portb.0 = 1 'Pullup-Widerstände
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
Portb.5 = 1
Portb.6 = 1
Portb.7 = 1

Portd.0 = 1
Portd.2 = 1
Portd.4 = 1
Portd.6 = 1

Stepper_enable = 0 'Motor aus


' ================================================== ===========================
' Eigentliches Programm als Endlosschleife
' ================================================== ===========================
Do
' ================================================== ===========================
' Taster 1 nach links schwenken
' ================================================== ===========================
If Pinb.0 = 1 Then
Portc.0 = 0
Else
Portc.0 = 1
End If
' ================================================== ===========================
' Taster 2 nach rechts schwenken
' ================================================== ===========================
If Pinb.2 = 1 Then
Portc.1 = 0
Else
Portc.1 = 1
End If
' ================================================== ===========================
' Taster 3 Element 1 heben
' ================================================== ===========================
If Pinb.4 = 1 Then
Portc.2 = 0
Else
Portc.2 = 1
End If
' ================================================== ===========================
' Taster 4 Element 1 senken
' ================================================== ===========================
If Pinb.6 = 1 Then
Portc.3 = 0
Else
Portc.3 = 1
End If
' ================================================== ===========================
' Taster 5 Greifer öffnen
' ================================================== ===========================
If Pinb.1 = 1 Then
Portc.4 = 0
Else
Portc.4 = 1
End If
' ================================================== ===========================
' Taster 6 Greifer schließen
' ================================================== ===========================
If Pinb.3 = 1 Then
Portc.5 = 0
Else
Portc.5 = 1
End If
' ================================================== ===========================
' Taster 7 Element 2 heben
' ================================================== ===========================
If Pinb.5 = 1 Then
Portc.6 = 0
Else
Portc.6 = 1
End If
' ================================================== ===========================
' Taster 8 Element 2 senken
' ================================================== ===========================
If Pinb.7 = 1 Then
Portc.7 = 0
Else
Portc.7 = 1
End If
' ================================================== ===========================
' Taster 9 Greifer heben
' ================================================== ===========================
If Pind.0 = 1 Then
'Portc.0 = 0
Else
Sound Portd.7 , 400 , 200
End If
' ================================================== ===========================
' Taster 10 Greifer senken
' ================================================== ===========================
If Pind.2 = 1 Then
'Portc.0 = 0
Else
Sound Portd.7 , 400 , 200
End If
' ================================================== ===========================
' Taster 11 UNBELEGT
' ================================================== ===========================
If Pind.4 = 1 Then
'Portc.0 = 0
Else
Sound Portd.7 , 400 , 200
End If
' ================================================== ===========================
' Taster 12 UNBELEGT
' ================================================== ===========================
If Pind.6 = 1 Then
'Portc.0 = 0
Else
Sound Portd.7 , 400 , 200
End If
Loop


End

bleibt


PinB.6

also das Sorgenkind, als einziger Pin Low. Es wird also korrekt eingelesen und die LED ausgeschaltet.
Übertrage ich diese Software auf das Board


$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

Config Portb = Output
Do
Portb.6 = 0
Portb.4 = 0
Waitms 5000
Portb.6 = 1
Portb.4 = 1
Waitms 5000
Loop

lässt sich zwar auch Pin 6 toggeln, er springt aber nur auf 2,74V statt, wie Pin 4 und auch alle anderen, auf 5V.

Kannst du dir einen Reim darauf machen?

tiller
27.09.2008, 16:05
Das Beste kommt erst noch. Entferne ich den Programmer vom ISP-Port, funktioniert alles "einwandfrei". Auch Pin 6 wird sofort nach dem Start der Software auf High geschaltet (diesmal 5V), die LED ist an und beim Betätigen des zugehörigen Tasters geht sie aus.
Ich werde nun mal die komplette Software übertragen und schauen, ob auch alles andere nach Abstöpseln des Programmers funktioniert.

Ist der Programmer nun defekt oder wie lässt sich das erklären?

PicNick
27.09.2008, 16:37
Scheint mit irgendein HW-mässiger Querschläger zu sein.
Ich hab die RN-Control nicht so im Kopf. Ev. ist da irgendeine Beschaltung von wegen Analog-Spannungsmessung. Zusammenhang mit dem Programmer seh ich dann aber auch nicht, *grübel*
however, ich versuch mir mal den Schaltplan einzuziehen, wenn ich ihn find'.


EDIT: öööhm: von welchem Board reden wir denn genau ?
EDIT 2: Blödsinn, mit analog is da nix. das wäre nur bei PortA

tiller
28.09.2008, 11:18
Die Vermutung kam halt nur auf, da vor der Verwechslung der Ports immer alles funktioniert hat, auch mit angeschlossenem Programmer.
Es ist übrigens wirklich so, dass, nachdem ich die Software übertragen und den Programmer dann vom Board genommen habe, alles so funktioniert, wie es soll. Das Problem wäre also dann erstmal gelöst, allerdings ist das ewige Gestöpsele ziemlich nervig.

PS: Es handelt sich um RN-Control 1.4

Besserwessi
28.09.2008, 11:51
Ich kenne den Programmer nicht, aber einige bessere Programmer könnten nach dem Programmieren die Ports hochohmig schalten. Dann sollte es weng Unterschied machen ob der Probrammer noch dranhäng. Es könnte sein das der Programmer noch im wesentlichen funktioniert, aber nur die Pins nicht mehr hochohmig kriegt. Das kann auch an einer geänderten Software liegen.

Ein teilweiser Defekt am Controllerboard wäre da eher unwarscheinlich. Wenn schon, dann wohl ein Problem mit der Spannungsversorgung.

tiller
29.09.2008, 08:57
Einen Defekt des Boards schließe ich ebenfalls aus, da ich wie gesagt auch mit einem Zweiten getestet habe und gleiche Ergebnisse bekam.
Die Vermutung, dass die Widerstände nicht ausreichen, klingt logisch. Kannst du denn einen anderen/besseren Programmer empfehlen als den von Robotik-Hardware?
http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=73&products_id=161