Und nun die gesamte Slave-Software:
(Scanner_106.BAS)
Scanner (Slave) -Register :
(ScannerRegister.zip)
Im Anhang sind die Slave-Register aufgelistet. Die Register 1..9 sind zum Schreiben, die Register 10…19 zum Lesen vorgesehen.
Wichtig ist das schreiben der Parameter AB und BC (Baken-Abstand) nach einem Reset. Ohne diese Werte kommt nur X=0 und Y=0 zurück.
Der Master (Roboter) steuert den Scanner (z.B. für Initialisieren) so an:
- Register 5 (AB) = 480 schreiben 'AB=480cm
- Register 6 (BC) = 560 schreiben 'BC=560cm
- Register 1 schreiben 'Initialisieren (Motor ein / Laser ein / Orientieren)
Nun läuft der Scanner und liefert (hoffentlich) die gewünschten Daten.Code:Scanner_Initialisierung: call Scanner_readregister(10 , 0) if Scanner_Status.3 = 0 then T_lob = low(ab) 'T_ab>SLAVE T_hib = high(ab) call Scanner_writeregister(5 , T_lob , T_hib) T_lob = low(bc) 'T_bc>SLAVE T_hib = high(bc) call Scanner_writeregister(6 , T_lob , T_hib) end if if Turm_Status.0 = 0 then call Scanner_writeregister(2 , 70 , 0) 'Turm Geschw. waitms 500 ' !!! Sicherheit !!! call Scanner_writeregister(3 , 1 , 0) 'Laser ein call Scanner_writeregister(1 , 0 , 0) 'Initialisieren end if Return
Der Master (Roboter) bekommt die Werte nach dem Handshake (z.B. ATMega256 >PCint an PINK.7):
Der Master (Roboter) steuert den Scanner (z.B. für AUS) so an:Code:Isr_pcint2: If pink.7 = 1 Then call Scanner_readregister(10 , 0) 'Status call Scanner_readregister(11 , 0) 'Pos. X call Scanner_readregister(12 , 0) 'Pos. Y call Scanner_readregister(14 , 0) 'Winkel2 call Scanner_readregister(16 , 0) 'Baken call Scanner_readregister(17 , 0) 'Impulse Winkel_gemessen_ Scanner = Winkel2 / 100 Pcifr.pcif2 = 1 End If Return
….und wieder EIN:Code:Scanner _ausschalten: Timeout = 0 do call Scanner _writeregister(3 , 0 , 0) ' Scanner -Laser AUS call Scanner _writeregister(2 , 0 , 0) ' Scanner -Motor AUS call Scanner _readregister(10 , 0) ' Status if Timeout > 60 then Print "TIMEOUT Scanner ausschalten !!!" Print " Scanner _status=" ; Scanner _status exit do end if loop until Scanner _status.5 = 0 and Scanner _status.4 = 0 Return
Der TWI-Code:Code:Scanner _einschalten: Timeout = 0 do call Scanner_writeregister(2 , 70 , 0) ' Scanner -Motor EIN waitms 500 ' !!! Sicherheit !!! call Turm_writeregister(3 , 1 , 0) ' Scanner -Laser EIN call Turm_readregister(10 , 0) if Timeout > 60 then Print "TIMEOUT Scanner einschalten !!!" Print " Scanner_status=" ; Scanner_status exit do end if loop until Scanner_status.5 = 1 and Scanner_status.4 = 1 Return
Code:Sub Scanner_writeregister(byval Befehl as Byte , byval Wert_L as Byte , byval Wert_H as Byte ) I2cstart I2cwbyte Scanner_slaveid 'D0 I2cwbyte Befehl '1….9 I2cwbyte Wert_L I2cwbyte Wert_H I2cstop End SubIch hoffe, ich habe nichts vergessen...............Code:Sub Scanner_readregister(byval ScannerRegister as Byte , byval ScannerWert as Byte) I2cstart I2cwbyte Scanner_slavewrite 'D0 I2cwbyte ScannerRegister '10……19 I2cwbyte ScannerWert 'für künftige Erweiterungen I2cstop I2cstart I2cwbyte Scanner_slaveread 'D1 I2crbyte Hib , Ack I2crbyte Lob , Nack I2cstop Select case ScannerRegister case 10 Scanner_Status = Makeint(lob , Hib) case 11 X_gemessen = Makeint(lob , Hib) case 12 Y_gemessen = Makeint(lob , Hib) case 13 Winkel1 = Makeint(lob , Hib) case 14 Winkel2 = Makeint(lob , Hib) case 15 Winkel3 = Makeint(lob , Hib) case 16 Baken = Makeint(lob , Hib) case 17 Baken_Impulse = Makeint(lob , Hib) end select End Sub
Damit ist das Projekt (vorerst) abgeschlossen und ich wünsche Euch viel Erfolg damit.![]()








Zitieren


Lesezeichen