Nieuws:

Nu in MSM 244 REPORTAGE: De Nederlandse Modelspoordagen * A4 Dioramawedstrijd * Virtuele Messe 2024

Hoofdmenu

Waar zijn we nu mee bezig ? Microcontrollers

Gestart door ToThePoint, 13 januari 2012, 10:27:28 AM

PeterC

Raf, het is niet kwaad bedoeld hé...  :-X

5 "Goto's" zijn er nog steeds 5 teveel...  Alleen in Assembler worden die getolereerd (omdat je daar vaak niet anders kan) maar het gebruik van "Goto's" stimuleert 'spagetticode'.

Om die reden heb ik +30 jaar geleden vaarwel gezegd tegen Basic (en pas de laatste jaren - omdat ik op mijn werk niet anders kon - terug de draad daarvan opgepikt in VBA - maar wel zonder 'Goto's"  ;) ).

Groetjes, Peter


PeterC

Citeer
In de jaren 70 kwam men tot het inzicht dat de spronginstructie een slechte invloed had op de leesbaarheid van het programma, waardoor het programma lastig te onderhouden was. Bovendien bleek dat de instructie overbodig was: elk probleem kon ook worden opgelost zonder GOTO te gebruiken. In plaats daarvan gebruikte men de iteratie met statements als FOR, DO EN WHILE. De oplossingen werden steeds meer gevonden in het gestructureerd programmeren. Iteraties en keuzestructuren met bijbehorende statements verdreven GOTO uit de gestructureerde programma's. In programmeercursussen werd GOTO niet onderwezen (hoewel de gebruikte taal het statement nog wel kende) en in de meeste nieuwe programmeertalen is het statement GOTO zelfs niet meer beschikbaar.
Groetjes, Peter


raf

ik heb de proton compiler aan gekocht (200 euro)dus dat is het programma waar ik mee werk omdat ik met de kennis van basic met dat programma voldoende overweg kon om iets bruikbaars te maken
het programma is NIET het probleem want als ik het omzet naar de 16F628 dan werkt het programma perfect
met de 5 goto's werkt het dus wel maar als ik het omzet naar de 12F629 dan werkt het opeens niet meer
ik wil de 12F gebruiken omdat die minder pootjes heeft en ik zodoende kleiner en eenvoudigere printjes kan maken
ik heb er een stuk of 50 nodig om in de twee schaduw stations te gaan werken
ik kan natuurlijk alles in een grote picro ship proppen maar dan ??? is het haast onmogelijk om nog fouten op te sporen en dan word gij gek en moet ik je komen bezoeken in bilzen of geel en daar heb ik geen tijd voor dus je gaat daar zitten te verkommeren LOL

het kan zijn dat het een software probleem is in het simulatie programma (real pic simulator ook aan gekocht)maar als ik het dan in de 50 pic's programmeer en het is echt een fout zit ik met een groter probleem

gr raf
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

raf

tja peter ik ben nog met een Z80 begonnen in machine taal (niet de zx81 Hé )die is daarna gekomen
en echt daar was in die tijd de goto instructie in basic nog zeker wel in gebruik
goto en gosub werd daar volop gebruikt in de cursussen
while wend werd ook gebruikt maar dat was het dan wel zowat
want until en end if was toen nog geen instructie die je kon gebruiken
eens kijken of ik het programma kan aanpassen zonder de goto's
dus ik kom der op terug

gr raf
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

PeterC

Citaat van: raf op 22 december 2014, 13:06:32 PM
...maar als ik het dan in de 50 pic's programmeer en het is echt een fout zit ik met een groter probleem...

Vandaar dat ik zo benadruk om te structureren!  Zo voorkom je op voorhand problemen.
Groetjes, Peter


PeterC

Citaat van: raf op 22 december 2014, 13:10:11 PM
eens kijken of ik het programma kan aanpassen zonder de goto's
dus ik kom der op terug

Doen!  En je gaat versteld staan hoe duidelijk het dan wordt  8)
Groetjes, Peter


conducteur

Inderdaad, Peter... Ik zie daar ergens iets wat volgens mij een for-loop moet voorstellen, maar zie eigenlijk niet waar die gedaan is...
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

raf

zo her geprogrammeerd en hopelijk nu beter
er zit maar 1 goto in en dat weet ik dus niet op te lossen

'****************************************************************
'*  Name    : kleine epw micro.BAS                              *
'*  Author  : [raf janssens]                                    *
'*                                                              *
'*  Date    : 22-12-2014                                         *
'*  Version : 1.4                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device 12F629               ; processor type 12F628

Xtal 4                     

Config INTRC_OSC_NOCLKOUT,_  ; Interne oscilator aan
       WDT_OFF,_             ; WatchDog Timer uit
       PWRTE_ON,_            ; Power-up Timer Enable aan
       MCLRE_ON,_            ; Externe Master Reset Enable aan
       BODEN_OFF,_           ; Brown Out Detectie Enable uit
     
       CP_ON                 ; Code Protection aan

