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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.