PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wieder mal der 16F88 ...



kante23
11.12.2007, 23:48
Hy,
wer hier ein bischen aufmerksam gelesen hat wird feststellen, dass ich mich schon seit einigen Tagen mit dem 16f88er rumplage und einfahc nicht weiterkommen. Da mir (bis jetzt) keine so wirklich geantwortet hat (in dem anderen Thread) hab ich jetzt mal versucht von Unten heran zu gehen, sprich, ersteinmal ein simples Lauflicht zu programmieren. Das hat eigentlich auch ganz gut geklappt; dann wollte ich den AD-Wandler programmieren und das Ergebniss über 8 LEDs (RB<0:7>) ausgeben. Dazu hab ich erstmal folgenden Code geschrieben (um zu testen, ob er mir überhaupt eine Variable über die LEDs ausgibt).


list p=16f88
__config _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _WDT_OFF & _LVP_OFF & _INTRC_IO & _MCLR_OFF & _BODEN_OFF & _PWRTE_ON
__config _CONFIG2, _IESO_OFF & _FCMEN_OFF

#include p16f88.inc

var equ 0x20

org 0x00
goto _main

org 0x04
goto _main

_main

;2Mhz
banksel OSCTUNE
clrf OSCTUNE
banksel OSCCON
movlw B'00001110'
movwf OSCCON

;alle als DIgiatle I/O
banksel ANSEL
movwf 0x00
movlw ANSEL

; alle RBs als Out
banksel TRISB
clrf TRISB


banksel var
movlw B'11111111'
movwf var

call _set_bin

;Endlosschleife
_l
nop
goto _l

;setzten jeder einzelnen LED auf an (1 in var) oder aus(0 in var)
_set_bin
btfsc var, 0
bsf PORTB, 0
btfss var, 0
bcf PORTB, 0

btfsc var, 1
bsf PORTB, 1
btfss var, 1
bcf PORTB, 1

btfsc var,2
bsf PORTB, 2
btfss var, 2
bcf PORTB, 2

btfsc var, 3
bsf PORTB, 3
btfss var, 3
bcf PORTB, 3

btfsc var, 4
bsf PORTB, 4
btfss var, 4
bcf PORTB, 4

btfsc var, 5
bsf PORTB, 5
btfss var, 5
bcf PORTB, 5

btfsc var, 6
bsf PORTB, 6
btfss var, 6
bcf PORTB, 6

btfsc var, 7
bsf PORTB, 7
btfss var, 7
bcf PORTB, 7
return


return

end


So der Code ist ja eigentlich ganz Simpel. Blos ist das Ergebnis unbefriedigend. Und zwar "aktiviert" er alle LEDs bis auf Nr. 6 .Die bleibt bei diesem Programmablauf aus. Aber wenn ich "bsf PORTB, 6" expliziet aufrufe, dann geht sie an.
Deshalb denk ich, dass ich bei der Intialisierung etwas vergsse, oder falsch mache.
Ich versteh diesen Kontroller einfach nicht.
Ich hoffe es findet sich jemand der ihn shcon einmal erfolgreich programmiert hat, da ich ihn eigentlich wirklich super finde (preisgünstig, ADW, 4k, SSP, I²C, USART ...) und nun auch 3 Stück davon zuhause habe. Leider scheint er nicht alzu verbreitet zu sein, da ich auch keinen guten beispielcode dazu bis jetzt gefunden habe.
Vlt kennt jemand ja einen bzw. kann mir einen von sich schicken
liebe Grüße Kante

Enrock
12.12.2007, 09:45
Servus,

schau doch einfach mal hier:

http://www.winpicprog.co.uk/pic_tutorial.htm Mit dem Tutorial habe ich auch angefangen. Dazu habe ich die einzelnen Programme für meinen Controller umgeschrieben.

Änder die Config, die Include-Datei und achte auf die Ports. Dann sollte das funktionieren!
In Tutorial 11 ist wunderbar erklärt, wie man die ADC Geschichte angeht!

Gruß

