altRobots
/robotigs/icons/actuator.pngActuatoren
/robotigs/icons/printboards.pngAlgemeen
/robotigs/icons/chassis.pngChassis
/robotigs/icons/florigs.pngFlorigs
/robotigs/icons/interfacing.gifInterfacing
/robotigs/icons/microphone_icon.pngMuziek
/robotigs/icons/musicKey_icon.pngMuzikanten
/robotigs/icons/shield.pngSchildjes
/sys/icons/sensors.pngSensors
/robotigs/icons/languages.pngTalen
/robotigs/icons/battery.pngVoedingen
/sys/icons/microController.pngµControllers
altContact
SPI"); echo ("  "); } ?>  "); /* echo (""); echo (" "); //Show pencil as button */ ?> alt  

Deze pagina is verouderd. Ga naar de vernieuwde pagina.

"); $counter = 0; $aantal = str_word_count($pict_list, 0, "0123456789"); $lijst = str_word_count($pict_list, 1, "0123456789"); while($counter < $aantal){ $pictkey = $lijst[$counter]; $qryy1 = ("SELECT * FROM illustrations WHERE ill_id = $pictkey ;"); $resulty1 = pg_query($con1, $qryy1); while($row = pg_fetch_array($resulty1)){ //Fields accesible by their name foreach( $row AS $key => $val ){ $$key = stripslashes( $val ); } } $image = ("/robotigs/documentatie/plaatjes/$ill_name"); $pictfull = str_replace('_small', '', $image); //Pictfull=biggest version $alt = ("Just wait till your 57...."); $txtname = get_txt($con1, 18, $koekje[2], $ill_id); //Robot illustrations subtitles echo (""); echo (''. $alt .'
'); $nummer = $counter + 1; $txtAfb = get_txt($con1, 9, $koekje[2], 3865); //Pic Afb if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates echo ("$txtAfb $nummer: "); echo ("$txtname"); echo ("
"); echo ("Ontkoppelen "); if ($counter==0){ echo ("Up "); }else{ echo ("Up "); } if ($nummer == $aantal){ echo ("Down"); }else{ echo ("Down"); } }else{ //Else of if Meaning the current useer is logged in echo ("$txtAfb $nummer: $txtname"); } echo ('

'); //End of this picture $counter++; //Prepair for next picture } echo (''); //All pictures are printed } //End of if there are 1 or more pictures to be printed ---------------------- ?>

De Serial Peripheral Interface (wiki) is een synchrone, full-duplex, seriële verbinding met 4 draden en een aarde. Het systeem bestaat uit maximaal 1 master en minimaal 1 slave. Vrijwel alle µcontrollers hebben een SPI interface opgenomen in de hardware. De theoretische maximum snelheid van SPI is 10mBs.
     
  • Aansluiten
  • Miso gaat aan Miso en Mosi gaat aan Mosi.

SPI wordt bij mij gebruikt voor 2 doelen, namelijk:

  1. Voor het programmeren van de AVR controllers met ISP (Afb. 2).
  2. Om data uit te wisselen tussen µcontrollers via de SSA-Bus (Afb. 1 + 3).

1 SPI yourself
2 Arduino SPI library

Het ISP programmeren is normaal voor SPI. Het gebruik van dit protocol om ook meerdere processors met elkaar te laten kletsen komt minder vaak voor. Toch is het handig omdat u dan nooit in knoop komt met de eisen van externe apparatuur zoals sensoren of actuatoren. U kunt dan nog steeds zonder problemen werken met RS-232 en TWI  en alle andere voorzieningen die uw controller biedt. Er staat er in iedere datasheet van Atmel controllers een uitgebreide beschrijving van de manier waarop SPI in deze controllers is geimplementeerd.

