Forum: Mikrocontroller und Digitale Elektronik DTMF Bits verkehrt herum eingelesen


von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

Hallo,

hab eine Schaltung mit DTMF-Erkennung MT8870 sowie einen Atmega 
Prozessor dahinter gebaut, die 4 Bit-Datenleitungen (Q1-Q4) gehen zum 
Prozessor auf Port B, 1-4. StD - Signalleitung auf IRQ0.

Hat alles beim Testen super funktioniert und ich hab alles auf einer 
Platine sauber aufgebaut. Schöne Stecker angelötet usw. - nur leider bei 
der Platine die Datenleitungen verkehrt herum angeschlossen (Q4 an Pin0, 
Q3 an Pin1, Q2 an Pin2, Q1 an Pin3). Ein Umlöten ist mit vertretbarem 
Aufwand kaum möglich. Wie kann ich die Bits trotzdem mit möglichst wenig 
Aufwand wieder korrekt abfragen.

So sieht der Code derzeit aus (Bascom):
1
Isr_0:
2
Byttelefon = Pinb And 15
3
Return

Nur sollte jetzt so konvertiert werden:
statt 1010 (0) lese ich jetzt 0101, also 5
statt 0001 (1) lese ich jetzt 1000, also 8
statt 0010 (2) lese ich jetzt 0100, also 4 usw.
Also Bit 3 sollte den Inhalt von Bit 0 erhalten
Bit 2 den Inhalt von Bit 1
Bit 1 den Inhalt von Bit 2
Bit 0 den Inhalt von Bit 3

Mit Shift-Operationen und Bitmaskierungen ist mir nichts geeignetes 
eingefallen. Hat jemand eine Idee?

von XXX (Gast)


Lesenswert?

Hallo

do 4

lsb per rechtsshift aus alt in carry
carry per linksshift ins neue

end


Gruß
Joachim

von Klempner (Gast)


Lesenswert?

Tabelle

von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

Danke für die Ideen und Rückmeldungen,

eine Tabelle ist auch ok, würd ich eher bei völlig durcheinander 
gewürfelten Ersetzungen verwenden

> do 4
>
> lsb per rechtsshift aus alt in carry
> carry per linksshift ins neue
>
> end

klingt interessant, könnt vielleicht direkt in Assembler codiert 
schneller sein - habs aber jetzt so gelöst:
Isr_0:
Byttelefon.0 = Pinb.3 'weil zu dumm zum Platinen aufbauen
Byttelefon.1 = Pinb.2 'muss der Prozessor die Fehler ausmerzen
Byttelefon.2 = Pinb.1
Byttelefon.3 = Pinb.0
Return


Da Byttelefon sonst nicht verwendet wird und am Anfang null ist, braucht 
es auch nicht explizit gelöscht werden ... funzt

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Wenn's nur 4Bit (dann wird's nicht zu gross) sind, sollte die Tabelle 
warscheinlich die schnellste Lösung sein.
Wenn's darauf aber nicht ankommt, shiftest dir das Wort einfach neu 
zurecht :-)

von Peter II (Gast)


Lesenswert?

Random ... schrieb:
> Wenn's nur 4Bit (dann wird's nicht zu gross) sind, sollte die Tabelle
> warscheinlich die schnellste Lösung sein.

Tabelle ist immer die schnellste lösung

von Random .. (thorstendb) Benutzerseite


Lesenswert?

:-)
> Tabelle ist immer die schnellste lösung
Hmmm ... gegen nen in HW implementierten SHIFT wohl nicht. Bei einem 
Bit-Durcheinander warscheinlich aber schon.

Ich glaub, beim Cortex-M3 gibt es einen ASM Befehl, der die Bits eines 
Bytes einmal in der Reihenfolge umkehren kann.

---
Hab noch ein wenig rumgespielt, 'in' & 'out' hält jeweils den ganzen 
Wert:
1
out = ( IN_1 <<3) | ( IN_2 <<2) | ( IN_3 <<1) | ( IN_3 <<0);
2
out = ((in&1)<<3) | ((in&2)<<1) | ((in&4)>>1) | ((in&8)>>3);

Über die Geschwindigkeit lässt sich streiten :-)

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.