G.I.P: automatisch schaduwstation zonder wissels

Gestart door conducteur, 09 mei 2012, 21:33:26 PM

Geert

Basis uitleg, en C code in volgende LINK. (ook gratis!)

De HI-TECH C is wel vervangen door zijn opvolger XC8 .

Geert
Schaal H0 - digitaal zelfbouw - Favoriete Lok: V200 DB

conducteur

#256
Voorlopig doe ik het op een wellicht iets minder katholieke manier, op een methode die ik zelf volledig begrijp en zelf weet hoe ik het moet schrijven:

#include <htc.h>
   // Config: HS ext Xtal- Watchdogtimer disabled - LVP Disabled
__CONFIG(FOSC_HS & WDTE_OFF & LVP_OFF);
#define _XTAL_FREQ  20000000


void main()
{


    unsigned char richting;
    unsigned int positie;
    unsigned int eindpositie;
    int verplaatsing;


 
    verplaatsing = eindpositie - positie;


    if (verplaatsing < 0) {
   richting = -1;

    }


    else {
   richting = 1;

    }


    while (eindpositie != positie) {
   TRISC = 0x00;
   __delay_us(1250);
   PORTC = 0XFF;
   __delay_us(1250);
   PORTC = 0X00;
   positie = positie + richting;
    }
    while (1) {
    }
}


Het is nog niet helemaal wat ik wil voor de test, morgen doen we verder (hopelijk).
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

conducteur

#257
In afwachting dat ik de timers & interrupts meester ben, een testprogramma geschreven (elk testprogramma bewaar ik zodat het eindprogramma gedeeltelijk knip en plakwerk wordt) maar het gedraagt zich erg gek:


   #include <htc.h>
   // Config: HS ext Xtal- Watchdogtimer disabled - LVP Disabled
   __CONFIG(FOSC_HS & WDTE_OFF  & LVP_OFF);
   #define _XTAL_FREQ  20000000     
   
void main()
   
