Einstieg in µC???

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: 05 10 2024  12:26:46      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 Nächste Seite )      


Autor
Einstieg in µC???

    







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
ICQ Status  

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&auml;ndert von: DonComi am &nbsp;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.


Vorherige Seite       Nächste Seite
Gehe zu Seite ( Vorherige Seite 1 | 2 | 3 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 20 Beiträge im Durchschnitt pro Tag       heute wurden bisher 10 Beiträge verfasst
© x sparkkelsputz        Besucher : 182128245   Heute : 2049    Gestern : 5499    Online : 771        5.10.2024    12:26
8 Besucher in den letzten 60 Sekunden        alle 7.50 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0364148616791