Stopper optokapuval

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
szivekf
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2010. május 14. péntek, 6:00

Stopper optokapuval

Hozzászólás Szerző: szivekf »

Szép napot mindenkinek!
Először köszönetet szeretnék mondani minden egyes fórumozónak. Eddig hozzászólni nem nagyon tudtam viszont nagyon sokmindent tanultam(az elmult kb fél évben végigolvastam mindent amit lehetett itt és máshol)
Elérkezett az idő (amiből mindig kevés van) hogy megírjam az első saját programom ami csinál is valami hasznosast nem csak álom.

A feladat egyszerű
Stopper optokapuval
Piroslámpa világit
Gomb megynyom majd elenged
Lámpa kialszik
időmérés indul felbontás ezredmásodperc
Optokapu áthaladás reakcióidő kiír
Optokapu áthaladás részidő kiír
Gomb mérés vége „goto start” 

Nem gondoltam hogy nagy feladat
Persze int meg timer meg arduino opto illeszt „köszönet sytex-nek ” a hardver nem az erősségem

Mivel nincs verseny vitára bocsájtanám a „művem” mert működni működik hátha csináltam benne valami elvi hibát. Időszámolás ötlet GyimesiZsolt-Ora_timer köszönet érte
És ahogy látom a timer nem minden kezdőnek tiszta tanuljon más is

Várom a hozzáértők kritikáját

Kód: Egész kijelölése

$crystal = 16000000                                         'orajel
$regfile = "m168def.dat"                                    'chip
$baud = 115200

Dim Gombintertek As Integer
Dim Szamol As Integer
Dim Optointertek As Integer
Dim Ora As Byte , Perc As Byte , Masodperc As Byte
Dim Ezred As Integer
Dim Mora As Byte , Mperc As Byte , Mmasodperc As Byte
Dim Mezred As Integer



Opto Alias Pind.3                                           'INT1
   Config Portd.3 = Input
   Portd.3 = 1
   Config Int1 = Falling                                    'H->L
   On Int1 Optoint

Gomb Alias Pind.2
   Config Gomb = Input
   Config Int0 = Falling
   On Int0 Gombint



Stopled Alias Portb.5
   Config Stopled = Output
   Reset Stopled

Athal Alias Portb.4
   Config Athal = Output
   Reset Athal


Config Timer0 = Timer , Prescale = 64
On Timer0 Mido
Disable Timer0

Enable Int0
Enable Interrupts

Tcnt0 = 6                                                   'timer0
Disable Int1

Print " program indul"
Gombintertek = 0
   Mezred = 0
   Mmasodperc = 0
   Mperc = 0
   Mora = 0



Do
   Set Stopled
   Ezred = 0
   Masodperc = 0
   Perc = 0
   Ora = 0
   Disable Int1
   Do

   Loop Until Gombintertek > 0
   Enable Timer0
   Start Timer0
   Gombintertek = 0
   Reset Stopled
   Print " starting "
   Enable Int1

   Optointertek = 0
   Szamol = -1


   Do

      If Optointertek > 0 Then
            Incr Szamol
            Toggle Athal
            'Print " Reszido " ; Szamol
            'Print Ora ; ":" ; Perc ; ":" ; Masodperc ; ":" ; Ezred
            Select Case Szamol
               Case 0
               Tcnt0 = 6
               Ezred = 0
               Masodperc = 0
               Perc = 0
               Ora = 0
               Print "Reakcioido        " ; Mora ; ":" ; Mperc ; ":" ; Mmasodperc ; ":" ; Mezred
               Mezred = 0
               Mmasodperc = 0
               Mperc = 0
               Mora = 0
               Case Else

               Print " Reszido " ; Szamol ; "  " ; Mora ; ":" ; Mperc ; ":" ; Mmasodperc ; ":" ; Mezred
            End Select

            Optointertek = 0
      End If




   Loop Until Szamol = 1000 Or Gombintertek > 0
   Szamol = 0
   Gombintertek = 0
   Disable Int1

   Print " vege az idomeresnek "
   Stop Timer0

   Set Stopled
   Disable Timer0


