PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo steuern



ShadowPhoenix
16.09.2005, 22:24
$regfile = "m8def.dat"
$crystal = 4000000

Config Portb = Output
Dim X As Integer

Enable Interrupts

Config Servos = 1 , Servo1 = Portb.4 , Reload = 10
Servo(1) = 50

Do
Input , X
If X = 1 Then Servo(1) = 100 Else If X = 2 Then Servo(1) = 20
Loop


Wenn der AVR eine 1 empfängt, schaltet der Servo auf stellung 100, wenn er dann aber eine 2 empfängt, tut sich nichts mehr.

Aber es ist doch eine Endlosschleife?
Das INPUT funktioniert anscheinend nur ein mal, dann geht nichts mehr.

Wie stell ich das am besten an?

linux_80
16.09.2005, 22:39
Hallo,

kann man in Bascom von UART auch integerwerte empfangen,
wenn nicht, würde ich die Abfrage auf Strings umstellen(das X), dann schauts zumindest besser aus, finde ich.

ShadowPhoenix
16.09.2005, 22:42
Das Senden und Empfangen funktioniert einwandfrei, die 2 Taster (einmal X=1 einmal X=2) reagieren auch, aber immer nur einmal, dann ist schluss.

Muss man da timer oder Interrupts oder so verwenden? Wie macht man das?

linux_80
16.09.2005, 22:48
geht da nicht noch das $baud ab, oder wie ist das defaultmässig ?
Und ohne komma beim Input ?

Edit:
Interrupts sind ja aktiviert für den Servo.

linux_80
16.09.2005, 23:09
Stimmen die MHz ?

bei mir funktionierts ansonsten !

ShadowPhoenix
16.09.2005, 23:17
Das Komma ist gesetzt, $baud habe ich vergessen, funktioniert aber trotzdem nicht!

Quarz is ein 4MHz, Fusebits richtig gesetzt.

Wie funktioniert es bei dir?
Anfangs fährt der Servo in Stellung 50, dann wenn man einen Taster drückt, entweder auf Stellung 100 oder 20, aber dann ist schluss.
Sobald einma ein Taster gedrückt wurde, reagieren die nicht weiter!

linux_80
16.09.2005, 23:24
Ich hab das RN-Meag8 Board,
da hab ichs auf PortB.4 angeschlossen, mit 7.32Mhz
Bei meinem Servo geht der Bereich von 40 bis 140,
ich hab nur die Werte geändert, aber ansonsten macht der das so wie von Dir gewünscht, bei 1 die eine, und bei 2 die andre Position, und auch hin und her usw.

Bau mal einen Print ein (irgendein Text ausgeben), um zu sehen, ob die Zeichen richtig ankommen im Terminal, dort hab ich auch gemerkt, das ich noch Deine MHz drin stehen hatte.

ShadowPhoenix
16.09.2005, 23:37
Liegt es vielleicht an meinem "Sender"? :


$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Config Pind.5 = Input
Config Pind.6 = Input
Dim X As Integer
Dim Y As Integer
X = 1
Y = 2

Do
If Pind.5 = 0 Then Print X
If Pind.6 = 0 Then Print Y
Loop


Wird hier vllt. nur einmal gesendet? Wie muss der Code aussehen?

linux_80
17.09.2005, 00:05
ich hab mal ein kleines Testprogramm zu positionieren des Servo gebaut:

die If-Abfrage begrenzt nur den Bereich, muss evtl. angepasst werden.


$regfile = "m8def.dat"
$crystal = 7372800
$baud = 9600


Config Portb.4 = Output
Dim X As Integer

Enable Interrupts

Config Servos = 1 , Servo1 = Portb.4 , Reload = 10
Print "Hallo"

Servo(1) = 100

Do

Input X
If X < 139 And X > 36 Then
Servo(1) = X
End If

Loop


End


im Terminal direkt den Wert eingeben und Enter drücken, schon fährt der Servo.
Das "Hallo" ist zum überprüfen der Verbindung, wenn das kommt passt die Geschwindigkeit auf beiden Seiten.

