welcher Atmel für Torzähler?

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 28 11 2024  10:53:43      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( Vorherige Seite 1 | 2 | 3 | 4 | 5 | 6 Nächste Seite )      


Autor
welcher Atmel für Torzähler?

    







BID = 156603

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach
 

  


Irgendwie finde ich das Ganze ziemlich umständlich.
Auf die Decoder würde ich überhaupt verzichten und statt dessen die beiden Displays multiplexen. Das kostet dich auch nur 7 oder 8 Pins + 1 und dafür kannst du dann Segmentkombinationen ansteuern, die der Decoder nicht kennt.

Der Prozessor ist massenhaft schnell genug, um unter Programmkontrolle, die Segmente aus einer Tabelle zu lesen, die Displays abwechselnd anzusteuern und nebenher noch die Signale der Lichtschranken zu lesen.
Selbst die Serielle Schnittstelle könnte er noch bedienen, ohne daß Interrupts erforderlich wären.


Zitat :
delaymacro aufrufen und pause machen, bis hoffentlich der ball fertig durchs tor gehuscht ist

Mit Hoffnung kann man keine funktionierenden Programme schreiben. Was ist, wenn der Ball in der Lichtschranke liegen bleibt ?
Du scheinst auch keine Vorstellung davon zu haben, wie kurz dein Delay ist. Wenn schon, dann schreibt man eine oder zwei Zählschleifen anstatt den gesamten Programmspeicher mit NOPs zu füllen.

Im übrigen kann man eine Flankenerkennung aber auch ohne Hardwareunterstützung programmieren, indem man vorher - nachher vergleicht.


Zitat :
ldi stack, 0b00000001

add countA, stack ;TorzählerA um 1 hochsetzen

Meinst du nicht auch, daß "inc countA" etwas handlicher ist ?

Außerdem sollte man eine Variable mit dem schönen Namen "stack" nicht für jeden Müll gebrauchen. Die Chancen sind groß, daß das direkt ins Disaster führt.
Für temporäre Zwecke sind Namen wie "temp" oder "tmp" gebräuchlicher und sinnvoller.





_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

BID = 156662

Morgoth

Schreibmaschine



Beiträge: 2930
Wohnort: Rockenhausen (Pfalz)

 

  

danke für die tipps
also auf die decoer kan ich nichtmehr verzichten, weil das alles bereits ziemlich fest verlötet ist, aber das ist auch nicht schlimm, ich hatte die eh mal für nen Torzähler aus logikbausteinen gekauft.

in der lichtschranke kann der ball nicht liegen bleiben, das ist definitiv unmöglich, dann müsste er schweben können.
das mit den zählschleifen hab ich heute erst gerafft ( kann mir ja net alles auf einmal erarbeiten) und das wird dann jetzt auch eingbaut

Zitat :
Meinst du nicht auch, daß "inc countA" etwas handlicher ist ?

Allein ich wusste es nicht besser.

ja, das stack iss nen abfallprodukt aus dem allerersten programmiervorstoß, das werd ich dann vllt noch ändern

_________________
Es irrt der Mensch solang er strebt

BID = 156664

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

Dann programmier das mal ohne die Interrupts zu benutzen.
Dann kannst das Programm auch problemlos simulieren.
Interrupts können tückisch sein, wenn man wenig Programmiererfahrung hat. (Und auch noch, wenn man genug hat)

_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

BID = 156738

Morgoth

Schreibmaschine



Beiträge: 2930
Wohnort: Rockenhausen (Pfalz)

soooooo... also interrupts sind weg, und im simulator klappts auch und ein paar Portverwechslungsbugs hab ich auch noch ausgemerzt.
der Beep-macro wird aber net so angezeigt wie ich mir das vorstelle, aber das seh ich ja dann obs funzt, wenns eingebaut ist.


Code :


