PIC12F675 GPIO-Ports

OP #1479055
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
OP #1479103
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?
Gast #1479107
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.
Gast #1479136
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
Gast #1479141
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
Gast #1479222
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
Gast #1479234
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
OP #1479276
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
Gast #1479320
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren