Nieuws:

Nu in MSM 249 TEST: KATO NMBS 5405 in spoor N

Hoofdmenu

G.I.P: automatisch schaduwstation zonder wissels

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

dani

maar nee, ik voel me zeker niet aangevallen  Rian, en je hoeft je niet te excuseren.  Ik ben gewoon van mening dat "getikte tekst" vaak anders geïnterpreteerd wordt dan wat er eigenlijk staat, en dat is niet alleen hier of bij jou, dat is een algemeen gegeven  Daarom dat ik zeg "zal aan mij liggen".   

Doe rustig verder met je werk, ik volg het op de voet en ben benieuwd wat het resultaat gaat zijn .
De kruik is te water gegaan...
De kruik is niet meer.

conducteur

Eerst die poortB oplossen, niet moeilijk dat die raar doet--> ze inlezen geeft '255' terwijl het 0 zou moeten zijn...

switch (PORTB)                            //Zoek welke knop ingedrukt was:
         {
     
         case(1):      eindpositie=200;    break;        //ga naar 1000 stappen tov referentie
     
      case(2):      eindpositie=400;      break;            //ga naar 2000 stappen tov referentie
     
      case(4):      eindpositie=600;      break;            //ga naar 3000 stappen tov referentie
     
      case(:      eindpositie=800;      break;             //....
     
      case(16):   eindpositie=1000;   break;         //...
     
      case(32):   eindpositie=1200;   break;       
     
      case(64):   eindpositie=1400;   break;       
     
      case(128):   eindpositie=1600;   break;        //ga naar 8000 stappen tov referentie 
     
      default:      eindpositie=positie;              //huidige positie=te bereiken positie --> geen verplaatsing
      }
     
     

en gezien er nergens 255 in de switch staat uit enkele programma's geleden... gebeurt er niets.
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

Sattrickske

Citaat van: conducteur op 31 oktober 2013, 13:21:48 PM
p30: http://ww1.microchip.com/downloads/en/devicedoc/41291f.pdf


dat register moet dus op 128 staan (0x80;) Nu nog het commando vinden :D
Op deze manier moet het lukken:

OPTION_REGbits.nRBPU = 1;

Dit zou de pullups van PORTB moeten activeren.  Ik ken je schema niet, maar ik denk dat je verkeerd redeneert (tenminste als je schakelaars verbonden met de massa en pullups gebruikt).  Als alle schakelaars open staan zal je overal 1 zien, deze die dicht zijn gaan 0 geven.

In jouw geval meen ik te lezen dat je schakelaar via een weerstand aan de massa hangt, maar waar hangt de andere kant van je schakelaar?  Aan de voeding? Of direct aan je µC?  In ieder geval mag je nooit de interne pullup gebruiken als je al een externe pulldown hebt (wat ik denk), want dan krijg je een spanningsdeler en ga je met veel pech nooit het correcte niveau halen om een 0 of een 1 te krijgen.

Kan je je schema eens posten?  Dan kan ik zien wat je moet doen met de interne pullups en evt. je code wat bijsturen...

conducteur


Ik hoop dat er zo geen verwarring meer kan zijn:

De pullup moet toch op disable staan?
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

Sattrickske

Inderdaad de pullup moet disabled zijn, dus wel degelijk:

OPTION_REGbits.nRBPU = 1;

Je redenering in je code is dus wel degelijk correct.  Maar je case bevat wel een foutje voor waarde 8 en je schrijft de case best zonder haakjes, ik had het zo gedefinieerd:

switch (PORTB) { //Zoek welke knop ingedrukt was:
case 0x01:
eindpositie=200;
break;        //ga naar 1000 stappen tov referentie
case 0x02:
eindpositie=400;
break;            //ga naar 2000 stappen tov referentie
case 0x04:
eindpositie=600;
break;            //ga naar 3000 stappen tov referentie
case 0x08:
eindpositie=800;
break;             //....
case 0x10:
eindpositie=1000;
break;         //...
case 0x20:
eindpositie=1200;
break;       
case 0x40:
eindpositie=1400;
break;       
case 0x80:
eindpositie=1600;
break;        //ga naar 8000 stappen tov referentie 
default:
eindpositie=positie;              //huidige positie=te bereiken positie --> geen verplaatsing
}


Of met wat meer geavanceerde C-code, alle waarden in een constante array stoppen en de dan bit waarde van PORTB berekenen via een for loop en een right shift.  Deze 'bit' dan gebruiken om de gewenste waarde uit de array te halen.  Zou minder code moeten opleveren, maar jouw methode is ook goed.

conducteur

Ik hou het voorlopig wel op een niveau dat ik zelf begrijp, maar ik begrijp niet waarom dit het al een ganse week niet doet?


[font=Verdana][size=9px][[/size][/font]code]
#include <htc.h>
// Config: HS ext Xtal- Watchdogtimer disabled - LVP Disabled
__CONFIG(FOSC_HS & WDTE_OFF & LVP_OFF);
#define _XTAL_FREQ  20000000






void main()
{
    OPTION_REGbits.nRBPU = 1;
    ANSEL = 0;
    ANSELH = 0;
   
    unsigned char richting;
    unsigned int positie;
    unsigned int eindpositie;




    TRISC = 0x00;


    while (1) {


   PORTC = 0x30;                  //twee vrije I/0 op c poort --> debug ledjes moeten knipperen als motor niet draait.
   __delay_ms(250);
   PORTC = 0x00;
   
   TRISB = 0xff;                  //port B drukknoppen input                                                             
   switch (PORTB) {               //Zoek welke knop ingedrukt was:
   case 0x01:
       eindpositie = 200;
       break;                     //ga naar 1000 stappen tov referentie
   case 0x02:
       eindpositie = 400;
       break;                     //ga naar 2000 stappen tov referentie
   case 0x04:
       eindpositie = 600;
       break;                     //ga naar 3000 stappen tov referentie
   case 0x08:
       eindpositie = 800;
       break;                     //....
   case 0x10:
       eindpositie = 1000;
       break;                     //...
   case 0x20:
       eindpositie = 1200;
       break;
   case 0x40:
       eindpositie = 1400;
       break;
   case 0x80:
       eindpositie = 1600;
       break;                     //ga naar 8000 stappen tov referentie 
   default:
       eindpositie = positie;            //huidige positie=te bereiken positie --> geen verplaatsing
   }






   if (eindpositie != positie)            //indien geen verplaatsing, onderstaande niet doorlopen
   {


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


       }


       else {
      richting = +1;               //positie moet optellen
      PORTC &= ~0x02;            //C2=0


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


          __delay_us(1250);
          PORTC |= 0X01;
          __delay_us(1250);            //400hz max frequentie motor
          PORTC &= ~0X01;
          positie = positie + richting;   //zet een stap en hou de huidige positie bij.
      }


       }


   }
    }
}