.INCLUDE "m8def.inc"
.DEF stack = R16
.DEF countA = R17
.DEF countB = R18
.DEF temp = R19
.DEF temp2 = R20
.EQU ton = 7
.CSEG
.ORG 000
rjmp Start
.MACRO Beep ;generiert einen ton
ldi temp2, 0x00
klick:
inc temp2
sbi PORTB, ton
ldi temp, 0x00
ding:
inc temp
nop
cpi temp, 0xFF
breq dong
rjmp ding
dong:
cbi PORTB, ton
ldi temp, 0x00
kling:
inc temp
nop
cpi temp, 0xFF
breq klong
rjmp kling
klong:
cpi temp2, 0xFF
breq klack
rjmp klick
klack:
.ENDMACRO
.MACRO Delay ;viel pause
ldi temp, 0x00
loop:
inc temp
nop
nop
nop
nop
cpi temp, 0xFF
breq deloop
rjmp loop
deloop:
.ENDMACRO ;ende der pause
Start:
ldi temp, 0xFF
out DDRB, temp ;portB als ausgeng definieren
out DDRC, temp ;portC als ausgang definieren
ldi temp, 0b11010010
out DDRD, temp ;portD als als ein und ausgang definieren
ldi temp, 0b11000000
out PORTD, temp ;portC pins auf high und low level setzen (IR-LED's aktivieren)
ldi temp, 0x00
out PORTB, temp ;portB pins auf logisch 0 setzen (DisplayA auf 0)
ldi temp, 0x00
out PORTC, temp ;portC pins auf logisch 0 setzen (DisplayB auf 0)
ldi stack, 0b00100000
out MCUCR, stack
ldi stack, HIGH(RAMEND)
out SPH, stack
ldi stack, LOW(RAMEND)
out SPL, stack ;stack aktivieren
newgame:
ldi countA,0b00000000 ;Torzählerregister A auf 0 Setzen
ldi countB,0b00000000 ;Torzählerregister B auf O Setzen
sei ;interrups aktivieren (torzählung kann ab jetzt beginnen)
Routine: ;schleife auf
ldi temp, 0b11000000
out PORTD, temp ;PortD auf standartwert setzen (pin7 wird bei Interrupt zurückgesetzt)
out PORTB, countA ;TorzählerA über portB auf Display ausgeben
out PORTC, countB ;TorzählerB über portC auf display ausgeben
cpi countA, 0b00000110 ;TorzählerA mit 6 vergleichen
breq new ;Wenn gleich dann Neues Spiel anfangen
cpi countB, 0b00000110 ;TorzählerA mit 6 vergleichen
breq new ;Wenn gleich dann Neues Spiel anfangen
sbic PIND, 2 ;LichtschrankeA abfragen wenn 0 dann nächsten Befehl überspringen
rjmp TorA ;Zu TorA-handling springen
sbic PIND, 3 ;LichtschrankeB abfragen wenn 0 dann nächsten Befehl überspringen
rjmp TorB ;Zu TorB-handling springen
rjmp Routine ;schleife zu(soll später durch korrekte sleepfunktion ersetzt werden)
new:
rjmp newgame ;neues spiel starten
TorA: ;Torbearbeitungsroutine B
Beep ;Beepmacro aufrufen (Piezopiepser ansteuern)
inc countA ;TorzählerA um 1 hochsetzen
rjmp routine ;zurück zu Ursprung
TorB: ;Torbearbeitungsroutine B
Beep ;Beepmacro aufrufen (Piezopiepser ansteuern)
inc countB ;TorzählerB um 1 hochsetzen
rjmp routine ;zurück zu Ursprung



_________________
Es irrt der Mensch solang er strebt

BID = 156744

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach


Zitat :
soooooo... also interrupts sind weg

Dann sollten sich aber kein "sei" nicht mehr im Code befinden !
Die Delay routine kann man auch etwas kompakter schreiben, z.B.:

.MACRO TxBitTime
; approx. 1000 clocks delay for 1200 Baud
ldi txTimer,250
BitTime:
nop
dec txTimer
brne BitTime
.ENDMACRO


wenn du die Schleifenvariable nicht initialisierst, ist sie nach dem ersten Aufruf automatisch auf 0 und ergibt so die maximale Verzögerung von 256 Durchläufen.

Wenn du zwei oder drei solcher schleifen schachtelst, wird es richtig langsam:

DlyLoop:
nop
dec timer1
brne DlyLoop
dec timer2
brne DlyLoop
dec timer3
brne DlyLoop

Wenn du das Konstrukt mit timer1=timer2=timer3=0 startest, so wie die Variablen am Ende auch stehen, dann dauert diese Routine über 1 Minute bei 1MHz !
Am schnellsten ist sie, wenn du die drei Variaben auf 1 initialisierst, dann ist in 7µs alles vorbei.
Dazwischen ist in ungefähr 4µs Schritten fast alles möglich.
Kannst dir ja mal die Formel aufstellen.



_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

BID = 156764

Morgoth

Schreibmaschine



Beiträge: 2930
Wohnort: Rockenhausen (Pfalz)

jaja, diese altlasten...
wenn du genau guckst wird das Dely-macro im moment auch nicht gebraucht
aber das kriegt seine bedeutung zurück wenn es an die special effects geht, deswegen virlen Dank für die kürzeren Codebeispiele.
Die formel müsste doch sowas wie t=2XA*2XB*2XC/1Mio sein, oder hab ich mich jetzt grob verschätzt und eine 2 muss weg, weil dann würd das ergebnis auch passen?

_________________
Es irrt der Mensch solang er strebt

BID = 156823

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

Noch ein Tip:
Wenn du ohne Interrupts arbeitest, dürfte es bei dir zweckmäßig sein, anstelle des NOP in der innersten Schleife nachzuschauen ob der Ball gerade ins Tor geht.
Dann entweder die Schleife abbrechen, oder ein Flag setzen und später auswerten.


_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

BID = 156826

Morgoth

Schreibmaschine



Beiträge: 2930
Wohnort: Rockenhausen (Pfalz)

wo meinst du jetzt? im delay?
das wär ne überlegung wert, aber nur im großen

_________________
Es irrt der Mensch solang er strebt

[ Diese Nachricht wurde geändert von: Morgoth am 30 Jan 2005 12:26 ]

BID = 157109

Morgoth

Schreibmaschine



Beiträge: 2930
Wohnort: Rockenhausen (Pfalz)

soo, nachdem ich noch nen "kleinen" fehler im programm beseitgt habe zählt das ding jetzt auch tatsächlich wenn dei lichtschranke unterbrochen wird...
also es funzt schonmal ganz gut.
aber manchmal legt es wenn man den reset-knopf betätigt nen fehlstart hin (zählt eins hoch), ist das normal?
DANKE schonmal an alle die mir bei der realisierung geholfen haben!
Ihr seid spitze!
Besonderer Dank geht an Perl

_________________
Es irrt der Mensch solang er strebt

BID = 157159

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach


Zitat :
aber manchmal legt es wenn man den reset-knopf betätigt nen fehlstart hin (zählt eins hoch), ist das normal?

Das klingt nach einer fehlenden Initialisierung.
Ohne die Source kann man aber nicht viel dazu sagen.


_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

BID = 157401

Morgoth

Schreibmaschine



Beiträge: 2930
Wohnort: Rockenhausen (Pfalz)

was meinst du mit source? ist das einfach dar programmcode wie ich ihn geschrieben hat, oder ist das das, was aus dem assembler rauskommt und dann auf den chip?

_________________
Es irrt der Mensch solang er strebt

BID = 157409

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

Deinen Quellcode.
Besser wäre noch das vom Assembler erzeugte .lst-File, weil da auch die Macroexpansions und Warnings zu sehen sind.
Da das aber ziemlich groß ist und hauptsächlich aus blanks besteht, solltest du es zippen.

_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

BID = 157496

Morgoth

Schreibmaschine



Beiträge: 2930
Wohnort: Rockenhausen (Pfalz)

OK, here you are


_________________
Es irrt der Mensch solang er strebt

BID = 157515

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

Ich habe nicht den Eindruck als ob das Programm korrekt funktioniert.
Wenn ein Ball eine Lichtschranke unterbricht, dann rast der Torzähler hoch bis auf 6 und gleich wieder von neuem.
Zwar ist es möglich, daß deine Beep routine das verhindert wenn der Ball kurz genug in der Lichtschranke ist, aber verlassen würde ich mich darauf nicht.

Der Fehlstart scheint aber einen elektrischen Hintergrund zu haben. Vermutlich hat sich der Eingangspegel noch nicht stabilisiert, wenn die Hauptschleife beginnt.
Abhilfe könnte eine kurze Verzögerung oder ein Beep am Ende der Initialisierung bringen.

Du kanns das ohne das das Programm länger wird (es wird sogar etwas kürzer ) so codieren:

start:
.
.
.
newgame:
clr countA ; oder xor countA,countA wenn dir das lieber ist
clr countB
wait:
Beep
Routine:
ldi temp,....
..
..
new:
rjmp newgame

TorA:
inc countA
rjmp wait

torB:
inc countB
rjmp wait


_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

BID = 157527

Morgoth

Schreibmaschine



Beiträge: 2930
Wohnort: Rockenhausen (Pfalz)

danke für die tipps!
du hast recht, nur das beep verhindert das durchrasen, aber es macht seinen job ganz gut

_________________
Es irrt der Mensch solang er strebt


Vorherige Seite       Nächste Seite
Gehe zu Seite ( Vorherige Seite 1 | 2 | 3 | 4 | 5 | 6 Nächste Seite )
Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag       heute wurden bisher 3 Beiträge verfasst
© x sparkkelsputz        Besucher : 182416931   Heute : 1428    Gestern : 7490    Online : 559        28.11.2024    10:53
9 Besucher in den letzten 60 Sekunden        alle 6.67 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0405948162079