Forum: Mikrocontroller und Digitale Elektronik PIC12F675 GPIO-Ports


von Virus 7. (virus744)


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

von holger (Gast)


Lesenswert?

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

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

von Virus 7. (virus744)


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!

von holger (Gast)


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?

von Virus 7. (virus744)


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...

von Flo (Gast)


Lesenswert?

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

von Virus 7. (virus744)


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?

von Flo (Gast)


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.

von Virus 7. (virus744)


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

von kokisan2000 (Gast)


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

von kokisan2000 (Gast)


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

von Virus 7. (virus744)


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....;-)

von Flo (Gast)


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

von kokisan2000 (Gast)


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
1
/ Zuordnung der Farben an den Bits im GPIO
2
#define BLUE_BIT   4  
3
#define GREEN_BIT  2
4
#define RED_BIT    1     
5
#define SET_PORT  {GPIO = PortSchatten;}
6
7
#define SETBIT(ADRESS, BIT)    (ADRESS = (ADRESS | (1<<BIT)))
8
#define CLEARBIT(ADRESS, BIT)  (ADRESS = (ADRESS & ~(1<<BIT)))
9
#define CHECKBIT(ADRESS, BIT)  (ADRESS & (1<<BIT))
10
#define TOGGLEBIT(ADRESS, BIT) (ADRESS = (ADRESS ^(1 << BIT)))
11
12
#define SET_RED_LED    (SETBIT (PortSchatten, RED_BIT))  
13
#define CLEAR_RED_LED  (CLEARBIT (PortSchatten, RED_BIT))
14
15
#define SET_GREEN_LED   (SETBIT (PortSchatten, GREEN_BIT))  
16
#define CLEAR_GREEN_LED (CLEARBIT (PortSchatten, GREEN_BIT))
17
18
#define SET_BLUE_LED    (SETBIT (PortSchatten, BLUE_BIT))
19
#define CLEAR_BLUE_LED  (CLEARBIT (PortSchatten, BLUE_BIT))
20
21
unsigned char PortSchatten = 0;  // Schattenregister fuer den Port
22
23
/////////////////////////////////////////////////////////////////////
24
// Function : FehlerAnzeige
25
// Include  : zeigt einen Fehler an durch kurzes Blinken der roten LED
26
/////////////////////////////////////////////////////////////////////
27
28
void FehlerAnzeige (void) 
29
30
{ SET_STATUS_LED;  // Bit ändern im Schattenregister
31
  SET_PORT;        // Schattenregister -> zum Port schreiben (ganz!)
32
33
  DelayMs(10);
34
35
  CLEAR_STATUS_LED;
36
  SET_PORT;
37
}

Ich hoffe es hilft Dir ...

Gruß
kokisan2000

von Sven S. (stepp64) Benutzerseite


Lesenswert?

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

von kokisan2000 (Gast)


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

von Virus 7. (virus744)


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

von Flo (Gast)


Lesenswert?

Ich denke dass es so funktionieren sollte.
1
  list p=12f675
2
  include "p12f675.inc"
3
4
  cblock 0x20
5
  LATIO                     ;Das von kokisan2000 erwähnte Schattenregister 
6
  endc                      ;LATIO in anlehnung an LATA, LATB usw. bei PIC18...
7
  
8
org 0x0000      
9
  
10
INIT  
11
    bcf     STATUS, RP0     ;Bank 0
12
    clrf    GPIO            ;init GPIO
13
    clrf    LATIO
14
    movlw   3Fh             ;setze GP<5:0> als
15
    movwf   CMCON           ; digtal IO
16
    bsf     STATUS, RP0     ;Bank 1
17
    clrf    ANSEL           ;analoge Ports abschalten
18
    movlw   0Bh             ;setze GP<0:1> und GP3 als Input
19
    movwf   TRISIO          ; und GP2 und GP<4:5> als Output
20
  
21
MAIN
22
    bsf     LATIO, 2        ;bsf  GPIO, GP2  
23
    bsf     LATIO, 4        ;Anstatt die Bits in GPIO zu setzen/löschen
24
    bsf     LATIO, 5        ;werden die Bits im Data Latch gesetzt, 
25
    movf    LATIO, w        ;und dieses anschliesend auf den Port geschrieben.
26
    movwf   GPIO            ; --> kein read-modify-write
27
  
28
    end

von Flo (Gast)


Lesenswert?

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

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