PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo über I2C (SD21) mit dem Atmega8 ansteurn



Wombatz
07.10.2011, 18:38
Hallo zusammen,

jetzt kommt von mir mal etwas produktives. Ich habe mich immer gefreut, wenn man gerade als Anfänger Beispiele kopieren kann und diese dann ausprobieren kann.
Da ich mir nun länger an der I2C-Geschichte den Kopf zerbrechen musste und nun glaube ich den Durchbruch geschafft habe, will ich denen die es interessieren könnte einen Servo mit dem Servoboard SD21 über den Atmega8 (Über die USART-Schnittstelle) zu steuern, die Arbeit vereinfachten.

Arbeitsutensilien:

Atmega8
SD21 Servoboard
Servo (an der Schnittstelle 1 des SD21 angeschlossen).

Ziel:

Also wenn ich über das Terminalprogramm (z.B.Realterm) eine 1 sende, soll der Servo den Linksanschlag anfahren.
Wenn ich die 2 sende, dann soll er den Rechtsanschlag anfahren. Wenn ich eine 3 bis Unendlich sende, dann fährt er die Mitte an.

Ich habe versucht alles im Code zu beschriften...Nun hoffe ich, dass es einem bei seiner "Studie" hilft.

Viel Spaß damit


'************************************************* ******************************
'* Die LED Portb.0 soll blinken, wenn eine 1 über die USART *
'* gesendet wird, wird ein Interrupt ausgerufen, der in ein *
'* vorgegebenes Label (Linksanschlag) springt. *
'* Wird eine 2 gesendet, wird das Label Rechtsanschlag ange- *
'* sprungen. Hier dreht der Motor entweder nach rechts oder *
'* links. *
'************************************************* ******************************


$regfile = "m8def.dat"

$crystal = 3686400 'Quarzfrequenz
$baud = 9600 'Baud für USART

'************** I2C ************************************************** **********

Config Scl = Portc.5 'Ports fuer IIC-Bus
Config Sda = Portc.4

Const Servo_adr = &HC2 'I2C Adress Servo Controller

Dim Tnr As Byte 'Servoanzahl
Dim Lsb As Byte 'Lowbyte
Dim Msb As Byte 'Highbyte
Dim Posit As Word 'Position

I2cinit

'************** USART ************************************************** ********

On Urxc Anschlag 'Interruptroutine

Dim I As Byte 'I für UDR Variable

Enable Urxc 'Interrupt einschalten

Enable Interrupts 'Interrupt Global freigeben

'*************** Portkonfiguration *********************************************

Tnr = 1 ' number of servo (0-x)

Ddrb = &B00000001 'Portb.0 Eingang

'************** Hauptschleife **************************************************
Do

Toggle Portb.0 'LED blinken
Wait 1 'jede Sekunde

Loop

'************** Label Anschlag *************************************************

Anschlag:
Print "Empfangen" '"Empfangen" in Terminal ausgeben
I = Udr 'UDR auslesen
If I = "1" Then 'Wenn I = 1 dann Linksanschlag
Goto Linksanschlag
Elseif I = "2" Then 'Wenn I = 2 dann Rechtsanschlag
Goto Rechtsanschlag
Else
Goto Mitte
End If
Return

'************** Label Linksanschlag ********************************************

Linksanschlag:
Print "Links"
Posit = 800 ' position (1000 - 2000)
Lsb = Low(posit)
Msb = High(posit)
I2cstart
I2cwbyte Servo_adr ' serv CTRL I2C Addr
I2cwbyte 0 ' servo nr
I2cwbyte 50 ' speed
I2cwbyte Lsb ' lsb of position
I2cwbyte Msb ' Msb of position
I2cstop

Return

'************* Label Rechtsanschlag ********************************************

Rechtsanschlag:
Print "Rechts"
Posit = 2300 ' position (1000 - 2000)
Lsb = Low(posit)
Msb = High(posit)
I2cstart
I2cwbyte Servo_adr ' serv CTRL I2C Addr
I2cwbyte 0 ' servo nr
I2cwbyte 50 ' speed
I2cwbyte Lsb ' lsb of position
I2cwbyte Msb ' Msb of position
I2cstop

Return

'************* Label Mitte ************************************************** ***

Mitte:
Print "Mitte"
Posit = 1500 ' position (1000 - 2000)
Lsb = Low(posit)
Msb = High(posit)
I2cstart
I2cwbyte Servo_adr ' serv CTRL I2C Addr
I2cwbyte 0 ' servo nr
I2cwbyte 50 ' speed
I2cwbyte Lsb ' lsb of position
I2cwbyte Msb ' Msb of position
I2cstop

Return