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
Code:'******************************************************************************* '* 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







Zitieren

Lesezeichen