Schonmal vorweg: Eigentlich programmiere ich auf AVRs :D Habe ein Problem beim programmieren des PIC10F206. Dieser hat 4 Pins: GP0, GP1, GP2, GP3. Ich will alle, aus Ausgänge deklarieren, und auf HIGH schalten. Wie mache ich das? Das Datenblatt ist hier mehr als ungenügend. Vorweg: Ich programmiere in C, Assembler kann ich nur sehr dürftig. Eigentlich müssten das doch 2-3 Zeilen sein, oder? Aber welche? Ist GPIO das Datenrichtungsregister? Was ist TRIS? Ich habe schon die verschiedensten Kombinationen versucht, aber der Controller schält nichts (lässt sich aber mit dem PicKit 1 problemlos beschreiben. Vielleicht kann mir einer nen Beispielausschnitt eines Programmes zeigen, damit ich zumindest die Pins ansprechen kann. Von mir aus auch ein gut (!) kommentierter Assembler-Auszug. Vielen Dank. Ein frustrierter AVR-Programmierer...
Hallo tris steht für TRI State und setzt die Datenrichtung (0=Output, 1=Input, bei Power-On = Input) GPIO ist die Adresse des Ports (General Purpose I/O) tris GPIO, 0x00 ; setzt alle I/O auf Output bsf GPIO, 0 ; setzt Bit 0 auf H (= Pin GP0) bsf GPIO, 1 ; setzt Bit 1 auf H (= Pin GP1) ; usw. oder movlw 0x0F ; alle 4 Bits auf H movwf GPIO ; ausgeben ABER: Du musst die Fuses (oder auch Configuration Word genannt) richtig setzen, damit der Pin GP3 als I/O und nicht als /MCLR arbeitet. Wie man dies macht, ist compiler-spezifisch. Es sollte aber auch im Programmer möglich sein. Wenn Du MPLAB verwendest, im Menü Configure -> Configuration Bits. Viel Spass Severino
TRIS ist das Datenrichtungsregister, GPIO sind die Portdaten. Wenn mich aber nicht alles täuscht ist auf den Ports standardmäßig der analoge Komparator eingeschaltet. Also: 1. Komparator deaktivieren -> Ports für GPIO nutzbar 2. TRIS-Register beschreiben -> Eingang o. Ausgang 3. GPIO-Port lesen o beschreiben.
Carsten Steiner wrote: > Wenn mich aber nicht alles täuscht ist auf den Ports standardmäßig der > analoge Komparator eingeschaltet. Stimmt! Der F206 hat einen Komparator, der zudem per Default eingeschaltet ist. Kapitel 8 im Datenblatt beschäftigt sich mit der Konfiguration des Komparators > 1. Komparator deaktivieren -> Ports für GPIO nutzbar bsf CMCON0, 6 ; "Output of comparator is NOT placed on the COUT pin" bcf CMCON0, 3 ; "Comparator is off" > 2. TRIS-Register beschreiben -> Eingang o. Ausgang Aber: GP3 kann NUR als Eingang konfiguriert werden. > 3. GPIO-Port lesen o beschreiben. Severino
Zunächst: Danke für eure Antworten. Habe jetzt mal versucht das in C zu übersetzen. Jedoch bekomme ich diese Zeile nicht hin: tris GPIO, 0x00 ; setzt alle I/O auf Output Da wird doch der Wert 0x00 ins GPIO geschrieben. Dann müsste "tris" ja ein Befehl sein. Den kennt MPLAB IDE mit CC5X Kompiler aber nicht?! Wollte dann den Assembler-Code mal überspielen, aber mein MPLAB mit MPASM machts nicht, erkennt "GPIO" und "TRIS" nicht, meckert jede Zeile an (bin auch kein ASM Held, hätte es gern in C). Die Configuration-Bits habe ich mal noch gelassen wie sie sind... stehe da gerade mal drüber ;-) Konnte im Datenblatt keine Info finden, dass der Komparator standardmäßig aktiv sein würde.
Nachtrag: Habe das CMCN0 mit Nullen beschrieben, das müsste den Komparator dann ja auch deaktivieren... aber geht trotzdem noch nix :-) Fehlt noch das mit dem TRIS. Mein Programm bis dahin: void main(void) // Start des Hauptprogramms { CMCON0 = 0x00; // Um Komparator (Bit 3 = 0 = disabled) auszuschalten GPIO = 0x00; // Alle Pins als Ausgänge GPIO.0 = 1; // Pins einzeln auf '1' setzen... GPIO.1 = 1; GPIO.2 = 1; GPIO.3 = 1; }
TRIS ist im Prinzip wie DDRx beim AVR. Ein PIC mit mehreren Ports hat natürlich auch für jeden Port ein TRIS-Register (TRISA, TRISB...). Bei den ganz alten PICs (16C54...) gab es wirklich einen speziellen Befehl, um diese Register zu setzen. Bei neueren Typen - und hoffentlich auch beim 10F20x - sind diese als Register im Speicher normal zugänglich. Es müßte also einfach heißen TRIS = 0x00; Vorausgesetzt natürlich, das Register heißt tatsächlich so. Ich hoffe, die Bezeichnung aus dem Datenblatt stimmt mit der im C-Compiler überein.
TRIS is undefined So der Kompiler... TRISA und TRISB kennt er wiederum, jedoch schalten die Ausgänge trotzdem nicht... fluch
Hi Schau dir mal die Header an. Dort sollten die Register drinn stehen. Ich nehme mal an, dass du MPLAB hast und den mitgelieferten CCS-Compiler benutzt. Dann sollte ein Programm zum Port togglen so ungefähr aussehen: [c] void main() { SET_TRIS_B(1); while(1) { OUTPUT_HIGH(PIN_B2); delay_ms(100); OUTPUT_LOW(PIN_B2); delay_ms(100); } } [\c] Fallst du nicht die sonderfunktionden benutzen willst(was ich dir ans herzen lege) Dann musst du zuerst die Register definieren: [c] #byte TRISB = 0x.. // Adresse des TRISB Registers #byte GPIO = 0x... //Adresse des GPIO Registers [\c] Und dann kannst du direkt auf da jeweilige Register schreiben: [c] TRISB=0; // alle als Ausgänge GPIO=255; // Alle GPIOs auf High [\c] mfg Schoasch
Das geht soweit! Kann am Port aber gerade nur GP3 schalten (4,8V), GP2 führt 4,5V, GP1 führt 2,2V und GP0 führt 0V. Aber ich denke das ist noch ein Fehler im CMCON0 (da hab ich gerade 0x0A drin). Danke schonmal soweit! Falls jemand die Lösung für dieses Problem auch noch kennt, würde mich das sehr freuen. Ansonsten stöber ich jetzt nochmal nebenbei im Datenblatt... Danke ihr :-)
Hi GP3 kannst du schalten? Normal kannst du den nur als Eingang benutzen oder als MCLR. GP2: Hast du FOSC4(Oscillator/4 output) und den Comperator richtig eingestellt? Ich muss zugeben, ich hab da auch so meine Probleme gehabt, drumm hab ich den PIC in ASM programmiert. Bei mir war das Problem, dass er auf den TRIS-Befehl nicht so ganz richtig reagiert hat, da das Register nicht direkt beschrieben werden kann. Probiers mal folgende Zeilen mit Inline-ASM einzufügen: [c] movlw b'0000000' ; all output tris GPIO [\c] Und die Fuses sind bei mir: [c] ; Configuration festlegen: ; kein codeprotection ; kein WDT-Timer ; Reset-Pin aktiviert __CONFIG _CP_OFF & _WDT_OFF & _MCLRE_ON [\c] So hats dann bei mir hingehaut. mfg Schoasch
Schoasch wrote:
> Aja und CMCON0 sollte auf 0x00 gesetzt sein.
Wenn bit 6 von CMCON0 gelöscht wird, wird der Output des Komparators auf
den Pin "GP2/T0CKI/COUT/FOSC4" gelegt:
"0 = Output of comparator is placed in the COUT pin"
Deshalb würde ich Bit 6 setzen.
Das Special Function Register TRISGPIO ist nicht in den Adressraum
gemappt, folglich muss hier TRIS GPIO verwendet werden.
Andere Frage: Läuft das Programm im Simulator MPLAB-SIM?
Severino
@Severino: Bit 6 muss nicht unbedingt gesetzt sein. Es gibt da eine kleinen Vermerk: [q] When the comparator is turned on, these control bits assert themselves. When the comparator is off, these bits have no effect on the device operation and the other control registers have precedence. [\q] mfg Schoasch
@Schoasch Hast recht, habe das Kleingedruckte nicht gelesen... Aber ich sage mir immer: Sicher ist sicher... Severino
Danke für die freundliche Hilfe, aber ich bekomms einfach nicht gebacken... Es ist übrigens das erste mal, dass ich mit MPLAB IDE arbeite. Aber ich bekomme keinen Inline Assembler Befehl eingebunden. Schon bei asm ("nop"); oder auch asm {"nop"}; wird folgender Fehler im Output ausgespuckt: asm ("nop"); ^------ Error[1] C:\pictst\main.c 7 : Illegal statement in function 'main' (The syntax can not be compiled. Rewriting is required) In meinen Configuration Bits kann ich übrigens nur folgende Einstellungen treffen: Watchdog Timer: hab ich ausgeschaltet Master Clear Enable: hab ich auf "Function as GP3" gestellt Code Protect: ebenfalls ausgeschaltet Jemand noch eine Idee?
Es gibt, je nach verwendetem C-Complier, auch andere Methoden, Assemblercode auszuweisen, wie z.B. #asm ... #endasm
Vielen Dank, damit gelingt es mir schon mal den ASM-Teil einzubinden. Mein Programm sieht jetzt wie folgt aus:
1 | void main(void) // Start des Hauptprogramms |
2 | {
|
3 | // Settings in ASM
|
4 | #asm
|
5 | _WDT_OFF
|
6 | _MCLRE_ON
|
7 | bsf CMCON0, 6 ; Bit 6 auf 1 -> "Output of comparator is NOT placed on the COUT pin" |
8 | bcf CMCON0, 3 ; Bit 3 auf 0 -> "Comparator is off" |
9 | movlw b'0000000' ; Alle Pins als Ausgaenge |
10 | tris GPIO |
11 | #endasm
|
12 | |
13 | // Start
|
14 | GPIO = 0x0F; // Ausgeben! |
15 | }
|
Ich kann GP0 und GP1 problemlos schalten (0 oder 4,8V). Aber mein GP2 führt nie das, was ich im sage: Spreche ich ihn an, führt er 0V, schalte ich ihn aus, führt er 3,6V?! Und mein GP3 ist dauerhaft auf 4,8V, lässt sich nicht abschalten. Ich wälze gerade das Datenblatt aber komme hier nicht mehr weiter... Habe nur auf im Kapitel 8 (CMCON0) gefunden: Note 1: Overrides T0CS bit for TRIS control of GP2. Wenn damit das CMPT0CS gemeint ist (Bit 4 im CMCON0) so bewirkt eine Änderung dieses Bits bei mir momentan gar nichts?! Vielleicht kann mir ja jemand die Tomaten von den Augen nehmen... danke euch schonmal herzlichst.
Fast schon peinlich... das Problem mit dem Pin GP3 hat sich erledigt, dieser ist auf dem PicKit 1 mit einem Taster verbunden, dazwischen hängt ein PullUp. Jetzt noch GP2 gangbar machen und ich denke ich komme klar...
Ja... ich habs geahnt, auch GP2 ist extern auf dem Board beschaltet. Es geht jetzt also, vielen vielen Dank euch. Ihr habt meinen Tag gerettet...
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.