ShadowPhoenix
17.09.2005, 00:17
Beide AVR's sind nicht mit dem PC verbunden, habe deshalb keine Möglichkeit mit dem Terminal.

Aber die 1 und die 2 kommen richtig an, und werden auch interpretiert, aber eben nur ein einziges mal.

Liegt es wiegesagt am Sender? (oben)


edit:
Es liegt bestimmt am senden.
Dein Code funktioniert, aber nachdem ein Taster gedrückt wurde, kommen wohl keine Signale mehr an.

Wie richte ich mit Bascom eine Schleife ein, die immer einen Port ausliest und entsprechend mit Print sendet.

ShadowPhoenix
17.09.2005, 00:39
@linux_80

Kannst du mal deinen "Sende"-Code posten?

Also den Code, womit du per Print beliebig viele Befehle sendest.
Bei mir sendet das Programm anscheinend nur einmal.

linux_80
17.09.2005, 01:26
Aja,
SendeCode hab ich jetz keinen, habs mit dem PC probiert,
aber ich denke, das deine Schleife zum senden doch sehr viele Prints macht in der Zeit in der der Eingang 0 ist.
Was hängt da an den Eingängen, sind die Taster entprellt,
evtl. den Code so umstellen, das der Print nur ausgeführt wird, wenn der Eingang von 1 auf 0 wechselt, und da auch nur einmal.

Kannst Du zum testen die AVRs mit dem PC verbinden, stelle mir so die Fehlersuche einfacher vor.

ShadowPhoenix
17.09.2005, 02:05
"Kannst Du zum testen die AVRs mit dem PC verbinden, stelle mir so die Fehlersuche einfacher vor."

Hm jetzt nicht, kann daweil nicht löten.


"aber ich denke, das deine Schleife zum senden doch sehr viele Prints macht in der Zeit in der der Eingang 0 ist.
Was hängt da an den Eingängen, sind die Taster entprellt,
evtl. den Code so umstellen, das der Print nur ausgeführt wird, wenn der Eingang von 1 auf 0 wechselt, und da auch nur einmal. "

Jo das tut sie definitiv! Kannst du mir einen Beispielcode geben, so wie du es meinst?
Die Taster sind standard auf high (1 +), und wenn der Taster gedrückt wird auf low (0 GND)

ShadowPhoenix
17.09.2005, 02:50
Meine neuen Codes, funktioniert immer noch nicht:


$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Config Pind.5 = Input
Config Pind.6 = Input
Dim X As Integer
Dim Y As Integer

X = 1
Y = 2

Main:
Do
If Pind.5 = 0 Then Goto Send1
If Pind.6 = 0 Then Goto Send2
Loop

Send1:
Print X
Goto Main

Send2:
Print Y
Goto Main



$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Config Portb = Output

Dim X As Integer

Portb.5 = 0

Main:
Do
Input , X
If X = 1 Then Goto Loop1
If X = 2 Then Goto Loop2
Loop

Loop1:
Portb.5 = 1
Goto Main

Loop2:
Portb.5 = 0
Goto Main



Nach anlegen von Spannung an beide AVR kann ich genau einmal einen Taster drücken, beide reagieren, aber nach einem Tastendruck ist schluss.

Was ist da nur falsch?

hrei
17.09.2005, 09:52
Hallo,


Meine neuen Codes, funktioniert immer noch nicht:

.....

Nach anlegen von Spannung an beide AVR kann ich genau einmal einen Taster drücken, beide reagieren, aber nach einem Tastendruck ist schluss.

Was ist da nur falsch?

Du springst aus einer Do...Loop Schleife einfach mit einem Goto heraus. Das geht natürlich nicht. Do...Loop verläßt man mit Exit Loop. In Deinem Programm kommt der Programmcounter ja sofort durcheinander. Das kann also nur einmal funktionieren.

Ändere Deine Labels in Subs und schon geht es.

Henrik

