D

PIC10F206

Begonnen von Dansen, 09.08.2022, 08:02:53 CEST

⏪ vorheriges - nächstes ⏩

Dansen

Hallo an alle,

für ein aktuelles Firmen-Projekt muss ich mich leider mit dem PIC10F206 befassen. Erste Schritte durfte ich mit einem PIC10F32. Der PIC10F32 gestaltete sich dabei einfach und direkt. In dem PIC10F206 hab ich jedoch leider meinen Meister gefunden. Ich sitz seit Tagen daran, den Burschen zum laufen zum Bringen, leider ohne Erfolg. Ich hoffe, das eventuell jemand erfahrenes hier eine Idee hätte, wie ich das Ding zum laufen kriege.

Den PIC10f206 programmiere ich in C

Code:

#include <xc.h>

void main()
{
    TRIS = 0b111101;
    
    GPIO = 0b000010;
            
       for(;;)
       {
           ;
       } 

}

Der Code ist dabei relativ primitiv gehalten. Ich würde gerne lediglich einen Pin auf HIGH setzen.
Als Compiler nutz ich den XC8.

Ebenfalls probiert hab ich eine alte MPLAB Version zu installieren und mit dem HI-TECH Compiler zu programmieren. Leider ohne Erfolg. Hab bisher um die 4 PICS probiert, um Hardwareprobleme auszuschließen. Als Programmiergerät nutz ich den Pickit 3.

Ich bedanke mich für die Zeit und für jeden Vorschlag
Gruß,
Dansen

pic18

#1
Du hast immer nur 6 Bit programmiert, es sollten eigentlich 8 Bit sein, wobei Bit 4-7 nicht benutzt wird.
probier mal diesen Code:

Code: c
#include <xc.h>
 
void main()
{
    TRIS = 0x0d;  //Bit 1 Ausgang
    
    GPIO = 0x02;  //Bit 1 setzen
            
    while(1);  //Endlosschleife
}

Dansen

Hallo!

ich bin jetzt nach mehreren Tagen endlich auf das Problem gekommen.

Problem 1:
Das OPTION Register muss initialisiert werden. selbst wenn man es nur mit 0 beschreibt.

Problem 2:
Das war an dem Beispiel jetzt nicht ersichtlich, aber ich hatte teilweise auch mit der Funktion __delay_ms() gearbeitet. Diese ist so auch nicht korrekt(dazu hab ich bislang keine Antwort gefunden, wieso das so ist). Ich bin jetzt auf _delay() umgestiegen. Jetzt kann ich den PIC programmieren wie ich will.

Ich find es ziemlich erstaunlich, wie wenig es zu diesem Pic gibt außerhalb von Assembler das nicht entweder 15 Jahre alt ist, oder nicht funktional ist. Für all die, die selbst mal auf das Problem stoßen sollten, hier mal ein Code der zumindest bei mir geklappt hat:


 
#include <xc.h>
#pragma config WDTE = OFF       // Watchdog Timer (WDT disabled)
#pragma config CP = OFF         // Code Protect (Code protection off)
#pragma config MCLRE = OFF      // Master Clear Enable (GP3/MCLR pin fuction is digital I/O, MCLR internally tied to VDD)


#define RA0 GPIObits.GP0 // INPUT AUXON
#define RA1 GPIObits.GP1 // INPUT CARON
#define RA2 GPIObits.GP2 // OUTPUT RELPWM

void main(void) {
    OPTION = 0b10010000;	// DIESES REGISTER MUSS INITIALISIERT WERDEN SONST RUINIERT ES DEINE WOCHE
    CMCON0 = 0b00000000;	// Komparator Register ebenfalls mit 0 initialisieren(muss nicht unbedingt sein)
    TRIS = 0b11111011;          //GP2 als Output
  
    while(1){
        
        if(RA0 == 1 || RA1 == 1)
        {
            RA2 = 1;
            _delay(500);   //~500us delay
        }
        else
        {
            RA2 = 0;
        }
    } 
        
    return;
}

Hier werden GPIO 0 und 1 gelesen, wenn HIGH, dann schaltet GPIO 2 auf HIGH

vloki

Bist du dir da ganz sicher mit dem OPTION Register?
Lag der Fehler nicht nur an den fehlenden Configuration-Bits?

Was war denn das Problem mit __delay_us()?
MPLABX  XC8  KiCAD

Dansen

Hallo,

Die Bits 0-3 sind laut Datenblatt zur Initialisierung von GPIO 0-3. Die letzten 4 Bits sind nicht implementiert. Ich hab es sowohl mit den fehlenden Konfigurationsbits, als auch ohne die fehlenden Konfigurationsbits getestet. Beides funktionierte bei mir. Laut meinem Verständnis wird zuerst ins Bit mit dem niedrigsten Stellenwert geschrieben wird. Da alles hinter Bit 3 nicht implementiert ist, sollte das keine Rolle spielen.

