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
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 ;)
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.
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.
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.
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?
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.
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.
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".
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......