linux_80
17.09.2005, 10:57
Moin,
gegenüber dem alten code hat sich aber nicht wirklich was geändert.
Ich hab das jetzt doch mal einegetippt, den Sendecode,
und muss sagen das der ja läuft, hab den Taster zwar nur mit 'nem Kabel gegen Masse simuliert und die ausgabe zum PC gesendet, aber es kommt was, nicht nur einmal.
Ich kann meine Boards jetzt nicht zusammenhängen, da ich nur ein Netzteil da hab.

hrei
17.09.2005, 11:20
Moin,
gegenüber dem alten code hat sich aber nicht wirklich was geändert.
Ich hab das jetzt doch mal einegetippt, den Sendecode,
und muss sagen das der ja läuft, hab den Taster zwar nur mit 'nem Kabel gegen Masse simuliert und die ausgabe zum PC gesendet, aber es kommt was, nicht nur einmal.
Ich kann meine Boards jetzt nicht zusammenhängen, da ich nur ein Netzteil da hab.

Ja, krutzitürken, sapperlot...

Ein solches Konstrukt kann nicht funktionieren:

Main:
Do
Input , X
If X = 1 Then Goto Loop1
If X = 2 Then Goto Loop2
Loop

Loop1:
Portb.5 = 1
Goto Main

Loop2:
Portb.5 = 0
Goto Main

Bitte, nochmal gaaanz von vorne anfangen und die grundlegenden Regeln der Behandlung von Schleifenkonstrukten erlernen.

Henrik

linux_80
17.09.2005, 12:09
Ist schon recht,
ich meinte ja auch den ShadowPhoenix.

ShadowPhoenix
17.09.2005, 16:31
Ohjee, wusste ich es doch, mein Code ist peinlich =)

Wo lerne ich denn am besten Basic für Bascom? Gibt es da eine Seite?

