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
> bsf GPIO, GP2 > bsf GPIO, GP4 > bsf GPIO, GP5 Und was kommt danach? Nichts? Dann ist das dein Problem;)
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!
>> 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?
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...
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?
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.
OK, vielen Dank nochmal für deine Hilfe!!! Ich denke jetzt kann ich mit dem Programm weiter machen. Schönen Abend noch! Mfg Virus744
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
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
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....;-)
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
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
Schau mal bei sprut.de unter Fallen. Dort erklärt er recht gut, was mit der I/O-Falle gemeint ist.
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
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
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 |
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.