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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.