welcher Atmel für Torzähler? Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
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
|
|
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 5 Beiträge verfasst © x sparkkelsputz Besucher : 182417784 Heute : 2282 Gestern : 7490 Online : 270 28.11.2024 13:41 5 Besucher in den letzten 60 Sekunden alle 12.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0402040481567
|