Forum: Mikrocontroller und Digitale Elektronik kurzer Denkanstoß zur Pin Ansteuerung per Uart im ATMega


von Michi (Gast)


Lesenswert?

Hallo ins Forum,

meine Denk...blocke ist mir in weg, ich würde um Hilfe bitten.
Ich habe eine kleine ATMega 168, am seinem PORTC 0 bis 5 und
PORTB 0 bis 5 sind LED mit Treiber Transistoren.
Jetzt würde ich gerne die LED per UART einzeln ein und aus
schalten können.
Was wäre eine einfache und simple Comandozeile, mit wenigen Byte?
1
einschalten: C12C14 -> PortC 2 an, 4 an.
2
ausschalten: C02C04 -> PortC 2 aus, 4 aus.

ist doch recht lang wenn es um alle geht.

Es sollte noch verständlich sein, also nicht einfach
1
ein: C10 -> C2 C4 an
2
aus: C00 -> C2 C4 aus, ach nee alle aus..

wenn der aktuelle PIN status unbekannt ist, kann ich extern per UART
schlecht denn richtigen Wert finden um nur 2,4 auszuschalten.

Was fällt euch da ein?

Gruß

Michi

von Teo D. (teoderix)


Lesenswert?

Michi schrieb:
> wenn der aktuelle PIN status unbekannt ist, kann ich extern per UART
> schlecht denn richtigen Wert finden um nur 2,4 auszuschalten.

Reicht doch wenn ihn der ATMega kennt! :)
Man könnte ihn natürlich auch über selbigen Weg abfragen, wenn wirklich 
notwendig.
Warum für ein Bit ein ganzes Byte verschwenden?
Bit7 = Port; Bit6 = on/off; Bit5-0......


Oje, halb vier, egal wird schon passen ;)

von W.A. (Gast)


Lesenswert?

Michi schrieb:
> ... ich würde um Hilfe bitten

Da hindert dich keiner dran. Tu es einfach.

Michi schrieb:
> Es sollte noch verständlich sein ...

Teo D. schrieb:
> Bit7 = Port; Bit6 = on/off; Bit5-0......

Falls es ein ASCII-Kommando werden soll und das könnte man in die 
Anforderung "verständlich" zumindest rein interpretieren, wird das damit 
nichts.

Michi schrieb:
> Was wäre eine einfache und simple Comandozeile, mit wenigen Byte?
> einschalten: C12C14 -> PortC 2 an, 4 an.
> ausschalten: C02C04 -> PortC 2 aus, 4 aus.
>
> ist doch recht lang wenn es um alle geht.

Wenn es um alle geht, könnte man z.B.
1
einschalten: C1A -> PortC alle ein.
2
> ausschalten: C0A -> PortC alle aus.
 verwenden.

Falls du auf die Zuordnung der Bits zu den Ports keinen expliziten Wert 
legst, sondern die Verwaltung dem µC überlässt, kann ein Kommando auch 
einfach aus Einzelbuchstaben bestehen. Jedem Pin ist ein Buchstabe des 
Alphabets zugeordnet und Groß-/Kleinschreibung entscheidet über 
Ein-/Ausschalten.
1
aI -> Bit 0 aus, Bit 9 ein

von Michi (Gast)


Lesenswert?

finde ich jetzt eine gute Idee, somit also
1
  ABCDEF - 6 an - PORTB
2
  G00000 - 6 an - PORTB
3
  h00000 - 6 aus - PORTC
4
  IJKLMN - 6 an - PORTC
5
  aJLEbc - PORTB 0b00x1x000 / PORTC 0b00xx1x1x
könnte gehn, versuchmal ein Program zu schreiben... erst mal DANKE

ist das mit Hh und Gg nicht unnötige, wenn ich immer 6 Byte sende?

Gruß

Michi

von Draco (Gast)


Lesenswert?

Das ist zwar ein stranger Ansatz mit den Buchstaben, dürfte aber gehen 
:-D Hab das auch noch nie so gesehen.

Aber eine Byte für jeden Port geht wohl nicht?! Also direkt 0b00010110 
z.b. zu senden?! Da wäre die Portzuweisung um einiges einfacher zu 
gestalten als eine IF / Case Abfrage?

