Autor |
|
|
|
BID = 486493
Chillin Stammposter
Beiträge: 203 Wohnort: Karlshuld
|
|
Zitat :
bastler16 hat am 31 Dez 2007 16:14 geschrieben :
|
EDIT: Hab mal dein Prog. in den Simulator geschmissen. Irgendwie stimmt das nicht mit dem überein was du oben geschrieben hast:
Zitat :
| wenn an PIN x eine 1 anliegt dann soll für ca. 0,5 sekunden an pin Y eine 1 anliegen
ändert sich PIN x von 1 auf 0 dann soll an Pin Z für 0,5 sekunden eine 1 anliegen. |
Bei deinem Programm sind PinY und PinZ dasselbe und es wird ein ganzer Port überwacht.
Das Programm erzeugt also einen kurzen Puls an einem bestimmten Pin sobald sich PortD verändert.
[ Diese Nachricht wurde geändert von: bastler16 am 31 Dez 2007 16:20 ]
|
oh, du hast recht, da wird nur bei einer änderung geschalten, sorry, das muss ich noch irgendwie ändern.
wenn ich das in deinem obrigen code richtig sehe überprüft das prog in jedem programmzyklus den wert an pin x und schaltet dann jeweils für 0,5 sek. und das bei jedem durchlauf, mein prog soll aber nur für 0,5 sek. schalten wenn sich PINx ändert und nicht ständig. oder habe ich deinen code da falsch verstanden?
ja ich weiß dass ich den ganzen port überprüfe, darum habe ich ja gefragt wie man einzelne bits überprüft, wenn ich das weiß wird dieser programmteil ersetzt.
google gerade noch nach der 0,5 sek pause.....
_________________
|
|
BID = 486502
bastler16 Schreibmaschine
Beiträge: 2140 Wohnort: Frankreich
|
|
Zitat :
|
wenn ich das in deinem obrigen code richtig sehe überprüft das prog in jedem programmzyklus den wert an pin x und schaltet dann jeweils für 0,5 sek. und das bei jedem durchlauf, mein prog soll aber nur für 0,5 sek. schalten wenn sich PINx ändert und nicht ständig. oder habe ich deinen code da falsch verstanden?
|
Du hast Recht, ich hab nicht aufgepasst. Dann eben so:
Code : |
1. Includes, Registerdefinitionen,...
2. Pins als Eingänge/Ausgänge definieren (Register DDRx)
3. PinX einlesen, mit altem Wert vergleichen
Wenn alt=neu:
zurück zu 3.
Wenn alt!=neu [alt nicht gleich neu]:
Wenn PinX=1:
4a. PinY=1
5a. 0,5 Sekunden warten (Google: AVR delay loop generator)
6a. PinY=0
7a. weiter zu 8.
Wenn PinX=0:
4b. PinZ=1
5b. 0,5 Sekunden warten
6b. PinZ=0
7b. weiter zu 8.
8. neuen Wert irgendwo speichern (T-Flag?) um ihn mit dem nächsten
gelesenen Wert zu vergleichen
9. zurück zu 3.
|
|
Hoffentlich stimmt das jetzt.
EDIT: Gewöhn dir von vorne herein an ".def" zu benutzen und Unterprogramme im Quelltext einzurücken. Das macht die Sache später, wenn die Codes länger werden, deutlich übersichtlicher und flexibler!
EDIT2:
Zitat :
| (Google: AVR delay loop generator) |
Für die Pause
EDIT3 ( ): Im T-Flag lässt sich nur ein Bit speichern, wenn ein ganzer Port überwacht werden soll geht das natürlich nicht. Ich weiss ja nicht obs jetzt ein Bit oder ein Byte sein soll. (1 Byte=8 Bit=1 Port)
[ Diese Nachricht wurde geändert von: bastler16 am 31 Dez 2007 17:01 ] |
|
BID = 486516
Chillin Stammposter
Beiträge: 203 Wohnort: Karlshuld
|
so, die pause habe ich jetzt, funzt. DANKE!
dein code sollte jezt richtig sein, denke ich!
jezt muss ich ihn nur noch ins AVR übersetzen....
und da stellt sich für mich die frage wie kann ich deinen punkt 3 realisieren?
ich will also einen einzelnen pin (später werden es mehrere) mit einem zuvor gespeichertem wert vergleichen, wie heißt da der AVR befehl?
danke für deine tipps, werde versuchen mich dran zu halten!
und DANKE für die HILFE !!!!!
_________________
|
BID = 486521
Chillin Stammposter
Beiträge: 203 Wohnort: Karlshuld
|
Zitat :
bastler16 hat am 31 Dez 2007 16:47 geschrieben :
|
EDIT3 ( ): Im T-Flag lässt sich nur ein Bit speichern, wenn ein ganzer Port überwacht werden soll geht das natürlich nicht. Ich weiss ja nicht obs jetzt ein Bit oder ein Byte sein soll. (1 Byte=8 Bit=1 Port)
[ Diese Nachricht wurde geändert von: bastler16 am 31 Dez 2007 17:01 ]
|
es sollen später alle pins eines ports (oder zumindest 2 bis 3 unabhängig voneinander überwacht werden...
_________________
|
BID = 486523
bastler16 Schreibmaschine
Beiträge: 2140 Wohnort: Frankreich
|
Zitat :
Chillin hat am 31 Dez 2007 17:07 geschrieben :
|
so, die pause habe ich jetzt, funzt. DANKE!
|
Gern geschehen!
Zitat :
|
dein code sollte jezt richtig sein, denke ich!
jezt muss ich ihn nur noch ins AVR übersetzen....
|
In ASM/Assembler übersetzen.
AVR ist die Bezeichnung für die µCs.
Zitat :
|
und da stellt sich für mich die frage wie kann ich deinen punkt 3 realisieren?
ich will also einen einzelnen pin (später werden es mehrere) mit einem zuvor gespeichertem wert vergleichen, wie heißt da der AVR befehl?
|
EDIT: Mist entfernt. Moment, ich muss mal was nachschlagen.
Also: Im Instruction Set (Lads dir mal runter wenn du es nicht schon hast!) kann ich keinen Befehl finden um 2 Bits miteinander zu vergleichen.
Also müsste man den Umweg über Verschachtelungen nehmen (à la if (PinX=0&PinXalt=0)|(PinX=1&PinXalt=1) then...), das ist schon etwas schwieriger.
Oder pro Bit ein Register nehmen und die Register miteinander vergleichen. Ungefähr so:
Code : |
loop:
in test,pinb ;port(!) einlesen
andi test,0b00000001 ;andere pins maskieren
cp test,wert_alt ;testen
brne ungleich ;branch if...
mov wert_alt,test ;alten wert mit neuem wert überschreiben
rjmp loop ;zurück zum start
|
|
(Aus dem Gedächnis, ohne Garantie)
Bei mehren Pins ist der Weg über Register und CP einfacher.
Zitat :
|
danke für deine tipps, werde versuchen mich dran zu halten!
und DANKE für die HILFE !!!!!
|
Bitte!
[ Diese Nachricht wurde geändert von: bastler16 am 31 Dez 2007 17:12 ]
[ Diese Nachricht wurde geändert von: bastler16 am 31 Dez 2007 17:20 ]
[ Diese Nachricht wurde geändert von: bastler16 am 31 Dez 2007 17:22 ]
|
BID = 486548
Chillin Stammposter
Beiträge: 203 Wohnort: Karlshuld
|
ja, das sieht ganz gut aus, sowas habe ich schon geschrieben, damit funzt alles prima, nur dass ich eben das gesamte register zum vergleichen nehme.
du schreibst: "andi test,0b00000001 ;andere pins maskieren"
bedeutet das, dass nur das erste bit des test registers beobachtet wird und die anderen ignoriert?
ja die instruction summary hab ich, da steht beim befehl "andi" allerdings: "logical AND register and constant"
das verstehe ich jezt nicht ganz...
ansonsten sollte das alles so funktionieren
_________________
|
BID = 486554
Chillin Stammposter
Beiträge: 203 Wohnort: Karlshuld
|
habs jezt mal ausprobiert, das mit "andi" funktioniert!
jezt sollte alles funktionieren!
ich werde mich jezt mal zum silvesterfeiern begeben
wünsche dir einen guten rutsch, und vielen dank noch mal für deine Hilfe!!!!
darf ich dich nächstes jahr noch mal melden falls ich noch ein problem hab?
_________________
|
BID = 486555
bastler16 Schreibmaschine
Beiträge: 2140 Wohnort: Frankreich
|
Forenserver loggt mich aus und löscht meine Antwort.
Zitat :
| bedeutet das, dass nur das erste bit des test registers beobachtet wird und die anderen ignoriert? |
Ja, sozusagen. Andi ist das logische UND mit einer Konstanten. Wenn ich x&0 schreibe kommt immer 0 raus, die anderen Bits werden also auf 0 gesetzt und somit ignoriert (egal was wirklich anliegt, im Register test sind die Bits immer 0).
Hm... irgendwie kann ich das nicht besser erklären...
|
BID = 486558
bastler16 Schreibmaschine
Beiträge: 2140 Wohnort: Frankreich
|
Zitat :
|
ich werde mich jezt mal zum silvesterfeiern begeben
|
Viel Spass.
Zitat :
|
wünsche dir einen guten rutsch, und vielen dank noch mal für deine Hilfe!!!!
|
Danke.
Zitat :
|
darf ich dich nächstes jahr noch mal melden falls ich noch ein problem hab?
|
Ich bin auch 2008 noch im Forum aktiv... Wenn ich nicht antworte tut es halt jemand anders.
[ Diese Nachricht wurde geändert von: bastler16 am 31 Dez 2007 17:56 ]
|
BID = 486575
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Ich nicht mehr, da meine Antwort komplett überlesen wurde.
_________________
|
BID = 486576
Racingsascha Schreibmaschine
Beiträge: 2247 Wohnort: Gundelsheim
|
Kann man nicht ein komplettes Register mit einem anderen/dem Akkumulator verEXORen? Wenn beide gleich sind kommt 0x00 raus.
_________________
Fnord ist die Quelle aller Nullbits in deinem Computer.
Fnord ist die Angst, die Erleichterung, und ist die Angst.
Fnord schläft nie.
|
BID = 486583
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Na klar kann man das.
Man kann das Register einlesen, dann folgendermaßen jedes Bit prüfen:
loop:
in tmp, PINx
cpi tmp, 0b10000000 ;Bit7 testen (oder: cpi tmp, 1<<7)
breq bit7_an ;wenn gesetzt, spüringen
cpi tmp, 0b01000000 ;Bit6 testen
breq bit6_an
cpi tmp, 0b00000100 ;_Bit 2 testen
breq blup
;hier gelangt man hin, falls es nix von allem ist
rjmp else ;z.b. etwas anderes machen, oder bei 0 anfangen (rjmp loop)
s gibt viele Möglichkeiten. Auch eor (XOR) wäre denkbar. Aber cpi packt gleich eine Konstante mit in den Opkode, es wird also Platz gespart.
Aber ich wollt ja nicht mehr helfen, wird ja nur überlesen bzw. nicht drauf eingegangen.
_________________
|
BID = 487045
bastler16 Schreibmaschine
Beiträge: 2140 Wohnort: Frankreich
|
[OT]
@DonComi
Bin ich dir irgendwie auf die Füsse getreten?
|
BID = 487053
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Nein, bist du nicht
Also, mein Vorschalg mit cpi würde in die Hose gehen. Da muss vorher noch per andi maskiert werden, und da andi das Statusregister beeinflusst, kann man cpi gleich weglassen:
in r16, PINx ;IO-Register einlesen
mov r17, r16 ;Wert sichern, da es durch Maskierung geändert wird
andi r16, 0b10000000 ;bit7 prüfen
brne bit7_gesetzt ;wenn bit7 1 war, dann ist das Z-Flag nicht gesetzt
mov r16, r17 ;Wert erneut laden
andi r16, 0b00100000 ;Bit5 maskieren
brne bit5_gesetzt ;auf 0 prüfen
...
So würde es gehen, oder so (einfacher und effizienter):
sbic pinx, 5 ;skip if bit in IO ist cleared
rjmp bit5_gesetzt
sbic pinx, 7 ;...
rjmp bit7_gesetzt
...
[ Diese Nachricht wurde geändert von: DonComi am 2 Jan 2008 16:00 ]
[ Diese Nachricht wurde geändert von: DonComi am 2 Jan 2008 16:02 ]
|
BID = 487062
bastler16 Schreibmaschine
Beiträge: 2140 Wohnort: Frankreich
|
Zitat :
DonComi hat am 2 Jan 2008 15:54 geschrieben :
|
Nein, bist du nicht
|
Gut
Zitat :
|
in r16, PINx ;IO-Register einlesen
mov r17, r16 ;Wert sichern, da es durch Maskierung geändert wird
andi r16, 0b10000000 ;bit7 prüfen
brne bit7_gesetzt ;wenn bit7 1 war, dann ist das Z-Flag nicht gesetzt
mov r16, r17 ;Wert erneut laden
andi r16, 0b00100000 ;Bit5 maskieren
brne bit5_gesetzt ;auf 0 prüfen
|
Wenn der Stack benutzt wird könnte man mov auch durch push/pop ersetzen um ein Register zu sparen.
Es gibt viele Möglichkeiten das Problem zu lösen, jeder so wie er will.
|