DTMF Bits verkehrt herum eingelesen

OP (Firma: Manfred) #2335609
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?
OP (Firma: Manfred) #2335656
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
Persönliche Seite #2335682
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 :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren