PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] RN-Control macht komische Piepstöne. - Kaputt??



robonooby
09.10.2011, 17:45
Hilfe!!
Ich habe eben endlich mein Programm für meinen Roboter soweit fertig gestellt. Und wollte jetzt noch über den INT0 Port nen Interrupt laufen lassen um bei Kollesion ihn anzuhalten. Aber seit dem funktioniert mein RN Board nicht mehr :(

Seit dem kommen immer zwei lange piepstöne (unterschiedlich hoch) und dann ist Ruhe. Also wenn ich reset drücke kommen diese Töne.
Jetzt hab ich spasseshalber mal das Testprogramm von der CD draufgespielt und da kommt dann ebenfalls nur diese Töne. Sonst reagiert er gar nicht mehr :(

Hab ich ihn jetzt geschrottet? Wenn ja wieso?^^
Kann mir da jemand helfen?

Kampi
09.10.2011, 20:46
Poste doch mal den Code den du verwendest. Das piepen kann ja nur von dem Pieper auf dem Board kommen. Diesen steuert man leicht an wenn man PortD verwendet :D
Ist mir auch schon ein paar mal passiert ;)

robonooby
10.10.2011, 10:30
den Code kann ich erst heut abend Posten wenn ich wieder zu hause bin.
Aber ich fand es halt komisch, dass das ebenfalls bei dem RN-Control Einführungs und Testcode von dem Handbuch bzw von der CD piepst. Die hatten ja funktioniert. Und nun geht gar nichts mehr

robonooby
10.10.2011, 17:00
hier jetzt der Code:


'**** Über RS232 Schnittstelle Dateien an RN-Control senden :*******************
'Funktion:
'

'************************************************* ******************************

'Microcontroller Einstellungen Definieren.
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

'Funktionen Declarieren
Declare Function Tastaturabfrage() As Byte 'Funktion für die Tastenabfrage am Board deklarieren
Declare Sub Batteriespannung()
Declare Sub Irentfernung1()
Declare Sub Motorschalten()
Declare Sub Motorschalten1()
Declare Sub Fuluftdruck()
Declare Sub Serial0charmatch()
Declare Sub Temperatur()

'************************************************* ******************************
'Variablen deklarieren:
Dim Ton As Integer
Dim Motordrehzahl As Integer
Dim Spannung As Word
Dim Taste As Byte
'Const Ref = 5 / 1023 'Umrechnungsfaktor von 8Bit Zahlenwert = 1023 bei 5 Volt Spannung in Gleitkommazahlenwert
Dim Luftdruck As Word
'Dim Hoehe As Integer

'Variablen für das Einlesen der Empfangenen Daten
Dim Inputstring As String * 30
Dim Inputarray(7) As String * 5
Dim Status As Bit
Dim Tmp As Byte
Dim Data_available As Byte
Dim Dempfangen As Byte
Dim Dempfangstring As String * 5
Dim Empfangstatus As Boolean
Dim Motorr As Integer
Dim Motorl As Integer
Dim Schildv As Integer
Dim Schildh As Integer
Dim Kamera As Integer

'Variablen zum für Daten die versendet werden sollen
Dim Fehlermeldung As String * 30
Dim Irabstand1 As Integer
Dim Irabstand2 As Integer
Dim Uabstand1 As Integer
Dim Uabstand2 As Integer
Dim Batteriestatus As Word
Dim Temperatura As Integer
Dim Temperaturi As Integer

'************************************************* ******************************
'Ports definieren (Als was welcher Port sein soll)

Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung benötigt
Config Pina.7 = Input 'Für Tastenabfrage wird PortA7 als eingang definiert
Porta.7 = 1 'Pullup Widerstand am PortA7 ein
Config Portd.2 = Output 'Für Enfernungsmessung Ultraschall diesen Port als eingang definieren
Config Pina.2 = Input 'Für Luftdruckmessung diesen Port als eingang definieren
Config Pina.1 = Input 'Port für Temperaturinnen:

'Buffer Einstellen
Config Serialin = Buffered , Size = 40 , Bytematch = 13 'Empfang-Buffer erstellen und wenn Zeichen 13 (Enter) gesendet wurde in Prozedur Serial0charmatch springen
'Enable Interrupts

'Ports für linken Motor
Config Pinc.6 = Output 'Linker Motor Kanal 1
Config Pinc.7 = Output 'Linker Motor Kanal 2
Config Pind.4 = Output 'Linker Motor PWM
'Ports für rechten Motor
Config Pinb.0 = Output 'Rechter Motor Kanal 1
Config Pinb.1 = Output 'Rechter Motor Kanal 2
Config Pind.5 = Output 'Rechter Motor PWM


'************************************************* ******************************
'Interrupt
Config Int0 = Rising 'Configuriere Int0 auf Low Level
On Int0 Isr_von_int0 'springe Zu Isr_von _int0
Enable Interrupts 'einschalten der Interrupts
Enable Int0 'einschalten Von Interrupt Int0



Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Tccr1b = Tccr1b Or &H02 'Prescale = 8 (Quarzfrequenz duch 8)
Pwm1a = 0 'Linker Motor (Drehzahl)
Pwm1b = 0 'Linker Motor (Drehzahl)


'************************************************* ******************************
'Hauptprogramm

'Hochfahren der RN-Control Signal
Sound Portd.7 , 400 , 450 'BEEP (Pin, Länge in ms des Pipsesn, Anzahl Pulse
Sound Portd.7 , 600 , 150 'BEEP
Sound Portd.7 , 400 , 500 'BEEP

Motorr = 0
Motorl = 0
Empfangstatus = 1
Schildv = 0
Schildh = 0
Kamera = 0

Do
Taste = Tastaturabfrage()
If Taste <> 0 Then
Select Case Taste
Case 1
Empfangstatus = 0
Case 2
Empfangstatus = 1
Case 3

Case 4

Case 5
Print "Programm wurde abgebrochen"
Sound Portd.7 , 800 , 400
Exit Do
End Select
End If

Temperatur 'Funktion Temperatur aufrufen
Fehlermeldung = "Dies ist Ein Test"
Irabstand1 = Schildv '20
Irabstand2 = Schildh '10
Uabstand1 = Motorr '500
Uabstand2 = Motorl '100
Batteriespannung
Batteriestatus = Spannung
Temperatura = Kamera
Fuluftdruck 'Funktion Luftdruck auslesen starten


If Empfangstatus = 1 Then
Print 1 ; ";" ; Fehlermeldung ; ";" ; Irabstand1 ; ";" ; Irabstand2 ; ";" ; Uabstand1 ; ";" ; Uabstand2 ; ";" ; Batteriestatus ; ";" ; Temperatura ; ";" ; Temperaturi ; ";" ; Luftdruck ; ";" ; 23 ; ";"
Empfangstatus = 1
End If


Motorschalten1 'Funktion Motor ausführen

'Motorr = 0
'Motorl = 0

'Wenn Kamera gedreht werden soll dann Sound ausgeben
If Kamera = 1 Then
Sound Portd.7 , 10 , 800
Waitms 20
Kamera = 0
End If

If Kamera = -1 Then
Sound Portd.7 , 10 , 400
Waitms 20
Kamera = 0
End If


Wait 1
Loop
End


'************************************************* ******************************

'Funktionen Deklarieren (Unterprogramme)
'************************************************* ******************************
'Diese Funktion fragt die Tastatur am analogen Port ab
Function Tastaturabfrage() As Byte
Local Ws As Word

Tastaturabfrage = 0 'Variablen werte zuweisen
Ton = 600 'Pipstonhöhe festlegen
Start Adc
Ws = Getadc(7)
If Ws < 500 Then
Select Case Ws
Case 400 To 450 'Da nur ein port für die Taster verwendet wird
Tastaturabfrage = 1 'müssen verschiedene Spannungen abgefragt werden
Ton = 550
Case 330 To 380
Tastaturabfrage = 2
Ton = 500
Case 260 To 305
Tastaturabfrage = 3
Ton = 450
Case 180 To 220
Tastaturabfrage = 4
Ton = 400
Case 90 To 130
Tastaturabfrage = 5
Ton = 350
Case Else
Print "Tastenabfrage anpassen! ADC Wert ws=" ; Ws
End Select
Sound Portd.7 , 400 , Ton 'Sound ausgeben
End If

End Function

Sub Serial0charmatch() 'Wenn Buffer voll ist bzw Zeichen 13 Gesendet wurde dann Diese Funktion ausführen

Input Inputstring Noecho
If Inputstring <> "" Then

'Anweisung Aufteilen
Tmp = Split(inputstring , Inputarray(1) , ";")

'---- X Motorr---
Dempfangen = Instr(inputarray(1) , "X") 'Gibt den Motorwert des Substrings "Motorr" aus oder NULL wenn nicht gefunden
'Motorl_empfangen = Instr(inputarray(2) , "Y") 'Gibt den Motorwert des Substrings "Motorl" aus oder NULL wenn nicht gefunden

If Dempfangen = 1 Then
Dempfangstring = Mid(inputarray(1) , 2) 'Die erste stelle des Strings (Das Motorr) abschneiden
Motorr = Val(dempfangstring) 'String in Integer konvertieren
End If
Dempfangen = 0
Dempfangstring = ""

'---- Y Motorl ----
Dempfangen = Instr(inputarray(2) , "Y") 'Gibt den Motorwert des Substrings "Motorr" aus oder NULL wenn nicht gefunden

If Dempfangen = 1 Then
Dempfangstring = Mid(inputarray(2) , 2) 'Die erste stelle des Strings (Das Motorr) abschneiden
Motorl = Val(dempfangstring) 'String in Integer konvertieren
End If
Dempfangen = 0
Dempfangstring = ""

'--- SH SchildH -----
Dempfangen = Instr(inputarray(3) , "SH") 'Gibt den Motorwert des Substrings "Motorr" aus oder NULL wenn nicht gefunden

If Dempfangen = 1 Then
Dempfangstring = Mid(inputarray(3) , 3) 'Die erste stelle des Strings (Das Motorr) abschneiden
Schildh = Val(dempfangstring) 'String in Integer konvertieren
End If
Dempfangen = 0
Dempfangstring = ""

'--- SV SchildV -----
Dempfangen = Instr(inputarray(4) , "SV") 'Gibt den Motorwert des Substrings "Motorr" aus oder NULL wenn nicht gefunden

If Dempfangen = 1 Then
Dempfangstring = Mid(inputarray(4) , 3) 'Die erste stelle des Strings (Das Motorr) abschneiden
Schildv = Val(dempfangstring) 'String in Integer konvertieren
End If
Dempfangen = 0
Dempfangstring = ""

'--- K Kamera-----
Dempfangen = Instr(inputarray(5) , "K") 'Gibt den Motorwert des Substrings "Motorr" aus oder NULL wenn nicht gefunden

If Dempfangen = 1 Then
Dempfangstring = Mid(inputarray(5) , 2) 'Die erste stelle des Strings (Das Motorr) abschneiden
Kamera = Val(dempfangstring) 'String in Integer konvertieren
End If
Dempfangen = 0
Dempfangstring = ""

End If

End Sub


'Diese Funktion zeigt die Batteriespannung an
Sub Batteriespannung()
Local W As Word
Start Adc
W = Getadc(6)
Spannung = W '* Ref
Spannung = Spannung '* 5.2941
'Print "Die aktuelle Spannung beträgt: " ; Spannung ; "Volt"
End Sub

'Diese Funktion schaltet den Motor an
Sub Motorschalten1()
Dim Richtung1motorr As Bit
Dim Richtung2motorr As Bit
Dim Richtung1motorl As Bit
Dim Richtung2motorl As Bit

Motorr = Motorr * 10
Motorl = Motorl * 10

If Motorr < 0 Then
Richtung1motorr = 0
Richtung2motorr = 1
Motorr = Motorr * -1
Else
Richtung1motorr = 1
Richtung2motorr = 0
End If

If Motorl < 0 Then
Richtung1motorl = 0
Richtung2motorl = 1
Motorl = Motorl * -1
Else
Richtung1motorl = 1
Richtung2motorl = 0
End If

If Motorr > 1000 Then
Motorr = 1000
End If

If Motorl > 1000 Then
Motorl = 1000
End If


'Linker Motor ein
Portc.6 = Richtung1motorl 'Bestimmt Richtung 1 = Spannung +
Portc.7 = Richtung2motorl 'Bestimmt Richtung 0 = Keine Spannung -
Portd.4 = 1 'Linker Motor Ein

'Rechter Motor ein
Portb.0 = Richtung1motorr 'Bestimmt Richtung 1 = Spannung +
Portb.1 = Richtung2motorr 'Bestimmt Richtung 0 = Keine Spannung -
Portd.5 = 1 'Rechter Motor ein

Pwm1a = Motorl 'Linker Motor (Drehzahl)
Pwm1b = Motorr 'Rechter Motor (Drehzahl)

End Sub

'Diese Funktion schaltet den Motor an
Sub Motorschalten()
If Motorr > 1000 Then
Motorr = 1000
End If

'Linker Motor ein
Portc.6 = 1 'Bestimmt Richtung 1 = Spannung +
Portc.7 = 0 'Bestimmt Richtung 0 = Keine Spannung -
Portd.4 = 1 'Linker Motor Ein

'Rechter Motor ein
Portb.0 = 1 'Bestimmt Richtung 1 = Spannung +
Portb.1 = 0 'Bestimmt Richtung 0 = Keine Spannung -
Portd.5 = 1 'Rechter Motor ein

Dim I As Integer
I = 0
Do 'Motor beschleunigen
Pwm1a = I 'Linker Motor (Drehzahl)
Pwm1b = I 'Rechter Motor (Drehzahl)
I = I + 5
Waitms 1
Loop Until I > Motorr 'maximalwert 1024

Pwm1a = Motorl 'Linker Motor (Drehzahl)
Pwm1b = Motorr 'Rechter Motor (Drehzahl)

Do 'Motor abbremsen
Pwm1a = I 'Linker Motor (Drehzahl)
Pwm1b = I 'Rechter Motor (Drehzahl)
I = I - 5
Waitms 40
Loop Until I < 1
Pwm1a = 0 'Linker Motor aus
Pwm1b = 0 'Rechter Motor aus
End Sub

'Diese Funktion zeigt den Luftdruck an
Sub Fuluftdruck()
Local Ws As Word

Start Adc
Ws = Getadc(2)
Luftdruck = Ws
End Sub

'Diese Funktion zeigt die Temperatur an
Sub Temperatur()
Start Adc
Temperaturi = Getadc(1)
End Sub

'Interrupt Int0 Unterprogramm. Dieses wird gestartet wenn Signal an INT0 anliegt
Isr_von_int0: 'ISR von int0
Motorr = 0
Motorl = 0
Motorschalten1
Return

Kampi
10.10.2011, 17:39
Diese 3 Zeilen:

Sound Portd.7 , 400 , 450
Sound Portd.7 , 600 , 150
Sound Portd.7 , 400 , 500 '

sorgen für das Piepen. Da diese 3 Zeilen noch vor der eigentlichen Do-Loop Schleife stehen werden diese Befehle nach jedem Reset einmal ausgeführt d.h. nach jedem Reset solltest du die hören. Wenn du die hörst funktioniert dein Controller noch ;)