PORTC = UartReceive;

Das wäre dann ein bloßer Einzeiler, sollten keine Steuerzeichen vorher 
kommen.

Das gleiche wäre dann natürlich Gegenseitig auch ganz einfach möglich, 
also den Zustand des Ports mit einem Byte an das Zielsystem zu senden. 
Ohne Komplizierten Konstrukte.

von Michi (Gast)


Lesenswert?

nee, der Controller kann nur Empfangen nicht Senden.
Somit ist es wichtig, dass nur gewünschte PINs sich
ändern. Ein Byte 0b0010101 würde doch alle 6 anfassen.
wenn aber.
1
PORTB = 0b00111000 (ist zustand)
2
senden von ???
3
PORTB = 0b00101010 (soll zusand)
4
5
doch
6
sende 0b0010101 
7
PORTB = 0b0010101 (nicht gewolltes ergebnis)
8
sowas kann ich doch nicht senden
9
send 0b00x0xx1x
10
um auf PORTB = 0b00101010 zukommen.

von Draco (Gast)


Lesenswert?

Wenn du doch aber 0b0010101 sendest, warum ist dann 0b0010101 nicht das 
gewollte Ergebnis?

Aber ja, das geht mit einer Bitmaske ganz wunderbar

Und wenn du zum Beispiel PB5 auf high setzen willst und er ist schon auf 
High? Das kommt doch dann auf das gleiche Ergebnis?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dann definiere Dir zwei Kommandos:

Verändere Port mit OR  (zum Setzen von Ausgängen)
Verändere Port mit AND (zum Löschen von Ausgängen)

Parameter der Kommandos sind jeweils der Name des Ports und das 
anzuwendende Bitmuster als zweistelliger Hexwert

OC80 könnte bedeuten OR Port C mit 0x80 - Setze Port C.7

AC7F könnte bedeuten AND PortC mit 0x7F - Lösche Port C.7

Damit ist ohne weiteren Codieraufwand auch das hier möglich:

OC55 - Setze Ports C.0, C.2, C.4 und C.6

Ein weiteres Kommando - Setze Port auf definierten Wert - solltest Du 
noch dazu packen:

SC55 - Setze Ports C.0, C.2, C.4 und C.6 und lösche Ports C.1, C.3, C.5 
und C.7


Die Kommandos solltest Du z.B. mit \n abschließen.

von Michi (Gast)


Lesenswert?

der Steuerungsanstoss kommt aus verschieden Quellen von einer Webseite, 
Shell-script und UDP Port. Und ein kleines Programm sendet über die
Schnittelle. Mal ein Beispiel:

Webseite darf nur Bit 0 und 1 ändern, UDP nur Bit 5 und 4, Shell 2 und 
3.

Wenn per UDP jetzt Bit 5 HI und Bit 4 Low werden soll, dürfen die 
anderen
Bits sich nicht ändern. Doch ich kenne den Zustand des Portes nicht.

Ein Senden von 0b00100000 fällt doch aus, da sich alles ändern darf.
Und Binär senden von 0b0010xxxx ist nicht möglich. Und abfragen fällt
durch mangelten Rückkanal auch aus.

von Karl M. (Gast)


Lesenswert?

Hallo Michi,

dein Weg ist der von Rufus aufgezeigte.

Alles was im Bsp. als Zahl steht, kann man als ASCII oder Dezimalzahl 
direkt senden.

Mit deiner neuen Anforderung, verteile halt noch eine 
Senderauthenitfizierung und entscheide dann im AVR µC über das erlaubte 
"Umfeld".

von Teo D. (teoderix)


Lesenswert?

Michi schrieb:
> Ein Senden von 0b00100000 fällt doch aus, da sich alles ändern darf.
> Und Binär senden von 0b0010xxxx ist nicht möglich. Und abfragen fällt
> durch mangelten Rückkanal auch aus.

Teo D. schrieb:
> Reicht doch wenn ihn der ATMega kennt! :)
> (...)
> Warum für ein Bit ein ganzes Byte verschwenden?
> Bit7 = Port; Bit6 = on/off; Bit5-0......

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.