All_Digital TRUE             ; Alle poorten digitaal

Symbol sw1  = GPIO.2      ; ingang van vorige pic
Symbol sw2  = GPIO.3       ; detect inloop spoor
Symbol sw3 =   GPIO.4          ;detect stop spoor
Symbol poort2 = GPIO.0       ;uitgang naar volgende pic
Symbol poort1 = GPIO.1        ;uitgang pwm

Dim waarde  As Word          ; Variabele waarde pwm
Dim test As Byte
Clear                        ; Wis alle ram geheugen
GPIO.1 = 0                  ;pwmlaag maken (invers pwm)
DelayMS 500                  ; Stabilisering 0.5_sec

             

         ;543210            ; Hulpregel Poort poort_A
  GPIO = %000000            ; Zet poort_A laag
TRISIO = %111100          ; Poort_A als ingang
test = 0

start:
While sw1 = 1 :Wend;als voorliggende vrij is doe dan niks
  For waarde = 0 To 255
        DelayMS 5
        While sw3 = 1 :Wend
        If waarde > 250 Then waarde = 255

        PWM GPIO.1, waarde, 1      ;Stuur 5 pulsen met pulsbreedte 'Duty', naar PORTA.1
   
    Next
        PWM GPIO.1,255 ,1   ;trein op het inloopspoor poort uitgang hoog maken
        While sw2 = 1 And sw3 = 1 :Wend
        poort2 = 1                 ;trein op het inloopspoor poort uitgang hoog maken
        While sw3 = 1 :Wend     ;    zolang er geen trein is op het inloopspoor poort uit laag houden
  While sw1 = 0  :Wend     ;als voorliggende vrij is ga dan rijden
   For waarde = 255 To 0    Step - 2
       DelayMS  20
       If waarde < 5 Then waarde = 0
       PWM GPIO.1, waarde, 1 
     Next 
    PWM GPIO.1,0 ,1
                 
         While sw2 = 0 :Wend
         While sw3 = 0 :Wend   ;zolang stop en inloop bezet is uitgang hoog houden
         
       poort2 = 0                       ;stop en inloop leeg dan poort uitgang laag maken
      GoTo start

nu werkt het programma wel dus ?????
er is principieel niets veranderd buiten dat ik de goto heb weg gelaten en de vertrek detectie heb opgeschoven tussen de twee programma delen in (zie bold text)
als er iemand weet hoe ik die laatste goto weg kan halen dan hoor ik het graag

gr raf 
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

dani

#683
ik kan in de verste verte niet op tegen de tovenaars hier op het forum met hun projecten....

Maar gisteren heb ik me even bezig gehouden met een simpel iets : een "spanningsbewaker" voor de verschillende voedingen voor rond de treinbaan.

1 stuk 20 V
2 stuks 5V
3 stuks 12V

Deze worden in een (kleine)  PC behuizing ingebouwd en ik wil zien  of de spanningen OK zijn.

Elke voeding krijgt 2 LEDs  (1 gele, 1 rode) en daarmee kan ik 4 toestanden aflezen  (soort van binaire code)

0-0  =   NUL , geen spanning
1-0  =  Te weinig   (bvb  3,7V ipv 5V)
1-1  =  OK  (binnen tolerantie van ingestelde spanning bvb + / - 1 Volt,  tolerantie ook apart inte stellen)
0-1  = Te hoog   (overspanning  bvb  15V ipv 12V)

En dan nog een "controle LED" die nagaat of het geheel spanning heeft en eentje die aangeeft dat de monitor (Arduino printnje) werkt.


Ik zal foto's posten als het klaar is.  Printje is OK, software is OK, nu nog inbouwen.


Aangezien de ingang van de Arduino max 5V gelijkstroom kan hebben,  gebruik ik simpele spanningsdelers van  4x10K Ohm (en afgetakt over 1 van die 4), zodat de spanning aan de ingang tot 20V kan oplopen zonder schade aan de inputs.  Het   "map"  commando in de software laat dan toe  om makkelijk te bepalen wat de eignelijke spanning is.

0-5 V =  1024  waarden

dus met de "doel" spanning in  EEPROM, lees ik die uit bij het starten,  en map ik dan naar 5V.

vb :   map(0,1024,0,20)   geeft een "resolutie" van  ongeveer 50 stapjes per Volt op de max 20 V ingang.

De kruik is te water gegaan...
De kruik is niet meer.

raf

de goto's zijn weg en nu proberen ze weg te houden LOL

tja eens zo geleerd zit het hardnekkig ingebrand en moeilijk om het weg te krijgen

hier het aan gepaste programma en het werkt in simulatie ook nog