robonooby
10.10.2011, 18:31
danke für die Antwort Kampi
aber leider ist das nicht so. Die Töne sind anderst als vorher. und hab eben mal die Zeilen weg gemacht und dann kommt das immer noch. Ich glaub echt dass ich ausversehen irgendwie was falsch an den Int0 Port angeschlossen hab und irgendwas kaputt gemacht hab.

robonooby
11.10.2011, 18:25
also ich habe eben nochmal genauer geguckt. der controler scheint wirklich kaputt zu sein. ich komm nichtmal mehr beim programmieren drauf um FuseBits einzustellen oder so. und ab und an erkennt er den Controler auch nicht richtig. Und joa spinnt alles rum. werd mir jetzt ersatz bestellen. hoffe dass nicht noch mehr kaputt gegangen ist. Kann den noch mehr kaputt gehen?

Kampi
11.10.2011, 19:26
Naja auf dem RN-Control ist nicht soviel drauf, was tragisch wäre wenn es kaputt ist, aber ich denke der Rest sollte überlebt haben. Der Pieper funktioniert ja anscheinend noch :D
Und bevor du den neuen Controller einsetzt versuch erst den Fehler zu finden bevor du noch den 2. kaputt machst.

robonooby
12.10.2011, 07:45
jap ich werde es sehen obs nur der controler war^^
Aber ich denk auch ich weis wieso ich ihn geschrottet hab. Hab das eine Kabel vom Taster an Int0 eingang gelegt und glaube bin mitm anderen außversehen an + gekommen anstatt an GRD
oder macht sowas nichts aus?

