mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MT8880C mit PIC16F876A lesen? Was mache ich falsch?


Autor: Marcel Peters (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.
Ich möchte mit meinem PIC16f876A den MT8880C-DTMF-Decoder (
http://assets.zarlink.com/DS/zarlink_MT8880C_APR_03.pdf ) auslesen,
d.h. ich will die empfangenen Töne zuerstmal versuchsweiße auf die
rs232-schnittstelle zu meinm PC übertragen.

RS232 funktioniert.
MT8880C funktioniert (Dadurch, das ESt auf High geht wenn ich
Tastentöne sende weiß ich das er diese korrekt dekodiert)

In den DTMF-Decoder schreiben kann ich scheinbar auch korrekt, denn
nachdem ich die Config-Register von dem Ding beschrieben habe kann ich
auf den (nun aktivierten) IRQ-Pin reagieren.

Das Problem besteht darin, das ich als Ergebniss meines Lesevorganges
am MT8880C nur 1 zurückbekomme.
Scheinbar stelle ich die I/O-Pins des PIC icht korrekt ein.

Den Pin, der z.b. für die Ruferkennung als Eingagn geschaltet ist
funktioniert. Darauf kann ich auch reagieren. Allerdings ist diese
Leitung auch unidirektional.

Nur WIE muss ich die I/o-Pins richtig einstellen?
Oder hab ich mich da arg mit dem Timing verhauen?

Hier mal ein Code-Schnipsel wie ich das bisher mache:

//mt8880c datenleitungen (bidi)
#define mt8880_d3 PIN_B3
#define mt8880_d2 PIN_B2
#define mt8880_d1 PIN_B1
#define mt8880_d0 PIN_B0
//mt8880c steuereingänge (register-select u.ä.)
#define mt8880_rw PIN_A0
#define mt8880_rs0 PIN_A1
#define mt8880_phi2 PIN_A2
//mt8880c irq-ausgang (funktioniert auch)
#define mt8880_irq PIN_B4

//die funktion um aus dem MT8880C zu lesen
int mt8880_rxd()
{
int result;
set_tris_b(63);
output_low(mt8880_phi2);
output_high(mt8880_rw);
output_low(mt8880_rs0);
delay_cycles(3);
output_high(mt8880_phi2);
result=(input_b() && 15);
output_low(mt8880_phi2);
return(result);
}

//haupt-funktion (nur das portsetup....)
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_a(0);
set_tris_b(48);
set_tris_c(128);
port_b_pullups(15);
output_b(0);
....
}


Ich hoffe mir kann hier jemand helfen.
MfG

Autor: Andreas Jäger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Marcel,

ich programmiere zwar nicht in "C", aber es sieht für mich so aus,
als ob Du die Pins B0..B3 mit

  set_tris_b(48);

als Ausgänge setzt. Weiter oben kommentierst Du sie aber als
bidirektional. Ist das richtig so? Wenn Du Lesen und Schreiben willst,
musst Du vor dem Lesen/Schreiben die Pins jeweils immer korrekt auf
Ein- bzw. Ausgang setzen und zwar zum richtigen Zeitpunkt. Machst Du
das auch?

Der richtige Zeitpunkt hängt dabei auch vom Bauteil am anderen Ende der
Datenleitungen ab (hier also vom mt8880c).

MfG
Anderas

Autor: Hofee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
zuerst gewöhne dir mal ab die ganzen Befehle (tris... usw.) im
dezimalformat zu schreiben, das kapiert kein mensch.
besser wäre hex, oder hier sogar bin.

wenn ich das richtig verstehe:

im unterprog. steht
set_tris_b(63) => set_tris_b(0b00111111) // also stellst du RB <0:5>
als eingänge ein, bevor du die Routinen startest? oder ist das in C
anders? bei assembler (so programmiere ich) bedeutet 1 eingang.
eigentlich müsste das funktionieren

dh. das tris_b(48) (= 0b00110000) ist schon ok, was ist an PORTB<5:7>
dran? nichts?

achja... in welchem programm schreibst du die C-Routinen ... würd ich
auch gerne mal machen ... habe nur MPLAB IDE und das ist saukompliziert
in assembler...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.