sooo.. nun ist das teil nach ein paar problemen verkabelt. hätte mir ja mal einer sagen können das sluminium leitet... dachte immer das leitet keinen strom. naja auf jedenfall habe ich irgendein potential auf den aluteilen. muss ich nochmal versuche rauszubekommen was.. weil eigentlich kann das net sein... aufjedenfall hat mein us sensor da die kapseln mit den aluteilen verbunden waren immer nen reset bzw. auch wirres zeug des motortreibers verursacht.
habe hier dann mal ein bild vom inneren angehangen (die gallery wollte das bild net schlucken). aber net wundern bei mir auf meinem basteltisch sieht es wüst aus da muss ich mal wieder aufräumen.
dann habe ich noch ein problem. ich habe jetzt ja die emg30 motoren mit drehgeben den habe ich wie folgt angeschlossen.
Code:
atmega8 int0 ---------------- Hall A
|
4,7k pullup (wie vom hersteller empfohlen)
|
+5V
12V Akku ---------------- VCC Hall
GND Akku ---------------- GND Hall
12V Akku ---------------- VCC Motor
GND Akku ---------------- GND Motor
nun bekomme ich mit folgenden Bascom-code keine werte:
Code:
'*******************************************************************************
'
'*******************************************************************************
'===============================================================================
'***| Mikrocontroller Config |**************************************************
'===============================================================================
'Microcontroller
'================
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 10
$framesize = 40
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Config Portd.0 = Output
Config Portd.1 = Output
Config Portc.2 = Output
Config Portc.3 = Output
Config Int0 = Change
Config Int1 = Change
On Int0 Odo_r
On Int1 Odo_l
Enable Int0
Enable Int1
Enable Interrupts
Dim Twi_control As Byte
Dim Twi_status As Byte
Dim Command As Byte
Dim Index As Byte
Dim Newbyte As Byte
Dim Byte1 As Byte
Dim Byte2 As Byte
Dim Byte3 As Byte
Dim Byte4 As Byte
Dim Ticks_r As Byte
Dim Ticks_l As Byte
Declare Sub Twi_init_slave
Enable Interrupts
'Aliases
'========
M1 Alias Portd.0
M2 Alias Portd.1
M3 Alias Portc.2
M4 Alias Portc.3
'Init
'=====
Call Twi_init_slave
Ticks_r = 0
Ticks_l = 0
Command = 0
Index = 0
Byte1 = 0
Byte2 = 0
Byte3 = 0
Byte4 = 0
M1 = 0
M2 = 0
M3 = 0
M4 = 0
'-------------------------------------------------------------------------------
'***| Hauptprogramm |***********************************************************
'-------------------------------------------------------------------------------
Do
Newbyte = 0
'schauen ob TWINT gesetzt ist
Twi_control = Twcr And &H80 ' Bit7 von Controlregister
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8 ' Status
'wurde ein Byte geschickt?
If Twi_status = &H80 Or Twi_status = &H88 Then
Command = Twdr ' neue Daten merken
Newbyte = 1 ' merken das ein neues Byte da ist
End If
'TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
End If
'wenn ein neues Byte gekommen ist verarbeiten
If Newbyte <> 0 Then
'Register zuordnen -> Befehl
Select Case Command
Case 1
Gosub Ketten_stopp
Case 2
Gosub Move
Case 3
Gosub Ticks
End Select
End If
Loop
End
'-------------------------------------------------------------------------------
'***| Stoppt die Ketten |*******************************************************
'-------------------------------------------------------------------------------
Ketten_stopp:
Index = 1 '4 Byte holen
Gosub I2c_rx
If Byte1 = 1 Then
Pwm1a = 0
Pwm1b = 0
M1 = 0
M2 = 0
M3 = 0
M4 = 0
Else
Pwm1a = 0
Pwm1b = 0
M1 = 0
M2 = 0
M3 = 0
M4 = 0
End If
Return
'-------------------------------------------------------------------------------
'***| Move: Macht eine undefinierte bewegung (unendlich) |**********************
'-------------------------------------------------------------------------------
Move:
Index = 4 '4 Byte holen
Gosub I2c_rx
'rechts
If Byte1 = 1 Then
M3 = 0
M4 = 1
Elseif Byte1 = 2 Then
M3 = 1
M4 = 0
End If
Pwm1a = Byte2
'links
If Byte3 = 1 Then
M1 = 0
M2 = 1
Elseif Byte3 = 2 Then
M1 = 1
M2 = 0
End If
Pwm1b = Byte4
Return
'-------------------------------------------------------------------------------
'***| Turn: Macht eine definierte bewegung |************************************
'-------------------------------------------------------------------------------
Ticks:
Byte1 = Ticks_r
Byte2 = Ticks_l
'Ticks_r = 0
'Ticks_l = 0
Index = 2 '4 Byte senden
Gosub I2c_tx
Return
'-------------------------------------------------------------------------------
'***| I2C-BUS Daten Empfangsroutinen |******************************************
'-------------------------------------------------------------------------------
I2c_rx:
'erstes Byte empfangen
Newbyte = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &H80 Or Twi_status = &H88 Then
Byte1 = Twdr
Newbyte = 2
End If
Twcr = &B11000100
End If
If Newbyte = 2 Then Exit Do
Loop
'Prüfen ob noch mehr empfangen werden soll
If Index = 1 Then Return
'zweites Byte empfangen
Newbyte = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &H80 Or Twi_status = &H88 Then
Byte2 = Twdr
Newbyte = 2
End If
Twcr = &B11000100
End If
If Newbyte = 2 Then Exit Do
Loop
'Prüfen ob noch mehr empfangen werden soll
If Index = 2 Then Return
Newbyte = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &H80 Or Twi_status = &H88 Then
Byte3 = Twdr
Newbyte = 2
End If
Twcr = &B11000100
End If
If Newbyte = 2 Then Exit Do
Loop
'Prüfen ob noch mehr empfangen werden soll
If Index = 3 Then Return
Newbyte = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &H80 Or Twi_status = &H88 Then
Byte4 = Twdr
Newbyte = 2
End If
Twcr = &B11000100
End If
If Newbyte = 2 Then Exit Do
Loop
Return
'-------------------------------------------------------------------------------
'***| I2C-BUS Daten Senderoutinen |******************************************
'-------------------------------------------------------------------------------
I2c_tx:
'erstes Byte empfangen
Newbyte = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &HA8 Or Twi_status = &HB8 Then
Twdr = Byte1
Newbyte = 2
End If
Twcr = &B11000100
End If
If Newbyte = 2 Then Exit Do
Loop
'Prüfen ob noch mehr empfangen werden soll
If Index = 1 Then Return
'zweites Byte empfangen
Newbyte = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &HA8 Or Twi_status = &HB8 Then
Twdr = Byte2
Newbyte = 2
End If
Twcr = &B11000100
End If
If Newbyte = 2 Then Exit Do
Loop
'Prüfen ob noch mehr empfangen werden soll
If Index = 2 Then Return
Newbyte = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &HA8 Or Twi_status = &HB8 Then
Twdr = Byte3
Newbyte = 2
End If
Twcr = &B11000100
End If
If Newbyte = 2 Then Exit Do
Loop
'Prüfen ob noch mehr empfangen werden soll
If Index = 3 Then Return
Newbyte = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &HA8 Or Twi_status = &HB8 Then
Twdr = Byte4
Newbyte = 2
End If
Twcr = &B11000100
End If
If Newbyte = 2 Then Exit Do
Loop
Return
'-------------------------------------------------------------------------------
'***| Rechte Odometrie |********************************************************
'-------------------------------------------------------------------------------
Odo_r:
Incr Ticks_r
Return
'-------------------------------------------------------------------------------
'***| Linke Odometrie |*********************************************************
'-------------------------------------------------------------------------------
Odo_l:
Incr Ticks_l
Return
'-------------------------------------------------------------------------------
'***| Unterprogramme |**********************************************************
'-------------------------------------------------------------------------------
'TWI als slave aktivieren
Sub Twi_init_slave
Twsr = 0 ' status und Prescaler auf 0
Twdr = &HFF ' default
Twar = &H22 ' Slaveadresse setzen I2C-RX-Adr:Hex22
Twcr = &B01000100 ' TWI aktivieren, ACK einschalten
End Sub
sry ist nicht optimiert und groß kommentiert.
das empfangen der ticks mit dem master geht. habe testweise die ticks mal bei jedem loop durchlauf um einen erhöhen lassen. das kam alles an.
weiß jemand was da los ist?
wäre sehr dankebar wenn mir jemand helfen könnte.
vllt ist auch die verkabelung falsch aber bei einem fliegend aufgebautem test schwankte die spannung zwischen 0V und 5V
Lesezeichen