Wenn allerdings die Initialisierung des OPTION Registers auskommentiert wird, funktioniert Garnichts mehr. Ich lade allerdings hierzu gerne zum selbst testen ein.

Gruß


Peter

Hallo
Ich habe es mal ohne CMCON und OPTION Register versucht.
Obwohl ich keine Register benutzt habe sind im Assembler Code die
beiden Register drin. Schon sehr komisch. Anscheinend müssen die da rein.

Hier der Code.

;Set up the assembler options (Chip type, clock source, other bits and pieces)
 LIST p=10F206, r=DEC
#include <P10F206.inc>
 __CONFIG _MCLRE_OFF & _WDTE_OFF & _OSC_INTRC

;********************************************************************************

;Set aside memory locations for variables
DELAYTEMP	EQU	8
DELAYTEMP2	EQU	9
SysWaitTempMS	EQU	10
SysWaitTempMS_H	EQU	11

;********************************************************************************

;Vectors
;Start of program memory page 0
	ORG	0
BASPROGRAMSTART
;Call initialisation routines
	call	INITSYS

;Start of the main program
;''A demonstration program for GCGB and GCB.
;''--------------------------------------------------------------------------------------------------------------------------------
;''This program blink one LED on GPIO.0 (bit 1)  using the Toggle command.
;''The LED must be attached via appropiate resistors.
;''@author EvanV plus works of HughC
;''@licence GPL
;''@version 1.0a
;''***************************************************************************
;Chip Settings
;dir GPIO out
	clrw
	tris	GPIO
;none specified in the example. All byte variables are defined upon use.
;Do Forever
SysDoLoop_S1
;set GPIO.1 on
	bsf	GPIO,1
;Wait 500 ms
	movlw	244
	movwf	SysWaitTempMS
	movlw	1
	movwf	SysWaitTempMS_H
	call	Delay_MS
;set GPIO.1 off
	bcf	GPIO,1
;wait 500 ms
	movlw	244
	movwf	SysWaitTempMS
	movlw	1
	movwf	SysWaitTempMS_H
	call	Delay_MS
;Loop
	goto	SysDoLoop_S1
SysDoLoop_E1
;You can toggle any number of pins by addressing the bits using this method
;Toggle PORT, BIT
BASPROGRAMEND
	sleep
	goto	BASPROGRAMEND

;********************************************************************************

Delay_MS
	incf	SysWaitTempMS_H, F
DMS_START
	movlw	142
	movwf	DELAYTEMP2
DMS_OUTER
	movlw	1
	movwf	DELAYTEMP
DMS_INNER
	decfsz	DELAYTEMP, F
	goto	DMS_INNER
	decfsz	DELAYTEMP2, F
	goto	DMS_OUTER
	decfsz	SysWaitTempMS, F
	goto	DMS_START
	decfsz	SysWaitTempMS_H, F
	goto	DMS_START
	retlw	0

;********************************************************************************

INITSYS
;CMCON0 = 7
	movlw	7
	movwf	CMCON0
;movlw b'11001111'
	movlw	B'11001111'
;option
	option
;GPIO = 0
	clrf	GPIO
	retlw	0

;********************************************************************************


 END

Dansen

Hallo,

Assembler gehört jetzt leider nicht zu meiner Paradedisziplin. Hab ich das jetzt richtig verstanden, das im Assembler dieser Schritt nicht notwendig ist, jedoch bei der C-Version gemacht werden muss? Riecht für mich irgendwie nach Compiler-Fehler, falls man davon reden darf.

vloki

Zitat von: Dansen am 09.08.2022, 12:17:05 CESTWenn allerdings die Initialisierung des OPTION Registers auskommentiert wird, funktioniert Garnichts mehr. Ich lade allerdings hierzu gerne zum selbst testen ein.
Es funktioniert nur der Ausgang GP2 nicht mehr, weil:
Note: If the T0CS bit is set to '1', it will override
the TRIS function on the T0CKI pin.
MPLABX  XC8  KiCAD

vloki

BTW:
Anfangs hattest du ja GP1 verwendet - Da muss dann der Comparator abgeschaltet sein ;-)

CMCON0bits.CMPON = 0;
MPLABX  XC8  KiCAD

Schnellantwort

Name:
Verifizierung:
Bitte lassen Sie dieses Feld leer:

2 Beeren und 2 Bananen. Welche Farbe hat die Banane ?:
Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau