Schaffe es nicht I2C Master auf dem PIC12F1840 zum laufen zu bringen.
Laut den Beispielen müsste es mit dieser Initialisierung funktionieren.
Nach dem senden der Startbedingung wartet er auf das Interruptflag, was
aber nicht kommt.
Sieht hier jemand zufällig den Fehler?
Ist die Hardware in Ordnung, hast du die Pullups am I2C?
P.S: Fürs Auswählen der RAM-Banken, würde ich BANKSEL verwenden. Ist
übersichtlicher und man muss nicht nachschauen in welcher Bak jedes
Register ist.
Pullups sind dran (10k). Hardware ist in Ordnung. Ich habe immer eine
LED angeschlossen, mit der ich feststellen kann, wie weit die Software
läuft. Programmer ist nicht angeschlossen, da einer der I2C-Pins auch
für die Programmierung/Debugging verwendet wird.
Ich verwende den Internen Quarz mit 16MHz und eine Spannung von 3V3.
Max H. schrieb:> P.S: Fürs Auswählen der RAM-Banken, würde ich BANKSEL verwenden. Ist> übersichtlicher und man muss nicht nachschauen in welcher Bak jedes> Register ist.
banksel finde ich im instruction set nicht, aber das:
MOVLB Move literal to BSR
Syntax: [ label ] MOVLB k
Operands: 0 <= k <= 15
Operation: k -> BSR
Status Affected: None
Description: The five-bit literal ‘k’ is loaded into the
Bank Select Register (BSR).
michael "meikel" D. schrieb:> banksel finde ich im instruction set nicht, aber das:
Banksel ist auch kein Befehl, sondern ein Macro.
Wenn du banksel TRISA schreibst, mach der Assembler das daraus:
MOVLB 0x1
Er schaut also nach, in welcher Bank sich das Register befindet und
erstellt automatisch den MOWLB Befehl.
http://www.sprut.de/electronic/pic/assemble/pseudo.html#banksel
Banksel ist kein "richtiger" Maschinenbefehl, sondern ein Makro. Es wird
vom Assembler in passende Befehle umgesetzt, die auf die passende Bank
umschalten.
Max H. schrieb:> michael "meikel" D. schrieb:>> banksel finde ich im instruction set nicht, aber das:> Banksel ist auch kein Befehl, sondern ein Macro.
OK und danke für die Info.
As B- schrieb:> ; CONFIG1> ; __config 0xF9E4> __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON &> _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_ON & _FCMEN_ON> ; CONFIG2> ; __config 0xFFFF> __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_ON & _BORV_LO &> _LVP_OFF>> init> ; Internen Oszillator auf 16 MHz einstellen> banksel OSCCON> movlw b'01111010'> movwf OSCCON>> return
Ist das eigentlich der komplette Sourcecode, und wie hast du erkannt,
dass das SSP1IF gesetzt wird.
Laut diesem Code, sollte der PIC das OSCCON beschreiben und dann ins
nichts return'en: Stack Underflow + _STVREN_ON ==> Reset.
Und das END am Ende fehlt. Da es der Assembler ohne end gar nicht
assemblieren würde, vermute ich, dass es nicht der gesamte Code ist...
Für meinen Geschmack fehlen die ORG Anweisungen:
Ich beginne meine ASM Programme immer so
1
ORG 0x00
2
goto init
3
ORG 0x04 ;Interrupt Vector
4
retfie ;Wenn mit Interrupts: Die ISR oder GOTO isr
Ich weiss nicht, ob es daran liegt, aber schau 'mal in die Beschreibung
von SSP1CON3:
bit 5 SCIE: Start Condition Interrupt Enable bit (I2C mode only)
1 = Enable interrupt on detection of Start or Restart conditions
0 = Start detection interrupts are disabled(2)
1. Es war nicht das gesamte Programm, sondern nur die Teile die mit der
MSSP Schnittstelle arbeiten.
2. Ich lasse eine LED leuchten, wenn das Interruptbit gesetzt ist.
Diesen Befehl schiebe ich immer weiter nach hinten. Daher weiß ich, ob
das Programm dort vorbeikommt.
3. Ich warte jetzt, bis der Oszillator stabil läuft. Jetzt geht es auch.
Jetzt nur noch das Display in Gang bringen.
Hallo, kann mir jemand von euch sagen, warum das Flag einfach nicht
gesetzt wird beim Masterbetrieb und senden?? Ich verzweifele, denn ich
kann überhaupt nicht erkennen, wann er fertig mit dem einem Byte ist
bzw. bereit für das erste Byte. Mit einer festen Zeitschleife krieg ich
es hin, aber das ist doch Pillepalle. Danke