ShadowPhoenix
17.09.2005, 16:42
Meine neuen Codes, funktioniert immer noch nicht :(


$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Config Pind.5 = Input
Config Pind.6 = Input

Declare Sub Send1
Declare Sub Send2

Dim X As Integer
Dim Y As Integer

X = 1
Y = 2

Do
Debounce Pind.5 , 0 , Send1 , Sub
Debounce Pind.6 , 0 , Send2 , Sub
Loop

Sub Send1:
Print X
End Sub

Sub Send2:
Print Y
End Sub




$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Config Portb = Output

Declare Sub Loop1
Declare Sub Loop2

Dim X As Integer

Portb.5 = 0

Do
Input , X
If X = 1 Then Gosub Loop1
If X = 2 Then Gosub Loop2
Loop

Sub Loop1:
Portb.5 = 1
End Sub

Sub Loop2
Portb.5 = 0
End Sub


Hmm, habe doch gosub verwendet... trotzdem reagiert der AVR nur auf einen Tastendruck!


EDIT: Mit Sub, geht aber nicht!

ShadowPhoenix
17.09.2005, 17:18
Ich muss jetzt den Fehler suchen. An welchem Port des Parallel-Ports soll ich TX vom AVR anschließen, sodass ich die Print-befehle am Terminal überwachen kann?

linux_80
17.09.2005, 17:48
Gar nicht, Parallel-Port ist ganz schlecht, der COM-Port ist für sowas da,
was hast Du jetzt für eine Schaltung,
um per Seriell vom AVR an den PC zu kommen brauchts eine Wandlung auf 12V, also sowas wie einen MAX232 IC dazwischen.

hrei
17.09.2005, 18:03
Ich muss jetzt den Fehler suchen. An welchem Port des Parallel-Ports soll ich TX vom AVR anschließen, sodass ich die Print-befehle am Terminal überwachen kann?

Bitte, bitte, bevor Du Dich mit Servos etc. beschäftigst, lerne erstmal ein paar Grundlagen. Du verwendest nun z.B. den Befehl INPUT und deklarierst gleichzeitig Variablen mit diesem reservierten Wort.

Input, X liest über die serielle Schnittstelle Daten in X ein, bis ein CR kommt. Siehe doch mal in die Hilfe, was da dazu steht.

Bitte nicht übelnehmen, aber im Moment stocherst Du mit einer sehr langen Stange in sehr dichtem Nebel. Das ist nicht peinlich, keine Bange, aber zumindest ich mag nun nicht das Manual bzw. die Hilfedatei hier abtippen. Setzte Dir bescheidenere Ziele und erweitere anhand der gewonnenen Erkenntnisse die Aufgabenstellung. Sonst wird das nix :-(.

Das ist alles nicht böse gemeint, glaube mir.

Grüße
Henrik

ShadowPhoenix
17.09.2005, 20:25
Ja, wenn ich X nicht per dim X as integer definiere, kann ich gar nicht Input, X verwenden, da ein Fehler auftritt..

hrei
17.09.2005, 20:34
Ja, wenn ich X nicht per dim X as integer definiere, kann ich gar nicht Input, X verwenden, da ein Fehler auftritt..

Kein Wunder.

LIES DAS MANUAL. ](*,) SUCHE nach INPUT. VERSTEHE WAS DORT STEHT.

Henrik

ShadowPhoenix
17.09.2005, 20:36
"Du verwendest nun z.B. den Befehl INPUT und deklarierst gleichzeitig Variablen mit diesem reservierten Wort."

So wie ich das verstehe, darf ich keine Variable X deklarieren, wenn ich INPUT, X verwende..
Oder wie meinst du das?

ShadowPhoenix
17.09.2005, 20:40
Die Hilfe:

Allows input from the keyboard during program execution.
Reads data from a file
Syntax

INPUT [" prompt" ] , var [ , varn ]
INPUT #ch, var [ , varn ]

Remarks

Prompt An optional string constant printed before the prompt character.
Var,varn A variable to accept the input value or a string.
Ch A channel number, which identifies an opened file. This can be a hard coded constant or a variable.
The INPUT routine can be used when you have an RS-232 interface on your uP.
The RS-232 interface can be connected to a serial communication port of your computer.
This way you can use a terminal emulator and the keyboard as an input device.
You can also use the built-in terminal emulator.

For usage with AVR-DOS file system, you can read variables from an opened file. Since these variables are stored in ASCII format, the data is converted to the proper format automaticly.

When you use INPUT with a file, the prompt is not supported.

Difference with QB
In QB you can specify &H with INPUT so QB will recognize that a hexadecimal string is being used.
BASCOM implements a new statement : INPUTHEX.


----------------------


Super das sagt mir gar nichts!
Mein Englisch ist auch sehr schwach, darf man mir deshalb nicht helfen?


Du könntest mir helfen, indem du mir sagst, was ich bei meinem Code falsch mache.
Bekanntlich lernt man aus Fehlern...

Nochmal zu meinem Beispiel:

dim X as integer

input, X

Was ist daran bitte falsch?

hrei
17.09.2005, 21:09
"Du verwendest nun z.B. den Befehl INPUT und deklarierst gleichzeitig Variablen mit diesem reservierten Wort."

So wie ich das verstehe, darf ich keine Variable X deklarieren, wenn ich INPUT, X verwende..
Oder wie meinst du das?

Du verwendest in deinem ersten Programm als Variablename input. Das ist böse weil input ein Befehl ist, daher ein "reserved word" und als Variablenname nicht verwendet werden soll. Außerdem sendest Du kein carriage return, was das Empfangsprogramm dazu bringt ewig zu warten.

In Deinem zweiten Programm verwendest Du Input als Befehl. Input erwartet aber eine Eingabe über die serielle Schnittstelle, die per CR abgeschlossen wird und optional an das Terminal auch noch eine Eingabeaufforderung ausgeben kann.

Du fragst aber in deinem Empfangsprogramm eine numerische Variable ab, keinen CHR bzw. String.



Super das sagt mir gar nichts!
Mein Englisch ist auch sehr schwach, darf man mir deshalb nicht helfen?
Du könntest mir helfen, indem du mir sagst, was ich bei meinem Code falsch mache.
Bekanntlich lernt man aus Fehlern...


Natürlich darf man Dir helfen und ob Du es glaubst oder nicht, ich versuche das sogar. Es ist aber etwas zuviel verlangt Dir nun Stück für Stück die Hilfedateien zu übersetzen, Dir zu erklären welche Pins Du für die serielle Kommunikation brauchst, welche Hardwarevoraussetzungen sonst noch geschaffen werden müssen usw.

Ohne Englisch hast Du sowieso schlechte Karten. Hier hilft dann ein gutes Buch auf Deutsch weiter (z.B. von Roland Walter - von Kuehnelt würde ich eher abraten). Hat man sich damit das Grundwissen angeeignet, kann man auch mit ein paar Brocken Englisch die Datenblätter lesen. Letzteres ist Pflicht.

Henrik

ShadowPhoenix
17.09.2005, 21:32
Du verwendest in deinem ersten Programm als Variablename input. Das ist böse weil input ein Befehl ist, daher ein "reserved word" und als Variablenname nicht verwendet werden soll. Außerdem sendest Du kein carriage return, was das Empfangsprogramm dazu bringt ewig zu warten.


>Wo verwende ich bitte INPUT als Variablenname? Nirgends, schau dir nochmal die Codes durch!
In meinen ganzen Codes verwende ich nur ein einziges mal INPUT, und das als Befehl!



In Deinem zweiten Programm verwendest Du Input als Befehl. Input erwartet aber eine Eingabe über die serielle Schnittstelle, die per CR abgeschlossen wird und optional an das Terminal auch noch eine Eingabeaufforderung ausgeben kann.


>Ok, also muss ich beim "Sender" CR mitsenden, und beim "Empfänger" CR auch verarbeiten?



Natürlich darf man Dir helfen und ob Du es glaubst oder nicht, ich versuche das sogar. Es ist aber etwas zuviel verlangt Dir nun Stück für Stück die Hilfedateien zu übersetzen, Dir zu erklären welche Pins Du für die serielle Kommunikation brauchst, welche Hardwarevoraussetzungen sonst noch geschaffen werden müssen usw.


>Wenn ich selber nicht weiterkomme, frage ich hier nach.


MfG

ShadowPhoenix
17.09.2005, 21:53
Wie sende ich eigentlich ein <CR> ?

Kannst du mir nicht einfach einen Beispielcode geben, aus dem ich lernen kann?
Aus der Hilfe werde ich echt nicht schlau, da steht auch nix diesbezüglich!

ShadowPhoenix
17.09.2005, 22:54
Habe die Suche vom Forum verwendet, und mir irgendwie den Code zusammengeschneidert, aber es mag immer noch nicht =(
Ein carriage return wird hierbei gesendet, der Empfänger reagiert aber nicht =(


$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Config Pind.5 = Input
Config Pind.6 = Input

Declare Sub Send1

Dim X As String * 1
Dim Cr As String * 4

Cr = "13"
X = "A"

Do
Debounce Pind.5 , 0 , Send1 , Sub
Loop

Sub Send1:
Print X ; Chr(cr)
End Sub


$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Config Portb = Output

Declare Sub Loop1

Dim X As String * 10
Dim Y As String * 1

Y = "A"

Portb.5 = 0

Do
Input , X
If X = Y Then Gosub Loop1
Loop

Sub Loop1:
Toggle Portb.5
End Sub


Beim Sender ist X gleich "A" und beim Empfänger ist Y auch "A", dabei sollte doch nach Loop1 gesprungen werden...

linux_80
18.09.2005, 00:17
Hallo ShadowPhoenix,
ich hab deine beiden ersten Codestücke die Du hier im Thread gepostet hast mal eingegeben, und beide sind gelaufen, zumindest bei mir wenn an einem Ende der PC dran hängt.
mir scheint, das da noch irgendwo anders was zwickt.

Zu dem Print, Du must nicht extra dein CR senden, das macht der automatisch, nur wenn man es nicht senden will muss man dem Print ein ; anhängen.

ShadowPhoenix
18.09.2005, 00:30
Nun gut, PRINT X funktioniert, bei PRINT X; tut sich nix mehr =(

Sender:


$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Config Pind.5 = Input
Config Pind.6 = Input

Declare Sub Send1

Dim X As Integer

X = 1

Do
Debounce Pind.5 , 0 , Send1 , Sub
Loop

Sub Send1:
Print X;
End Sub



Empfänger:


$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Config Portb = Output

Declare Sub Loop1

Dim X As Integer
Dim Y As Integer

Y = 1

Portb.5 = 0

Do
Input , X
If X = Y Then Gosub Loop1
Loop

Sub Loop1:
Toggle Portb.5
End Sub



Bei Tastendruck geht die LED an, nochmal Druck sollte sie ausgehen, tut sie aber nicht!

Wenn ich PRINT X; schreibe, geht gar nichts mehr!

linux_80
18.09.2005, 00:50
Nun gut, PRINT X funktioniert, bei PRINT X; tut sich nix mehr =(

.....

Wenn ich PRINT X; schreibe, geht gar nichts mehr!

deswegen sollst Du es so ja nicht schreiben, les die letzte Zeile meines vorherigen Beitrags noch mal genau !

ShadowPhoenix
18.09.2005, 00:58
Jo kleiner Fehler von dir =)
Lies mal genau:

"Zu dem Print, Du must nicht extra dein CR senden, das macht der automatisch, nur wenn man es nicht senden will muss man dem Print ein ; anhängen."

... nur wenn man es nicht senden will, muss man ein ";" anhängen...

Da ich es nicht senden will, hänge ich ein ; an ;)

linux_80
18.09.2005, 01:02
ja so wie's ausschaut brachst Du es aber, damit der andere AVR weiss das er was zu tun hat,
denn ein paar Beiträge weiter oben hast Du ja gefragt wie man ein CR sendet !
Das wäre die Antwort gewesen !

Gut n8

ShadowPhoenix
18.09.2005, 01:15
Ich dachte, es ist nicht nötig, CR mitzusenden?

Ich möchte nur, dass ich mehr als 1x eine "1" senden kann, und somit immer wieder Toggle Port ausgeführt wird.
Es geht aber wieder nur 1x...

gpo
18.09.2005, 11:19
Halo,

ein GOSUB erwartet kein SUB...ENDSUB, sondern wie auch der DEBOUNCE-Befehl eine SPRUNGMARKE: mit RETURN. Sieh Dir das mal in Deinen Programmen an. Das zitieren der Bascomhilfe erspar ich mir jetzt mal, aber ein Beispiel gibt es:

debounce taster, 1 , Schalten , Sub

Schalten:
Toggle led
Return

Günter

ShadowPhoenix
18.09.2005, 12:18
Danke für den Tip!
Funktioniert aber immer noch nicht!

Mein Sender sendet jetzt jede Sekunde das Zeichen, somit sollte die Led beim Empfänger abwechselnd schalten, tut sie aber nicht.

Beim Start beider AVR's bleibt die led konstant am Leuchten.
Mein neuer Code:


Sender:


$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Dim X As String * 1
X = "A"

Do
Print X
Wait 1
Loop

End


Empfänger:


$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Declare Sub Toggle1

Config Portb.5 = Output

Dim X As String * 1
Dim Y As String * 1
X = "A"

Do
Input , Y
If X = Y Then Gosub Toggle1
Loop

Toggle1:
Toggle Portb.5
Y = ""
Return

End



Habs mit IF X = Y THEN Toggle1 und mit Gosub toggle1 probiert, geht beides nicht!

Wo liegt nur der Fehler =(

ShadowPhoenix
18.09.2005, 21:53
Endlich, es funktioniert!
Fehler war in der INPUT-Anweisung. Wie "hrei" schon meinte, hätte ich <CR> mitsenden müssen. Tja, aber Meinungsverschiedenheit der User hat mich verwirrt, zudem stand auch nichts wegen <CR> in der Hilfe, geschweige denn wie man das sendet...


INPUT X; Chr(13);


Danke trotzdem an alle und Mfg