Loop
End

Optoint:                                                    'opto int
   If Mezred <> Ezred Or Mmasodperc <> Masodperc Or Mperc <> Perc Or Mora <> Ora Then
   Mezred = Ezred
   Mmasodperc = Masodperc
   Mperc = Perc
   Mora = Ora
   Incr Optointertek
   End If
Return

Gombint:
    Incr Gombintertek
Return


Mido:                                                       'Timer0 int
Tcnt0 = 6
   Incr Ezred
   If Ezred = 1000 Then
      Ezred = 0
      Incr Masodperc
      If Masodperc = 60 Then
         Masodperc = 0
         Incr Perc
         If Perc = 60 Then
            Perc = 0
            Incr Ora

         End If
      End If
   End If
Return
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Csak egy alaphiba:
16MHz esetén a 115.2k sorosport túl nagy hibábal megy (kb. 7%), hogy kommunikálni tudjon!


Tcnt0 = 6
olvasmányosabban:
Timer0=6
Avatar
szivekf
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2010. május 14. péntek, 6:00

Hozzászólás Szerző: szivekf »

sorosport valóban benne maradt magassaban mert számoltam az órajeleket de nem lett kevesebb magasabb baudnál se simulátorban amit arra fordit.

amiatt került bele mert a béta cod 12 ora alatt 10 másodpercet késett
kikerültek a prell miatti waitek és az if -böl lett case

nem hibázott a sorosporton és most 1,5 h alatt is pontos még...

olvasmányosságra figyelünk legközelebb

de annak örülök hogy jól gondolkodtam...
KÖSZÖNÖM
Avatar
szivekf
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2010. május 14. péntek, 6:00

Hozzászólás Szerző: szivekf »

valaki meg tudná nekem mondani hogy miért késik óránként kb1 másodpercet? Köszönöm
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Tipp:
TimerINT belépés ~25 órajel, Timer0=6 beállítás 4 órajel.
Ezek összeadódhatnak.
A kvarc pontossága is ~20..30 ppm.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Van minden 1mSec-ben kb.: 30 órajel késésed.
A megszakítást előkészítő verem műveletek miatt.
Ezt felszorozva 1h-ra:
30*1000*60*60= 108000000 órajel
Ez osztva: 108000000/16000000(1Sec)= 6.75 Sec késés/h!

Ha jól gondolom! Ha nem, akkor valaki kijavítja!

Ezt bele kell kalkulálni az időzítésbe!
De sajnos ezek a kvarcok nem pontosak, és nem szeretik a hőingadozást sem!
Avatar
szivekf
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2010. május 14. péntek, 6:00

Hozzászólás Szerző: szivekf »