{
   
unsigned   char richting;
unsigned int positie;
   unsigned int eindpositie;
      int verplaatsing;
     
     
      while(1){
         
   TRISB=0xff;
      switch (PORTB)
         {
     
         case(1):      eindpositie=1000;    break;     
     
      case(2):      eindpositie=2000;   break;       
     
      case(4):      eindpositie=3000;   break;       
     
      case(:      eindpositie=4000;   break;       
     
      case(16):   eindpositie=5000;   break;       
     
      case(32):   eindpositie=6000;   break;       
     
      case(64):   eindpositie=7000;   break;       
     
      case(128):   eindpositie=8000;   break;       
     
      default:      eindpositie=positie;     
      }
     
     
      verplaatsing=eindpositie-positie;
     
      if(verplaatsing>0){
   TRISC=0xfC;
   
   if(verplaatsing<0)
   {
      richting=-1;
      PORTC|=0x02;   //c2=1
   
   }
   
   else
      {
         richting=1;
         PORTC &=0xFD;  //C2=0
   
      }
   
   while(eindpositie!=positie)
      {
         
         __delay_us(1250);
         PORTC=0XFF;
         __delay_us(1250);
         PORTC=0X00;
         positie=positie+richting;
      }}
      }}

De motor zou moeten een paar toeren draaien afhankelijk van welke knop ingedrukt was, maar voorlopig draait hij enkel vrolijk rondjes in een richting zonder dat je dat wil (draait niet soepel en maakt een hoop herrie) en als je ergens een metalen deel aanraakt stopt het (koelvinnen van voeding en l6208, motor zelf en gelaserde steun)
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

Geert

de laatste zinnetjes moet je wel iets meer verduidelijken. Ik kan even niet volgen.

En is dit geschreven voor een 16F887 PIC µC?

Geert
Schaal H0 - digitaal zelfbouw - Favoriete Lok: V200 DB

conducteur

#259


   #include <htc.h>
   // Config: HS ext Xtal- Watchdogtimer disabled - LVP Disabled
__CONFIG(FOSC_HS & WDTE_OFF & LVP_OFF);
#define _XTAL_FREQ  20000000


void main()
{


    char richting;
    unsigned int positie;
    unsigned int eindpositie;
    int verplaatsing;




    while (1) {


   TRISB = 0xff;
   switch (PORTB)      //Zoek welke knop ingedrukt was:
   {


   case (1):
       eindpositie = 1000;
       break;      //ga naar 1000 stappen tov referentie


   case (2):
       eindpositie = 2000;
       break;      //ga naar 2000 stappen tov referentie


   case (4):
       eindpositie = 3000;
       break;      //ga naar 3000 stappen tov referentie


   case (:
       eindpositie = 4000;
       break;      //....


   case (16):
       eindpositie = 5000;
       break;      //...


   case (32):
       eindpositie = 6000;
       break;


   case (64):
       eindpositie = 7000;
       break;


   case (128):
       eindpositie = 8000;
       break;      //ga naar 8000 stappen tov referentie 


   default:
       eindpositie = positie;   //huidige positie=te bereiken positie --> geen verplaatsing
   }




   verplaatsing = eindpositie - positie;   //bereken aantal te verplaatsen stappen
   __delay_ms(500);
   TRISC = 0xfC;      //enkel C0 en C1 zijn output
   if (verplaatsing != 0)   //indien geen verplaatsing, onderstaande niet doorlopen
   {




       if (verplaatsing < 0) {
      richting = -1;   //positie moet 'aftellen'
      PORTC |= 0x02;   //c2=1 --> bepaalt draaizin motor


       }


       else {
      richting = 1;   //positie moet optellen
      PORTC &= 0xFD;   //C2=0


       }


       while (eindpositie != positie)   //zet een boel stapjes zolang de eindpositie niet is bereikt.
       {


      __delay_us(1250);
      PORTC = 0XFF;
      __delay_us(1250);
      PORTC = 0X00;
      positie = positie + richting;
       }
   }
    }
}


Ja, 16f887, dat staat ergens in de settings van dit 'project' in MPLab
EDIT: bovenstaande versie is al een licht verbeterde versie van dat in de vorige post (het stuk die de motor aanstuurt wordt nu enkel doorlopen indien er effectief een verplaatsing is.
Unsigned char richting --> daar kan onmogelijk -1 in staan. Dus nu Char Richting;. en dan...


EUREKA! de motor draait niet meer gelijk zotten, maar enkel als je op knop 7 of 8 duwt en enkel in één richting. Duwen op een van beide knoppen doet het programma precies in het honderd lopen (motor blijft voor lange tijd draaien en stopt plots) (heb nu het aantal stappen verlaagt naar 200 per 'spoor' als test. (200 pulsen = 1 toer)...

Toch een kleine vooruitgang!
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

conducteur

#260
Edit: kan het zijn dat ik die interne pull-up weerstanden moet uitschakelen voor portB? Ik gebruik NO knopjes met hun eigen 10K weerstandje (5v---knop--ingang pic -weerstandje naar massa) of zit er een foutje in het staptelsysteem waar ik al heel de tijd over kijk?
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

conducteur

Nog steeds de insecten in mijn systeem aan het zoeken.
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

Geert

case ( 8 )    klopt al niet!  8 staat er niet bij

probeer dit al is aan te passen.

Geert
Schaal H0 - digitaal zelfbouw - Favoriete Lok: V200 DB

Geert

#263
In assembler moet ik bij een PIC 16F887 de analoge ingangen uitschakelen, anders doen de B ingangen raar!

Zo moet dat in assembler:

banksel ANSEL
CLRF ANSEL      ;Geen analoge ingangen
CLRF ANSELH

Ik weet niet dat dit ook in C moet

EDIT: ik heb net gemerkt dat je ook op een ander draadje hierover vragen steld. Wel zeer verwarend zo  :-\   Daaruit kan ik afleiden dat je schakeling wel werkt op poort B6 en B7 (64 en 128 volgens jou programma). Nu zijn het net deze twee ingangen op de B poort waar geen analoge ingang op zit. De ander wel! Dus deze uitschakelen zal nodig zijn. Kan je geen assembler toevoegen in C code?


Geert
Schaal H0 - digitaal zelfbouw - Favoriete Lok: V200 DB

conducteur

Citaat van: Geert op 28 oktober 2013, 14:50:28 PM
case ( 8 )    klopt al niet!  8 staat er niet bij

probeer dit al is aan te passen.

Geert
copy paste foutje, in origineel werkt het.
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

conducteur

#265
Citaat van: Geert op 28 oktober 2013, 15:00:44 PM
In assembler moet ik bij een PIC 16F887 de analoge ingangen uitschakelen, anders doen de B ingangen raar!

Zo moet dat in assembler:

banksel ANSEL
CLRF ANSEL      ;Geen analoge ingangen
CLRF ANSELH

Ik weet niet dat dit ook in C moet

Geert
Blijkbaar is dat een vereiste... Al veel websites tegengekomen waar dat probleem zich stelt maar een duidelijke oplossing niet direct.
Char richting --> signed char richting en nu reageert de boel op alle knoppen, maar niet zoals het hoort. (het beperkt zich tot terplaatse trillen en resoneren).
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

MickeyMouse

#266
Citeer
Char richting --> signed char richting en nu reageert de boel op alle knoppen, maar niet zoals het hoort. (het beperkt zich tot terplaatse trillen en resoneren).
Allee, is een klassieker: voor chars nooit afgaan op de default, voor ints mag dit wel (steeds signed).
Waarom toggle je eigenlijk de volledige C-poort in uwen stappenlus? Je verandert dan toch ook de richting?

Geert

Havoc

Met vakantie voor onbepaalde duur.

conducteur

#268
Citaat van: MickeyMouse op 28 oktober 2013, 19:52:49 PM
Citeer
Char richting --> signed char richting en nu reageert de boel op alle knoppen, maar niet zoals het hoort. (het beperkt zich tot terplaatse trillen en resoneren).
Allee, is een klassieker: voor chars nooit afgaan op de default, voor ints mag dit wel (steeds signed).
Waarom toggle je eigenlijk de volledige C-poort in uwen stappenlus? Je verandert dan toch ook de richting?

Geert
Aha! inderdaad, foutje van de firma. Ik heb de indruk dat bij het indrukken van de knoppen de motor gelijk voortdurend links/rechts draait.


      while(eindpositie!=positie)                   //zet een boel stapjes zolang de eindpositie niet is bereikt.
         {
         
            __delay_us(1250); 
            PORTC|=0X01;
            __delay_us(1250);
            PORTC&=~0X01;
            positie=positie+richting;               //zet een stap en hou de huidige positie bij.
         }

Het is een vooruitgang op vlak van code, maar het werkt er niet beter mee
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

MickeyMouse

Citeer
Het is een vooruitgang op vlak van code, maar het werkt er niet beter mee
Ben geen PIC-specialist: zeker dat 'read-modify-write' rechtstreeks op de poort wel werkt? Bij veel controllers kun je de toestand van de poort niet uitlezen. Indien dit zo zou zijn, de bewerking steeds in een variabele doen en de inhoud daarvan dan op de poort zetten.

Geert