Frank
12.10.2011, 13:11
jap ich werde es sehen obs nur der controler war^^
Aber ich denk auch ich weis wieso ich ihn geschrottet hab. Hab das eine Kabel vom Taster an Int0 eingang gelegt und glaube bin mitm anderen außversehen an + gekommen anstatt an GRD
oder macht sowas nichts aus?

Wenn der Port auf Eingang geschaltet war macht es nix aus, aber wenn er auf Ausgang programmiert war dann ist Controller vermutlich hin. Irgendwas scheinst du falsch gemacht zu haben, klingt schon so als wenn du neuen Mega32 brauchst. Mehr dürfte nicht kaputt sein, mehr geht selten kaputt. Das gute ist das man RN-Control immer selbst schnell und günstig reparieren kann (Vorteil da keine SMD Technik).

robonooby
13.10.2011, 19:07
hmm wenn ich das richtig sehe hab ich ihn gar nicht geschaltet. hab nur abgefragt:



'Interrupt
Config Int0 = Rising 'Configuriere Int0 auf Low Level
On Int0 Isr_von_int0 'springe Zu Isr_von _int0
Enable Interrupts 'einschalten der Interrupts
Enable Int0 'einschalten Von Interrupt Int0

oder ist das standartmäßig auf High also Plus?
Nur nicht dass ich mir dann den nächsten auch abrauche. Aber eigentlich dürfte wenn ich auf Masse erstmal gehe gar nix passieren oder?

