PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC - Taktversorgung



robo-sebi
21.12.2007, 21:38
Hallo,

emoment bin ich dabei folgende Schaltung zu basteln:
http://www.sprut.de/electronic/pic/programm/lauflicht/lauflich.htm
(Anstelle eines Keramikresonators nehme ich einen Quarz.)
Kann man bei der Taktversorgung mit einem Quarz auch größere Kondensatoren verwenden als 15pF? Ich habe nur 1mikro Farad- Kondensatoren da.

Gruß,
Sebastian

HF SHOOTER
21.12.2007, 23:03
Nein das ist viel zu groß.

1 µ (mikro) = 0,001 n (nano)
1 n = 0,001 p (piko)

Also wie du siehst ist der 1µF viel zu groß!

mfg
Benny

theborg
22.12.2007, 10:11
also getestet hab ich des mit bis zu 33pF aber da wird es schon problematisch

Siro
22.12.2007, 10:33
lediglich zur Richtigstellung:

1 µF (mikro) = 1000 nF (nano)
1 nF (nano) = 1000 pF (piko)

Je größer die Kondensatoren an deinem Oszillator werden,
desto länger braucht dieser zum Einzuschwingen.
Die Obergrenze von 47pF würde ich nicht überschreiten.
Auf einem Steckbrett lief der PIC sogar ohne die Kondensatoren,
hier kommen die Kapazitäten der Steckkontakte positiv zum tragen.

mfg Siro

HF SHOOTER
22.12.2007, 15:19
Ähm ja klar.

Weiß auch nicht was ich da gestern Abend gedacht habe! ](*,)

mfg
Benny

robo-sebi
27.12.2007, 14:29
Erstmal danke für eure Mühe!

Es funktioniert alles bestens in dem oben genannten Beispiel.
=D>

Doch bei meiner Weiterentwicklung gibt es so einige Probleme.
Ich verwende den PIC16F84A und habe an PortB LEDs mit Widerständen angeschlossen. An PortA.3 (Pin 2) ist ein Taster mit einem 2.7kOhm-Widerstand angeschlossen, der bei Knopfdruck zu PortA.2 (Pin 1) schließt.
Die LEDs sollen leuchten, wenn der Taster gedrückt ist.
Mein Quelltext:

list p=16f84

; Includedatei für den 16F84 einbinden

#include <P16F84A.INC>

; Configuration festlegen
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator

__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
;************************************************* *************

; Variablen festlegen



;************************************************* *********
; los gehts mit der Initialisierung

Init
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'00000000' ; PortB alle output
movwf TRISB
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
clrf PORTB ; alle LEDs ausschalten
movwf PORTB
BCF TRISA,3; PortA,3 wird auf output geschaltet
BSF TRISA,2 ; PortA,2 wird auf input geschaltet
BSF PORTA,3 ; PortA,3 wird auf high gesetzt


; das Folgende ist die Hauptschleife, die endlos durchlaufen wird
Main
call Tastaturbehandlung ; Tastatur abfragen
goto Main2 ; keine Taste gedrückt
Main2
goto Main

Tastaturbehandlung
btfsc PORTA, 2 ; ist RA2 nicht high?
movlw B'00000000' ;dann werden alle LEDs ausgeschaltet
btfss PORTA, 2 ; ist RA2 high?
movlw B'11111111' ;dann werden alle LEDs eingeschaltet
movwf PORTB
return

end
Seltsamerweise gehen die LEDs schon an, wenn ich mein Experimentboard mit der Hand berühre.
Ist da vielleicht ein Wackelkontakt drin? (Das Board ist nagelneu!)

Gruß,
Sebastian

HF SHOOTER
27.12.2007, 14:48
Hi,

ich beziehe mich auf folgenden Code:

Init
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'00000000' ; PortB alle output
movwf TRISB
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
clrf PORTB ; alle LEDs ausschalten
movwf PORTB
BCF TRISA,3; PortA,3 wird auf output geschaltet
BSF TRISA,2 ; PortA,2 wird auf input geschaltet
BSF PORTA,3 ; PortA,3 wird auf high gesetzt

1. TRISA kann nicht beschrieben werden, da du schon vorher auf die Bank 0 zurückwechselst!

2. Ist das Riskant wenn Du keinen Schutzwiderstand zwischen den beiden Pins verbaust, da durch einen Fehler z.B. beide RA2 + RA3 als Ausgang gesetzt und einer davon High, der andere Low und der Kurzschluss ist perfekt.

mfg
Benny

robo-sebi
27.12.2007, 15:24
Hallo,
danke für die Antwort. Ist den folgender Code richtig?


