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
Du hast immer nur 6 Bit programmiert, es sollten eigentlich 8 Bit sein, wobei Bit 4-7 nicht benutzt wird.
probier mal diesen Code:
#include <xc.h>
void main()
{
TRIS = 0x0d; //Bit 1 Ausgang
GPIO = 0x02; //Bit 1 setzen
while(1); //Endlosschleife
}
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
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()?
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ß
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
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.
Zitat von: Dansen in 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.
BTW:
Anfangs hattest du ja GP1 verwendet - Da muss dann der Comparator abgeschaltet sein ;-)
CMCON0bits.CMPON = 0;