PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Wie Ports Multiplexen?



HM
30.05.2011, 17:15
Hallo Bascom-Fans,
evtl. könnt Ihr mir helfen.
Ich habe schon einige Stunden damit verbracht im Internet Seiten zu suchen/finden, wie man ein Port des Atmegas z.Bsp. PortB.0 bis PortB.7 nacheinander in Bascom ein und dann ausschaltet (H,L) und das immer wieder von vorn (keine 7-Segmentanzeige). Leider bin ich nicht fündig geworden, keine Ahnung warum ich nichts gefunden habe, möglicherweise habe ich falsch gesucht.
Ja und gleich noch zwei Fragen:
Wenn man die Ports multiplexen möchte, wie werden die Ports (Port "B" u. Port "C") unterschieden und wie wird die Geschwindigkeit geregelt?
Es wär sehr schön, wenn mir da jemand helfen könnte.
Vielen Dank für Eure Antworten. MfG

for_ro
30.05.2011, 18:04
Hallo HM,
du könntest z.B. einen Timer laufen lassen, der in der gewünschten Zeit überläuft (damit regelst du die Geschwindigkeit) und dann in eine Routine springt. Dort zählst du eine Variable von 0 bis 7 hoch und schaltest den zugehörigen Ausgang um. Das geht mit vier Befehlen:

Toggle PortB.Zaehler 'schaltet den vorherigen Port-Pin aus
Incr Zaehler 'erhöht den Zaehler
If Zaehler = 8 Then Zaehler = 0 'setzt den Zaehler zurück
Toggle PortB.Zaehler 'schaltet den nächsten Port-Pin ein

Wenn du das über mehrere Ports machen willst, musst du dir über eine zweite Variable merken, wo du gerade dran bist, also auf PortB oder auf PortC.

Vitis
30.05.2011, 18:07
Hier:

http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige#Mehrere_7-Segment_Anzeigen_.28Multiplexen.29

ist es ganz gut beschrieben

HM
30.05.2011, 18:54
Hallo for_ro u. Vitis,
erst mal ganz herzlichen Dank, das Ihr euch Zeit genommen habt um mir zu antworten.
Mit Toggle habe ich auch schon rumexperimentiert, mir fehlen da wohl noch einige Kenntnisse in Bascom aber das sind schon brauchbare Tipps für mich.
Wenn ich nicht weiterkomme, melde ich mich wieder, also vielen Dank.
MfG

Vitis
30.05.2011, 19:38
toggle ist käse, geht nur mit einem Pin ...
Ich rotiere die Anzeigen durch, habe quais
anzeige 1 an porta.1
anzeige 2 an porta.2 etc. bis
anzeige 5 an porta.5
dann hab ich n byte definiert mit &B00000001
das shifte ich per shift,left,1 eins weiter und bei
if byte.5=1 then byte=&B00000001
setze ich das wieder zurück.
dann brauch ich das byte jeweils nur in den port zu schreiben und die jeweilige anzeige ist selektiert.
danach nur noch das byte für die jeweilig anzuzeigende zahl ins portb schreiben und fertig ist die kiste ...

in meinem fall hab ich mir sowas wie n framebuffer gebaut, in den die jeweiligen anzeigen geschrieben werden
und im timer interrupt rufe ich nur noch das array ab und schreibs in den port ... ok, jetzt wo ich das lese
scheints recht verwirrend ... hmmm

hier n codeabschnitt von mir wie ich das im timer-isr gemacht hab

Shift Segment_rotate , Left , 1
If Segment_rotate.5 = 1 Then
Segment_rotate = &B00000001
Segment_select_pointer = 1
endif
Porta = Char_array_1(segment_select_pointer)
Portc = Char_array_2(segment_select_pointer)
Incr Segment_select_pointer

segment rotate ist in meinem fall per alias direkt auf den port (ääähmm wars D?) gelegt

for_ro
30.05.2011, 20:17
toggle ist käse, geht nur mit einem Pin ...
Danke für die Bemerkung. Hättest dein Rotate auch ohne dies vorschlagen können.

Vitis
30.05.2011, 22:16
hmmm? Versteh ich jetzt nicht ganz, aber danke für den Hinweis.

HM
31.05.2011, 10:24
Hallo Vitis,
vielen Dank für Deine umfangreiche Antwort.
Also ich möchte keine 7-Segmentanzeige ansteuern, nur LEDs, die mit einem $include "file" Bit-Muster ausgeben.
Ich nehme an, das daß aber mit dem Interrupt ähnlich ist.
Ich bin hier schon länger im Forum angemeldet, aber trotzdem noch ein Anfänger, da ich längere Zeit paussieren mußte fehlt mir die Erfahrung.
Gut das es dieses Forum gibt.
MfG

abendrise
01.06.2011, 14:19
Über Logikbausteine kann man ja durchaus die RxD und TxD-leitungen splitten und verschiedenen Treibern zuführen. Aber du solltest dir ein zeitfenster einbauen. eder Teil (RS232 und IRDA) bekommt jede ms ein Zeitfenster in dem die Kommunikation stattfindet.

HM
01.06.2011, 23:03
Hallo abendrise,
vielen Dank für Deine Antwort.
Irgendwie paßt Deine Antwort nicht zu meiner Frage. Bist Du dir sicher, das Du hier richtig bist? MfG

HM
10.06.2011, 10:44
Hallo Vitis,
ich möchte mich bei Dir nochmals bedanken.
Der Link und Dein Programmbeispiel von Dir haben mir weitergeholfen.
MfG

Vitis
11.06.2011, 13:47
gerne wieder ;)