kante23
12.12.2007, 14:02
Hy,
vielen Dank für den Link. Ich werd ihn mir mal anschauen.
Mein Problem ist ja nicht genereller Natur. Hab ja schon einiges mit dem 16f28a auf die Beine gestellt, bekomme das selbe halt blos nicht auf dem 16f88 hin. Deswegen suche ich ja jemanden, der auch den 88er benutzt.
Welchen Controller benutzt du den?
liebe Grüße Kante

HF SHOOTER
12.12.2007, 19:24
Hi,

ich würde dir Empfehlen MCLR nicht als I/O zu verwenden wenn man den Pin nicht unbedingt benötigt und lieber ihn als Reseteingang beläst, sonst könntest Du Probleme bekommen wenn Du ihn wieder Programmieren willst wenn das dein Brenner nicht unterstützt.

Im OSCON Register legst Du mit Bit6:4 die Frequenz des int. Oszilators fest. So wie Du hier alle 3 auf 0 hast, läuft er mit 31,5 kHz.
Bit 3 kann man nur lesen und nicht setzen. Gibt einen Hinweis wenns es mim Takt ein Problem gab, aber näheres im Datenblatt (genau kann ich mich nicht mehr erinnern was das im Detail angibt / macht)


Probier doch mal aus was passiert wenn Du den Code direkt in die Endlosschleife haust, also so:


btfsc var, 0
bsf PORTB, 0
btfss var, 0
bcf PORTB, 0

btfsc var, 1
bsf PORTB, 1
btfss var, 1
bcf PORTB, 1

btfsc var,2
bsf PORTB, 2
btfss var, 2
bcf PORTB, 2

btfsc var, 3
bsf PORTB, 3
btfss var, 3
bcf PORTB, 3

btfsc var, 4
bsf PORTB, 4
btfss var, 4
bcf PORTB, 4

btfsc var, 5
bsf PORTB, 5
btfss var, 5
bcf PORTB, 5

btfsc var, 6
bsf PORTB, 6
btfss var, 6
bcf PORTB, 6

btfsc var, 7
bsf PORTB, 7
btfss var, 7
bcf PORTB, 7



mfg
Benny

kante23
13.12.2007, 03:03
Hey auch dir danke.
hab meinen Fehler (wenigstens in diesem Code) mitlerweile schon gefunden. Müsste eigentlich jedem aufmerksamen leser aufgefallen sein (ich bin gemein ich weis).
Lag an der Zeile "movlw ANSEL". Ist natürlich klar das das nicht funktionieren kann. Muss "movwf ANSEL" heißen. ](*,)
Nun werd ich Bottem-up programmieren und hoffen den Controller irgendwann "im Griff" zu haben.
Deinen Hinweis zum MCLR hab ich nicht ganz verstanden. Hatte bisher aber auch noch keine Probleme damit (benutze Brenner5 von sprut).
Die Taktfrequenz sollte bei 31,5 MHz liegen, damit ich (als ich die LEDs noch blinken ließ) auch was sehe (und nicht nur ein flimmern)
Gute Nacht Kante

HF SHOOTER
13.12.2007, 16:29
Hi,

ohh stimmt bei sehr genauem lesen wäre mir das auch aufgefallen ;-)

Das steht im DB zu den Oszillatoreinstellungen:

bit 6-4 IRCF<2:0>: Internal RC Oscillator Frequency Select bits
000 = 31.25 kHz
001 = 125 kHz
010 = 250 kHz
011 = 500 kHz
100 = 1 MHz
101 = 2 MHz
110 = 4 MHz
111 = 8 MHz

D.h. das dein PIC mit 31,25 kHz läuft.

Bei einem normalen Programmiervorgang wird die Betriebsspannung angelegt, der PIC fängt dann an das Programm abzuarbeiten, dann kommt ein Reset damit der Programmzähler bei 0x00 anfängt, dann kommen die Programmierdaten.
Wenn MCLR als Reseteingang deaktiviert wurde kann es möglich sein das dieser Reset vorm Programmieren nicht erfolgt, d.h. der Programmcode der bei der Adresse 0x00 stehen sollte steht jetzt auf 0x20 oder iwo anders. Das meinte ich.

mfg
Benny