www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC12F675 GPIO-Ports


Autor: Virus 744 (virus744)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich sitzte schon sehr, sehr lange an dem Problem die GPIO-Ports des 
PIC12F675 einzurichten.
GP0,1,3 sollen digitale Eingäne sein, und GP2,4,5 digitale Ausgänge.

Wenn ich das Programm jedoch debugge, dann machen die Ports im Watch was 
sie wollen, nur nicht von high auf low und umgehkehr springen......

Kann mir jemand bei dem Problem helfen?



START
    bcf     STATUS, RP0     ;Bank 0
    clrf    GPIO            ;init GPIO
    movlw   3Fh             ;setze GP<5:0> als
    movwf   CMCON           ; digtal IO
    bsf     STATUS, RP0     ;Bank 1
    clrf    ANSEL           ;analoge Ports abschalten
    movlw   0Bh             ;setze GP<0:1> und GP3 als Input
    movwf   TRISIO          ; und GP2 und GP<4:5> als Output


    bsf     GPIO, GP2
    bsf     GPIO, GP4
    bsf     GPIO, GP5

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>    bsf     GPIO, GP2
>    bsf     GPIO, GP4
>    bsf     GPIO, GP5

Und was kommt danach? Nichts? Dann ist das dein Problem;)

Autor: Virus 744 (virus744)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die schnelle Antwort!

Leider kann ich dir nicht ganz folgen....

>    bsf     GPIO, GP2
>    bsf     GPIO, GP4
>    bsf     GPIO, GP5


ich schalte nacheinander die Ausgänge auf high....

was stimmt daran nicht?

Danke schonmal für weitere Antworten!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>    bsf     GPIO, GP2
>>    bsf     GPIO, GP4
>>    bsf     GPIO, GP5


>ich schalte nacheinander die Ausgänge auf high....

>was stimmt daran nicht?

Das ist ok. Aber was machst du danach?

Autor: Virus 744 (virus744)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na beim PIC18 reicht es bis hierhin aus, dass im Watch die Ausgänge auf 
high gehn.
Wie müsste der CODE denn beim PIC12 in meinem Fall lauten?

Habe gro0e Probleme vom PIC18 auf den kleinen PIC12 zu wechseln...

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du vor dem Zugriff auf GPIO auch wieder auf Bank 0 umgeschaltet?

Autor: Virus 744 (virus744)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank!!!!

Ich wusste nicht, dass ich da wieder auf Bank0 schalten muss.
Das mit den Bank0 und Bank1 verwirrt mich noch total....
...wann muss ich immer die Bänke wechseln? Nur wenn ein Register in 
einer anderen Bank liegt? Kann ich jetzt z.B. in Bank 1 bleiben, bis ich 
wieder ein Register in Bank 0 ansprechen will?

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich bleib eigentlich immer in Bank 0, und nur wenn ich ein Register 
aus Bank 1 benötige schalte ich um. Du kannst aber auch in Bank 1 
bleiben solange du kein Register in Bank 0 ansprechen willst.

Autor: Virus 744 (virus744)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, vielen Dank nochmal für deine Hilfe!!!
Ich denke jetzt kann ich mit dem Programm weiter machen.

Schönen Abend noch!

Mfg
Virus744

Autor: kokisan2000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Virus744,

ich arbeite mit der ganzen PIC Familie und hatte anfänglich auch größere 
Probleme mit den "Kleinen". Ich bezweifel, dass Du Probleme beim 
Bank-Switching hast, sondern die Problematik durch den Wechsel von 
Schreib und Lesebefehlen kommt.
Schau doch einmal in das Datenblatt des PIC und suche nach dem Begriff 
"read-modify-write" und Du wirst das Problem finden.
Beim PIC 12Fxxx musst Du ein Schattenregister programmieren, also eine 
Variable, die an Stelle des GPIO in Deiner Software genutzt wird. Alle 
Aktivitäten, also Setzen und Löschen von Bits erfolgen in diesem 
Schattenregister (Variable), die Du dann als ganze VAriable auf den Port 
schreibst. Somit werden IMMER alle Pins geschrieben.

Ich habe seitdem nie wieder Probleme mit dem PIC12Fxx gehabt. Die 
größeren PICS wie z.B die 18er haben hier einen Schutzmechanismus und 
kennen das Problem nicht.

Gruß
kokisan2000

Autor: kokisan2000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier der Ausschnitt aus dem Datenblatt zum PIC 12F683:

"Reading the GPIO register reads the status of the pins,
whereas writing to it will write to the port latch. All write
operations are read-modify-write operations. Therefore,
a write to a port implies that the port pins are read,
this value is modified and then written to the port data
latch."

Gruß
kokisan2000

Autor: Virus 744 (virus744)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry  kokisan2000,
aber ich verstehe nur teilweise was du mir damit sagen willst...
Kannst du mir vielleicht ein kleines Bsp. geben?

Also das mit den kleinen PIC12 hats schon in sich....;-)

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In diesem Datenblatt in Kapitel 9.10.1 (S. 154) wird das von kokisan2000 
angesprochene Problem beschrieben. Hatte bisher aber keine Probleme 
damit. http://ww1.microchip.com/downloads/en/devicedoc/33023a.pdf