Normaal gezien, als ik geen knoppen induw doorloopt hij het ganse onderste deel niet, en zouden de debugledjes die ik toegevoegd heb aan de µC moeten knipperen... Die gaan aan, maar knipperen niet. Als de motor begint te draaien zouden die moeten uitgaan, echter ziet het er naar uit dat de boel niet reageert op de knoppen... De ledjes gaan niet uit, en de motor begint niet te draaien na indrukken van een knop?

Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

Sattrickske

Je code ziet er mij correct uit (heb niet alles gecontroleerd) en je ledjes zouden normaliter moeten knipperen. MAAR... Heb je de /MCLR (reset) pin wel correct aangesloten of geconfigureerd?  Want ik heb de indruk dat je schakeling permanent in reset gaat door een verkeerd gebruik van dit pinnetje...

De /MCLR dien je in normale mode aan de voeding te hangen (in programmeermode natuurlijk niet).  Of je can ook in de __CONFIG de /MCLR uitschakelen:

__CONFIG(FOSC_HS & WDTE_OFF & LVP_OFF & MCLRE_OFF)

Deze laatste disabled de /MCLR zodat je deze als gewone I/O kan gebruiken, je hoeft dan niks aan dat pinnetje te hangen.

Opmerking: om je /MCLR pin aan de Vdd te krijgen kan je een jumperke over de Vdd en de Vpp pinnetjes van de ISP connector plaatsen.

conducteur

#307
Die hangt met een 10K weerstandje aan 5V, en met een draadje naar de header voor de programmer.
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

Sattrickske

OK, dan gaan we je code stap voor stap nakijken...
Probeer eens alles in je while loop te verwijderen en laat enkel je leds knipperen.  We zullen ze deze maal veel trager laten knipperen want ik denk dat je code na PORTC = 0x00 te snel is en je daardoor zie de knippering niet.  Als dit werkt, weten we dat  je hardware en je software + configuratie op dat vlak al min of meer ok is:

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