De meest primitieve vorm van een programma dat 1 SPI byte shift is spi_mas tezamen met spi_slv. Dit duet is geschreven voor 2 ATmega8 controllers, maar zou in principe op alle AVR controllers moeten kunnen lopen. De messageserver software is een uitgebreide SPI master. Een voorbeeld van een uitgebreide slave is de joystick software.


  • SPI gebruiken voor meer zaken dan enkel ISP
    SPI wordt normaalgesproken gebruikt voor het In System Programmeren van de controller. Maar het kan ook worden gebruikt om controllers op een relatief hoge snelheid met elkaar te laten communiceren.  Het is bovendien zeer compatible, want als het op een controller niet in hardware is uitgevoerd dan kan het altijd nog met software geemuleerd worden op vrijwel iedere controller. Verschillende kloksnelheden van de controllers spelen ook geen rol. De master dient echter minstens zo snel te zijn als de slave. Indien u SPI wilt gebruiken voor meer dan enkel programmeren dan zijn er twee verschillende situaties te onderscheiden:
    • Iedere controller heeft een eigen programmeer aansluiting.
      De controllers zijn allen verbonden met een centrale reset button. In dit geval moet er voor iedere controller een diode worden opgenomen in de centrale reset lijn. Deze zorgt er voor dat tijdens het programmeren van een controller de resetlijn van de andere controllers niet wordt laaggetrokken waardoor deze ook worden geprogrammeerd.
    • Er is 1 centrale programmeer aansluiting voor alle controllers.
      Deze situatie is nog in ontwikkeling. Volgens Atmel AN AVR048 is de beste methode om dan met een keuzeschakelaar (bijv.: STUFENDREHSCHALTER . 1-POL 10STELL. (Conrad Electronic)) de SPISCK (RESET????) naar de juiste controller door te verbinden. Na een programmeerrun zijn dan direct alle controllers gereset, maar enkel de controller waaraan ook de SCK was verbonden wordt opnieuw geprogrammeerd. Indien echter het SPI protocol gebruikt moet worden voor communicatie moet de SCK van alle controllers worden aangesloten op de bus. De selectie van de controllers gebeurt dan via de SS aansluiting van de clients. Er moet dus een schalaar worden toegevoegd waarmee in de ene stand (Program) geprogrammeerd kan worden en in de andere stand (Run) de SPI bus voor communicatie gebruikt kan worden. Dit kan met een 12-polig-om schakelaar zoals de draaischakelaar van Stuut en Bruin.
  • Atmel AVR320: Software SPI Master
    Atmel AVR151: Setup And Use of The SPI
    AVR Beginners: The Serial Peripheral Interface (SPI)
    Atmel AVR303: SPI-UART Gateway


    $val ){ $$key = stripslashes( $val ); } $jaar = substr($changeddate,0,4); $maand = substr($changeddate,5,2); $dag = substr($changeddate,8,2); $lastupdate = ("$jaar $maand $dag"); $prtsrttxt = get_txt($con1, 26, 1, $idsrtodd); $jaar = substr($createddate,0,4); $maand = substr($createddate,5,2); $dag = substr($createddate,8,2); $create_stamp = ("$dag $maand $jaar"); //GENERAL INFO FOR EVERY USER ************************************************** echo ("

    "); echo (""); if ($codetext) { //Code like KY-026 or NA-41 echo (""); } //End of if ($codetext) $tmp = get_txt($con1, 9, $koekje[2], 3741); //Fieldname at screen if ($prijseurinclbtw > 0){ //Show price indication $prijs_formatted = number_format($prijseurinclbtw / 100, 2, ',', '.'); echo (""); echo (""); } //End of if ($prijseurinclbtw > 0) if ($sketchtext) { //Link to OWN SOFTWARE $tmp = get_txt($con1, 9, $koekje[2], 3738); //Fieldname at screen echo (""); } //End of if ($sketchtext) $tmp = get_txt($con1, 9, $koekje[2], 3744); //Fieldname at screen if ($pinouttext) { //Pinout echo (""); } $tmp = get_txt($con1, 9, 1, 3735); //Fieldname at screen $tmp2 = get_txt($con1, 26, 1, $row4[16]); //Group name in its language echo (""); if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates $tmp = get_txt($con1, 9, $koekje[2], 3918); //Fieldname at screen LANGUAGE if ($row4[26] == 1) {$imgname = "nederland.png";} if ($row4[26] == 2) {$imgname = "deutschland.png";} if ($row4[26] == 3) {$imgname = "uk.png";} if ($row4[26] == 4) {$imgname = "france.png";} echo (""); $tmp = get_txt($con1, 9, $row4[27], 3919); //Fieldname at screen $statuskey = get_status_key($con1, $status); $tmp2 = get_txt($con1, 61, $koekje[2], $statuskey); //Fieldname at screen echo (""); } $tmp = get_txt($con1, 9, 1, 3966); //Fieldname at screen echo (""); echo ("
    "); //Header $tmp = get_txt($con1, 9, $koekje[2], 3923); //Fieldname at screen if ($koekje[3]=="1") { //If this user wants to translate then echo ("$tmp"); //If desired }else{ echo ("$tmp"); } //Else just show if no need to translate if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates echo (" (edit)"); } echo ("Algemene informatie test
    "); $tmp = get_txt($con1, 9, $koekje[2], 3739); //Fieldname at screen if ($koekje[3]=="1") { //If this user wants to translate then echo ("$tmp"); //Class for colour }else{ //So you are not allowed to translate echo $tmp; //Show screenname of this field in user language } //End of If you want to translate this fieldname at screen echo (" "); if ($codelink) { echo ("$codetext"); }else{ echo ("$codetext"); } //End of if ($pinoutlink) echo ("
    $tmp  "); if ($urlprijs){ echo ("€  $prijs_formatted"); }else{ echo ("€  $prijs_formatted"); } //End of if ($urlprijs > "") echo ("
    $tmp  "); if ($sketchlink) { echo ("$sketchtext"); }else{ echo ("$sketchtext"); } //End of if ($sketchlink) echo ("
    $tmp  "); if ($pinoutlink) { echo ("$pinouttext"); }else{ echo ("$pinouttext"); } //End of if ($pinoutlink) echo ("
    $tmp  "); //MENU GROUP echo (""); echo ("$tmp2
    $tmp"); echo ("flag.gif"); echo ("
    $tmp  "); //STATUS echo ("$status $tmp2
    $tmp  "); //LAST CHANGED $tmp = substr($changeddate, 0, 10); echo ("$tmp

    "); return; //////////////////////////////////////////////////////////////////////////////// function get_status_key($con, $num){ $qry = ("SELECT id FROM status WHERE nr = $num ;"); $result = pg_query($con, $qry); $row = pg_fetch_array($result); return ("$row[0]"); } 0 AND software.rstid = 2 AND tblsystext.lanid = $koekje[2] AND tblsystext.txlid = 19 ORDER BY sftname ASC , controller ASC ;"); $result = pg_query($con1, $qry2); if (pg_num_rows($result)>0) { //Only if at least 1 program exists echo ('

    '); echo (""); while($col = pg_fetch_array($result)){ $col[0] = ("$col[0]"); echo (""); echo (""); echo (""); if ($koekje[0] > 0 and $koekje[3]>0){ //User is logged in and translates echo (""); } echo (''); } echo ('
    "); //Header $tmp = get_txt($con1, 9, $koekje[2], 3922); //Fieldname at screen if ($koekje[3]=="1") { //If this user wants to translate then echo ("$tmp"); //If desired }else{ echo ("$tmp"); } //Else just show if no need to translate echo ("
    $col[2]  $col[0]"); echo ("(Edit)
    '); } ?> 0){ if ($header == 0) { echo ("

    "); echo (""); $header++; } //End of if ($header == 0) echo (""); echo (""); } } if ($header > 0){ echo ("
    "); //Header $tmp = get_txt($con1, 9, $koekje[2], 3879); //Fieldname at screen if ($koekje[3]=="1") { //If this user wants to translate then echo ("$tmp"); //If desired }else{ echo ("$tmp"); } //Else just show if no need to translate echo ("
    $colbpp[2]"); //Show software van deze bot $qry=("SELECT software_basedir FROM farmbotversie WHERE id = $colbpp[0];"); $result = pg_query($con1, $qry); $col = pg_fetch_array ($result ,0); $dir1 = "/var/www/html/robotigs/software/$col[0]"; $arr1 = glob($dir1, GLOB_ONLYDIR); if (isset($arr1[0])){ $folder = $arr1[0]; $countertmp = 0; echo ("
      "); foreach (scandir($folder, 1) as $filename) { if ($filename<>"." AND $filename <>".."){ if ($countertmp == 0){ $countertmp++; } //End of if ($countertmp == 0) $tmp = "/"; $dir = substr($folder, 14) ."/"; $link = $tmp .$dir .$filename; $showname = substr($filename, 0 ,-4); echo ("
    • "); echo "$showname"; echo ("
    • "); } //End of if ($filename<>"." AND $filename <>".."){ } //End of foreach (scandir($folder, 1) as $filename) echo ("
        "); } //End of if (isset($arr1[0])) echo ("
    "); } ?>
    Warning: include(/var/www/html/robotigs/includes/wishlistperpart.php): Failed to open stream: No such file or directory in /var/www/html/robotigs/includes/parts_header.php on line 128

    Warning: include(): Failed opening '/var/www/html/robotigs/includes/wishlistperpart.php' for inclusion (include_path='.:/usr/share/php') in /var/www/html/robotigs/includes/parts_header.php on line 128