Autor: kokisan2000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schwierig, aber ich versuche es mal ... aber nicht in Assembler ....

erst mal etwas zur Vorgangsweise:

1) in meinem Sourcecode greife ich niemals direkt schreibend auf 
einzelne Bits des Ports zu
2) an Stelle des Ports definiere ich ein sogenanntes Schattenregister 
(unsigned char); die einzelnen Bits dieser Variable sind stellvertretend 
die Bits im Port; in dieser Variable tobe ich mich aus und mache alles 
was ich sonst direkt mit dem Port machen würde (ausser Schreiben).
3) wenn ich ein Bit lesen will, lese ich direkt das Bit im GPIO
4) wenn ich ein Bit ändern und ausgeben möchte, ändere ich das 
Schattenregister und schreibe das Schttenregister (ganze Variable) in 
das GPIO
/ Zuordnung der Farben an den Bits im GPIO
#define BLUE_BIT   4  
#define GREEN_BIT  2
#define RED_BIT    1     
#define SET_PORT  {GPIO = PortSchatten;}

#define SETBIT(ADRESS, BIT)    (ADRESS = (ADRESS | (1<<BIT)))
#define CLEARBIT(ADRESS, BIT)  (ADRESS = (ADRESS & ~(1<<BIT)))
#define CHECKBIT(ADRESS, BIT)  (ADRESS & (1<<BIT))
#define TOGGLEBIT(ADRESS, BIT) (ADRESS = (ADRESS ^(1 << BIT)))

#define SET_RED_LED    (SETBIT (PortSchatten, RED_BIT))  
#define CLEAR_RED_LED  (CLEARBIT (PortSchatten, RED_BIT))

#define SET_GREEN_LED   (SETBIT (PortSchatten, GREEN_BIT))  
#define CLEAR_GREEN_LED (CLEARBIT (PortSchatten, GREEN_BIT))

#define SET_BLUE_LED    (SETBIT (PortSchatten, BLUE_BIT))
#define CLEAR_BLUE_LED  (CLEARBIT (PortSchatten, BLUE_BIT))

unsigned char PortSchatten = 0;  // Schattenregister fuer den Port

/////////////////////////////////////////////////////////////////////
// Function : FehlerAnzeige
// Include  : zeigt einen Fehler an durch kurzes Blinken der roten LED
/////////////////////////////////////////////////////////////////////

void FehlerAnzeige (void) 

{ SET_STATUS_LED;  // Bit ändern im Schattenregister
  SET_PORT;        // Schattenregister -> zum Port schreiben (ganz!)

  DelayMs(10);

  CLEAR_STATUS_LED;
  SET_PORT;
}

Ich hoffe es hilft Dir ...

Gruß
kokisan2000

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal bei sprut.de unter Fallen. Dort erklärt er recht gut, was mit 
der I/O-Falle gemeint ist.

Autor: kokisan2000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Flo,

Deine PDF bringt es auf den Punkt!

Ich habe die Probleme beim PIC12Fxxx immer dann, wenn ich abwechselnd 
einzelne Bits einlese und schreibe. Die Bits scheinen dann ein 
Eigenleben zu haben (kann man beim Debuggen gut beobachten) ...

Die größeren Pics haben an den Portpins ein eingebautes Schattenregister 
in Hardware ;-)

Gruß
kokisan2000

Autor: Virus 744 (virus744)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Freunde,

also gelesen ahb ich mal das Kapotel in dem PDF, jedoch muss ich sagen, 
dass ich heute nacht nicht mehr so ganz den Hintergrund verstehe...
...Ich werde im Laufe des morgigen Tages mal einen neuen Anlauf 
starten;-)

Trotzdem danke an euch alle!

Melde mich morgen wieder.

Falls jemand noch etwas über diese Schattenregister beitragen kann, wäre 
ich ihm sehr dankbar!!!!!!

Gruß Virus

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke dass es so funktionieren sollte.
  list p=12f675
  include "p12f675.inc"

  cblock 0x20
  LATIO                     ;Das von kokisan2000 erwähnte Schattenregister 
  endc                      ;LATIO in anlehnung an LATA, LATB usw. bei PIC18...
  
org 0x0000      
  
INIT  
    bcf     STATUS, RP0     ;Bank 0
    clrf    GPIO            ;init GPIO
    clrf    LATIO
    movlw   3Fh             ;setze GP<5:0> als
    movwf   CMCON           ; digtal IO
    bsf     STATUS, RP0     ;Bank 1
    clrf    ANSEL           ;analoge Ports abschalten
    movlw   0Bh             ;setze GP<0:1> und GP3 als Input
    movwf   TRISIO          ; und GP2 und GP<4:5> als Output
  
MAIN
    bsf     LATIO, 2        ;bsf  GPIO, GP2  
    bsf     LATIO, 4        ;Anstatt die Bits in GPIO zu setzen/löschen
    bsf     LATIO, 5        ;werden die Bits im Data Latch gesetzt, 
    movf    LATIO, w        ;und dieses anschliesend auf den Port geschrieben.
    movwf   GPIO            ; --> kein read-modify-write
  
    end


Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt hab ich auch das umschalten auf Bank 0 vergessen ;)

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.