Frank
14.10.2011, 13:04
Wenn der Port an keiner anderen Stelle im Programm auf Ausgang programmiert wird, dann ist es ok!
Dann muss das "abrauchen" einen anderen Grund gehabt haben.

robonooby
14.10.2011, 18:44
hmm okey. das ist aber dann sehr merkwürdig finde ich. ISt der Port bei der RN-Control vielleicht standartmäßig irgendwie belegt oder so? kannste vielleicht den Code (der ne seite vorher steht) mal durchgucken ob ich vielleicht nicht doch irgendwo den auf High gesetzt hab. aber eigentlich nicht bewusst.

sehr merkwürdig

robonooby
20.10.2011, 14:15
kann mir den keiner da helfen?

Frank
20.10.2011, 21:47
kann mir den keiner da helfen?

Du musst doch nur analytisch vorgehen! INT0 ist PortD2.
In deinem Programm steht am Anfang:


Config Portd.2 = Output 'Für Enfernungsmessung Ultraschall diesen Port als eingang definieren

Laut deinem Kommentar schaltest du Port auf Eingang aber die Anweisung macht das Gegenteil !
Also du hast port aus Ausgang geschaltet. Wenn du nun den Port mit Masse verbindest himmelst du den Controller.
Das ist alles logisch!

robonooby
21.10.2011, 06:02
ahh schitt.
das ist mir echt net aufgefallen :( dann erklärt das echt alles. wahrscheinlich liegt es daran, weil ich das Grundgerüst von dem Programm von nem vorheriegen Testprogramm rüber kopiert hab und da ist mir sowas net aufgefallen.
Scheiße. dann werd ich das gleich mal rauswerfen.
großen dank Frank

robonooby
27.10.2011, 19:05
so da bin ich wieder mit nem neuen Atmel 32 vom reichelt
hab den jetzt mal ausgetauscht und eingeschaltet. nachdem ich dann die Fusebits wieder umgestellt hab ging zwar mehr als vorher aber immer noch nicht alles :-(
Was nicht geht mit dem ersten Testprogramm aus der Bedienungsanleitung:
- Batteriespannung wird nicht angezeigt
- Motoren gehen nicht
- Lauflicht funktioniert nicht

Messwerte zeigt er an:

Ermittelte Messwerte an Port A:
Pin 0 ADC-Wert= 1022 bei 5V REF waeren das 4.995111938 Volt
Pin 1 ADC-Wert= 1022 bei 5V REF waeren das 4.995111938 Volt
Pin 2 ADC-Wert= 1022 bei 5V REF waeren das 4.995111938 Volt
Pin 3 ADC-Wert= 1022 bei 5V REF waeren das 4.995111938 Volt
Pin 4 ADC-Wert= 1022 bei 5V REF waeren das 4.995111938 Volt
Pin 5 ADC-Wert= 1022 bei 5V REF waeren das 4.995111938 Volt
Pin 6 ADC-Wert= 446 bei 5V REF waeren das 2.179862974 Volt
Pin 7 ADC-Wert= 1023 bei 5V REF waeren das 4.999999517 Volt

Was ich auch komisch finde, dass 2 LEDs dauerhaft brennen. war meines wissens vorher nicht.

was könnte noch kaputt sein? hat da jemand ne idee? Bin leider kein erfahrener Elektrotechniker von daher hab ich momentan keine idee mehr :-(

ach ja Versorgungsspannung hab ich geprüft. der Atmel bekommt 5 Volt.
und was mir noch aufgefallen ist: der Ton an den Knöpfen 1 2 und 3 also genau an denen auch die Funktionen nicht gehen stimmt nicht direkt über ein

Frank
28.10.2011, 10:37
Das mit de brennenden LED liegt vermutlich dran das du die Fusebits noch nicht korrekt eingestellt hast. Du musst JTAG ausschalten. Hier im Wiki findest du ein Bild:
http://www.rn-wissen.de/index.php/RN-Board_FAQ-Seite#Fusebits_bequem_im_Quelltext_festlegen

Dann solltest du darauf achten das alle Jumper am Board in der Grundstellung sind, also so wie bei Auslieferung. Ich glaube dazu sind Bilder in der Doko und im Wiki.
Und du solltest aktuelle Testprogramm von aktueller Robotikhardware CD nutzen. Wenn es dann ime rnoch nicht korrekt geht, dann kann es sein das die Spannungswerte der Tasterabfrage bei dir etwas abweicht, dann müsstest du die etwas anpassen.

Am besten ich hänge dir mal aktuelles Testprogarmm hier an, das sollte eigentlich auf Anhieb überall passen


Übrigenes einen fertig programmierten Controller (mit Testprogramm, korrekten Fusebits und Bootloader) gibts auch hier http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=79_68&products_id=185

robonooby
28.10.2011, 12:26
danke frank
ich weis zwar jetzt nicht genau wieso. Aber ich hab dein Programm mal drauf gemacht und seit dem geht alles wieder :)
selbst mit meinem testprogramm läufts jetzt auch.
ka wieso aber gut hauptsache es geht jetzt. hoffentlich bleibs so xD

vielen lieben dank

Frank
28.10.2011, 13:01
Vermutlich weil in unserem Testprogramm auch die Fusebits durch eine Programmzeile richtig eingestellt werden!
Also viel Spaß weiterhin!