list p=16f84

; Includedatei für den 16F84 einbinden

#include <P16F84A.INC>

; Configuration festlegen
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator

__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
;************************************************* *************

; Variablen festlegen



;************************************************* *********
; los gehts mit der Initialisierung

Init
BCF TRISA,3; PortA,3 wird auf output geschaltet
BSF TRISA,2 ; PortA,2 wird auf input geschaltet
BSF PORTA,3 ; PortA,3 wird auf high gesetzt

bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'00000000' ; PortB alle output
movwf TRISB
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
clrf PORTB ; alle LEDs ausschalten
movwf PORTB


; das Folgende ist die Hauptschleife, die endlos durchlaufen wird
Main
call Tastaturbehandlung ; Tastatur abfragen
goto Main2 ; keine Taste gedrückt
Main2
goto Main

Tastaturbehandlung
bcf STATUS, RP0 ;
btfsc PORTA, 2 ; ist RA2 nicht high?
movlw B'00000000' ;dann werden alle LEDs ausgeschaltet
btfss PORTA, 2 ; ist RA2 high?
movlw B'11111111' ;dann werden alle LEDs eingeschaltet
bsf STATUS, RP0 ; auf Bank 1 umschalten
movwf PORTB
return

end
;************************************************* *********

Gruß,
Sebastian
Edit: Ich habe einen 2,7 kOhm-Widerstand dazwischen. Es liegt wohl doch kein Wackelkontakt vor.

HF SHOOTER
27.12.2007, 15:36
Nein, da haste Du ja dass gleiche Problem. Du willst das TRISA Register beschreiben aber bist noch in Bank 0, das TRISA Register ist aber auf Bank1.


Init:
bsf STATUS,RP0
movlw B'00000100' ; 2 auf Eingang
movwf TRISA
movlw B'00000000' ; alle auf Ausgang
movwf TRISB
bcf STATUS,RP0

clrf PORTB; ; alle LEDs aus
bsf PORTA,3 ; High an RA3

Was das soll kapier ich nicht:

; das Folgende ist die Hauptschleife, die endlos durchlaufen wird
Main
call Tastaturbehandlung ; Tastatur abfragen
goto Main2 ; keine Taste gedrückt
Main2
goto Main

Warum nicht einfach:

; das Folgende ist die Hauptschleife, die endlos durchlaufen wird
Main
call Tastaturbehandlung ; Tastatur abfragen
goto Main ; keine Taste gedrückt

mfg
Benny

robo-sebi
27.12.2007, 15:56
Hallo,

es hat den gleichen Effekt wie mein erstes Skript.

Gruß,
Sebastian

HF SHOOTER
27.12.2007, 16:10
Funktioniets denn nun?


es hat den gleichen Effekt wie mein erstes Skript.
war auf den Code bezogen, oder?

; das Folgende ist die Hauptschleife, die endlos durchlaufen wird
Main
call Tastaturbehandlung ; Tastatur abfragen
goto Main2 ; keine Taste gedrückt
Main2
goto Main

mfg
Benny

robo-sebi
27.12.2007, 20:40
Hallo,

nein es funktioniert nur halbwegs. Wenn jemand in mein Zimmer läuft, gehen schon die LEDs an, obwohl der Taster offen ist. Ich habe irgendwie das Gefühl , dass ich einen Bewegungsmelder gebaut habe.
-> Deswegen kam meine Vermutung mit dem Wackelkontakt.

-> Ich habe mittlerweile schon eine andere Vermutung, die langen Drähte im Experimentboard empfangen wie beim "elektronischen Geisterbeschwörer" Signale. Diese Signale werden durch den PIC verstärkt und zu einem High-Signal. (Das klingt alles zwar sehr komisch, kann aber gut sein, weil er einen ähnlichen Effekt hat.)

-> es war natürlich der Code
Gruß,
Sebastian

HF SHOOTER
27.12.2007, 20:46
Hallo



nein es funktioniert nur halbwegs. Wenn jemand in mein Zimmer läuft, gehen schon die LEDs an, obwohl der Taster offen ist. Ich habe irgendwie das Gefühl , dass ich einen Bewegungsmelder gebaut habe.
-> Deswegen kam meine Vermutung mit dem Wackelkontakt.

Setz noch einen 100k Widerstand als Pull-Down ein, der verbindet GND und RA2.
Dann hat der Eingang stehts einen definierten Pegel, entweder High oder Low.
Ohne dem Pull-Down war es entweder High oder frei in der Luft.

mfg
Benny

robo-sebi
28.12.2007, 14:16
Super!
Es klapppt!
Danke!
mfg
Sebastian