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


von Marcel Peters (Gast)


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

von Andreas Jäger (Gast)


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

von Hofee (Gast)


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...

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.