www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC10F206 - Port schalten?


Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Carsten St. (carsten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;
}

Autor: Sebastian Eckert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TRIS is undefined
So der Kompiler...

TRISA und TRISB kennt er wiederum, jedoch schalten die Ausgänge trotzdem 
nicht...

fluch

Autor: Sebastian Eckert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man könnte mal TRISGPIO probieren.

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 :-)

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aja und CMCON0 sollte auf 0x00 gesetzt sein.

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Schoasch

Hast recht, habe das Kleingedruckte nicht gelesen...

Aber ich sage mir immer: Sicher ist sicher...

Severino

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Sebastian Eckert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt, je nach verwendetem C-Complier, auch andere Methoden, 
Assemblercode auszuweisen, wie z.B.

#asm

...

#endasm

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, damit gelingt es mir schon mal den ASM-Teil einzubinden.

Mein Programm sieht jetzt wie folgt aus:
void main(void)        // Start des Hauptprogramms
{
  // Settings in ASM
  #asm
  _WDT_OFF
  _MCLRE_ON
  bsf CMCON0, 6       ; Bit 6 auf 1 -> "Output of comparator is NOT placed on the COUT pin"
  bcf CMCON0, 3        ; Bit 3 auf 0 -> "Comparator is off"
  movlw   b'0000000'      ; Alle Pins als Ausgaenge
    tris    GPIO  
  #endasm

  // Start
  GPIO = 0x0F;      // Ausgeben!
}

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.


Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

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.