void main()
{
    OPTION_REGbits.nRBPU = 1;
    ANSEL = 0;
    ANSELH = 0;
    TRISC = 0x00;

    while (1) {
PORTC = 0x30;                  //twee vrije I/0 op c poort --> debug ledjes moeten knipperen als motor niet draait.
__delay_ms(500);
PORTC = 0x00;
__delay_ms(500);
    }
}

conducteur

Inderdaad, de delay na het uitzetten van de ledjes was ik vergeten. Dat gaat al...
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

Sattrickske

Dan kunnen we een stapje verder.  We gaan eens kijken of je één van de schakelaars kan inlezen en daarmee één van de ledjes aan en uit zetten.  Het andere ledje laten we continu knipperen.

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

void main()
{
    OPTION_REGbits.nRBPU = 1;
    ANSEL = 0;
    ANSELH = 0;
    TRISC = 0x00;
    TRISB = 0xff;                  //port B drukknoppen input       

    while (1) {
PORTC ^= 1 << 5; // Toggle 5e bit van PORTC (0x10)
__delay_ms(500);

switch (PORTB) {               //Zoek welke knop ingedrukt was:
case 0x01:
PORTC ^= 1 << 6; // Toggle 6e bit van PORTC (0x20)
break;             
default:
}
}

Dit zou één ledje (PORTC 5e bit) moeten laten knipperen; en telkens je op de eerste schakelaar drukt, het 2e ledje (PORTC 6e bit) omzetten (aan/uit).

conducteur

Het werkte min of meer --> de while lus mistte een } en de ledjes zitten op c4 en c5 (niet op c6), maar dat was geen probleem om dat aan te passen.


zo dus:



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


void main()
{
    OPTION_REGbits.nRBPU = 1;
    ANSEL = 0;
    ANSELH = 0;
    TRISC = 0x00;
    TRISB = 0xff;                  //port B drukknoppen input       


    while (1) {
PORTC ^= 1 << 4; // Toggle 5e bit van PORTC (0x10)
__delay_ms(500);


switch (PORTB) {               //Zoek welke knop ingedrukt was:
case 0x01:
PORTC ^= 1 << 5; // Toggle 6e bit van PORTC (0x20)
break;             
default: 0 ;
}
}
}
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

Sattrickske

Inderdaad, heb de code niet getest.  Dus nu weet je dat je schakeling in orde is en dat je inputs werken (althans één ervan).  De volgende stap wordt dus de rest van de inputs nakijken en je uitgangen naar de (stappen)motor testen.  Hoe is je motor trouwens aangesloten?  Heb je daar een schema van?  Je bent er bijna...

Wel meteen een opmerking: de huidige code kan wel voor problemen zorgen.  We hebben een ledje dat aan en uit knippert met telkens een interval van 0.5 seconden.  In diezelfde loop (while lus) ga je ook je inputs lezen en je uitgangen sturen.  Vroeg of laat zorgt dat voor problemen omdat je veel tijd verbruikt waarbij je je input niet kan lezen (bv. 500ms delay); dus als er input 2x wijzigt (aan/uit bv) gedurende dit interval, gaat je software dit niet zien.  Let daar dus goed op.
Je kan je inputs bv. interrupt driven maken (zitten gelukkig op PORTB waar je een interrupt on change hebt); op deze manier zal je geen inputwijzigingen missen

conducteur

Ik doe straks verder, eerst zien dat m'n voorbereiding voor in de treinclub deze avond af is, bijna...
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

Havoc

Het enige dat ik zie is dat er eventueel iets mis is met het inlezen van je schakelaars. Je gaat er immers van uit dat er maar 1 bit tegelijk hoog kan zijn, anders doe je niets. Vermits je nooit iets doet, zou het wel eens kunnen dat er bvb door een kortsluiting steeds de default wordt aangeroepen. Je zou de input van poort B eens naar een andere poort moeten kunnen outputten. Andere mogelijkheid is dat je bvb in de default sectie 1 led eens laat knipperen, dan weet je tenminste dat hij in de default komt en kan je zien of hij er niet inkomt als je op een knop drukt.
Met vakantie voor onbepaalde duur.