'****************************************************************
'*  Name    : kleine epw micro.BAS                              *
'*  Author  : [raf janssens]                                    *
'*                                                              *
'*  Date    : 22-12-2014                                         *
'*  Version : 1.4                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device 12F629               ; processor type 12F628

Xtal 4                     

Config INTRC_OSC_NOCLKOUT,_  ; Interne oscilator aan
       WDT_OFF,_             ; WatchDog Timer uit
       PWRTE_ON,_            ; Power-up Timer Enable aan
       MCLRE_ON,_            ; Externe Master Reset Enable aan
       BODEN_OFF,_           ; Brown Out Detectie Enable uit
     
       CP_ON                 ; Code Protection aan

All_Digital TRUE             ; Alle poorten digitaal

Symbol sw1  = GPIO.2      ; ingang van vorige pic
Symbol sw2  = GPIO.3       ; detect inloop spoor
Symbol sw3 =   GPIO.4          ;detect stop spoor
Symbol poort2 = GPIO.0       ;uitgang naar volgende pic
Symbol poort1 = GPIO.1        ;uitgang pwm

Dim waarde  As Word          ; Variabele waarde pwm
Dim test As Byte
Clear                        ; Wis alle ram geheugen
GPIO.1 = 0                  ;pwmlaag maken (invers pwm)
DelayMS 500                  ; Stabilisering 0.5_sec

             

         ;543210            ; Hulpregel Poort poort_A
  GPIO = %000000            ; Zet poort_A laag
TRISIO = %111100          ; Poort_A als ingang
test = 0

start:
While 1=1
While sw1 = 1 :Wend       ;als het vorige sein groen is doe dan niets
  For waarde = 0 To 255
        DelayMS 5
        While sw3 = 1 :Wend
        If waarde > 250 Then waarde = 255

        PWM GPIO.1, waarde, 1      ;Stuur 5 pulsen met pulsbreedte 'Duty', naar PORTA.1
   
    Next
        PWM GPIO.1,255 ,1
                       ;trein op het inloopspoor poort uitgang hoog maken
        While sw2 = 1 And sw3 = 1 :Wend
        poort2 = 1                 ;trein op het inloopspoor poort uitgang hoog maken
        While sw3 = 1 :Wend     ;    zolang er geen trein is op het inloopspoor poort uit laag houden
  While sw1 = 0  :Wend           ;als vorige sein rood is doe dan niets
   For waarde = 255 To 0    Step - 2
       DelayMS  20
       If waarde < 5 Then waarde = 0
       PWM GPIO.1, waarde, 1 
     Next 
    PWM GPIO.1,0 ,1
                 
         While sw2 = 0 :Wend
         While sw3 = 0 :Wend   ;zolang stop en inloop bezet is uitgang hoog houden
         
       poort2 = 0                       ;stop en inloop leeg dan poort uitgang laag maken
       Wend
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

Gerolf

#685
ik ben niet thuis in PICs, maar wat werkt er precies niet?
Stomme vraag misschien, maar krijg je die andere µC geprogrammeerd?

Citaat van: raf op 22 december 2014, 13:50:11 PM
    PWM GPIO.1,0 ,1
                 
         While sw2 = 0 :Wend
         While sw3 = 0 :Wend   ;zolang stop en inloop bezet is uitgang hoog houden

Volgens mij blokkeer je het programma met die 2 "while ... wend". Of is dat de bedoeling?
Groeten uit "Marche-en-Bières"   ** Modelspoor is plezant **   TPIII-H0-DC-Zelfbouw

raf

hoi gerolf

nee en ja
ik blokkeer daar inderdaad het verloop van het programma maar dit is de controle dat zowel het inloop spoor als het stopspoor leeg is om daarna het achterliggende signaal op groen te kunnen zetten
als er bv een wagon los komt dan kan nooit het achterliggende signaal groen worden want de bezet melding blijft open
daar ik volledige controle op de sporen heb is dit overal zo in de signalen in geprogrammeerd.
nergens kan er dus een wagon loos blijven staan op de baan want dan valt alles gewoonweg stil
ik detecteer de twee want stel dat er een railbusje rijd wat maar alleen het stop spoor dekt dan is sw3 reeds vrij gegeven maar sw2 blijft bezet tot de bus van dit stukje rail afgereden is
hopelijk verstaan bare uitleg



If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

conducteur

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

PeterC

Citaat van: conducteur op 22 december 2014, 17:23:29 PM
http://www.pctoytoy.be/2014/20140406_1.jpg
Peter, hoe heb je dat menu geïmplementeerd in de code?
Dat was een aanzet tot een soort van universele menu voor de PIC18 serie.  Staat wel nog niet op poten, maar ik heb het volledige project in je mailbox gedumpt  :)
Groetjes, Peter


conducteur

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