eddigi mérés alapján óránkét 1s késett 16 ora alatt (ha igy marad belefér a hibahatárba kap majd hűtést egyenletes lesz a hőfoka akkor mindenkinél ugyanannyit hibázik.)
de nincs erre jobb megoldás?
hogyan tudok ezred másodperces impulzust előállítani? akkor azt számolnám a timer helyett :(
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Szerintem ez kitűnő pontosság, így kel hagyni.
Ezen már csak rontani tudsz!


Ha így stabil. Akkor 16h. ként kivonsz 1 sec-et. :lol:
Vagy korigálsz óránként 0.06-ot.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Korrigálom az előző: Csütörtök, 13:18 Hozzászólásomat
Mert a: Prescale = 64 előosztóról bizony megfeledkeztem!
Mivel ez 1 szabadon futó számlál és még csak 30 körüli értéknél tart.
Amikor eléri a 64-et késedelem nélkül, lépteti a TCNT0 számlálót.

Ezt a Prescale reset müveletet valahogyan ki/be lehet kapcsolni a : GTCCR.PSR10 kapcsolóval. (Adatlap 85. oldal)

Hát ezt még én sem értem!?
Mikor reseteli Prescales számlálót???
:? :?:
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Hozzászólás Szerző: winnerbt »

Szia!
M168-nál van PSRSYNC előosztó nullázó bit a T0/T1-hez, PSRASY=1 a T2-höz.
1-be írva törli az előosztót.
(ja, látom, át lett nevezve időközben a bit...)

JAni
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Szia!
De ez most hogyan működik a gyakorlatban?

1.: Ha 1-re van állítva akkor 0-ról indul, az előosztó mikor eléri a beállított értéket?
És ha 0 akkor elszámol 1024-ig?

2.: Vagy mikor beíród az 1-est akkor törli az előosztót?
:?:

(Próbáltam lefordítatni a szöveget, de értelmezhetetlen eredményt kaptam!) :roll:
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Hozzászólás Szerző: winnerbt »

Hááát igen...
Elméletileg szintvetzérelt a dolog, úgy is van jelölve, de ahogy kibóklásztam:
Ha 1-be írod, azonnal törli az előosztót és úgy marad, kivéve, ha a TSM (timer szinkron) bit be van kapcsolva, akkor a két nullázó bit állapota akkor nullázódik, amikor a TSM-et elengeded (timer-ek szinkronizálása). Statikus jelnek értelmezem, de tényleg elég hipp-hopp elintézi az ismertetést.
JAni
fatzolaa
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2015. április 14. kedd, 13:20

Re: Stopper optokapuval

Hozzászólás Szerző: fatzolaa »

Sziasztok!
Egy kis segítségre lenne szükségem. Egy arduino Uno alapú stopper szeretnék építeni két optokapuval. Ha elhaladt az egyes kapu elött akkor indul a számláló, ha a második elött akkor leáll. Az eredményt majd soros kommunikációval kiírja. Tudom hogy a millis()-t kéne használni azt is akarom használni(későbbi időből kivonom a régebbit).
Nem tudom arra rávenni, hogy normálisan hozzárendeljen egy értéket a "starttime"-hoz és az"endtim"-hoz is.
Valaki tudna nekem írni valami megoldást? Én már ezer fórumot átolvastam, de akkor sem tudom megoldani.
Az optokapuk készen is vannak és megfelelő jelet is adnak ki.
A segítséget előre is köszönöm.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Stopper optokapuval

Hozzászólás Szerző: Robert »

Alapelv:
opti1/2 INT lábra. Amikor valaki áthalad: opto1 INT rutin: milis() ment.
Opto2: INT-ben: millis ment. Különbözet : megtett idő.

De: mi van ha
- nincs OPTO2 beérkezés?
- Opto 1 fele visszafordul?
- opto 1 "átugrik", csak OPTO2 van
És a tükörrel zaj/prellegés, vaku, napfény belesüt...
fatzolaa
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2015. április 14. kedd, 13:20

Re: Stopper optokapuval

Hozzászólás Szerző: fatzolaa »

Mi az az int láb? [img]<a%20href="http://kepfeltoltes.hu/view/151030/infr ... lja."/></a>[/img]
Ezt a kapcsolást építettem meg. Az új méréshez csak simán resetelem az arduinót. Visszafordulás nincs.

Kód: Egész kijelölése

unsigned long starttime;
unsigned long time;
unsigned long endtime;
int start = 10;
int stopp = 11;


void setup() {
  pinMode(start, INPUT);
  pinMode(stopp, INPUT);
  Serial.begin(9600);
  Serial.println("Ready to run");


}

void loop() {
  if (digitalRead(start) == HIGH)
  {
    starttime = millis();
    if (digitalRead(stopp) == HIGH)
    {
      endtime = millis();
    }


  }
  time = starttime - endtime;
  Serial.print(time, DEC);
}  

Így próbálkoztam.
Válasz küldése